<!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>[213656] 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/213656">213656</a></dd>
<dt>Author</dt> <dd>mrajca@apple.com</dd>
<dt>Date</dt> <dd>2017-03-09 12:47:10 -0800 (Thu, 09 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Let clients control autoplay quirks with website policies.
https://bugs.webkit.org/show_bug.cgi?id=169390

Reviewed by Wenson Hsieh.

Many sites incorrectly assume media will start off playing and display a pause button from the
start. We can trick many of these sites into updating their controls by sending a &quot;pause&quot;
event when we prevent a media element from playing.

We don't want this to become standard web behavior, however, since ultimately sites should adapt
to the new behavior. This patch lets clients decide which limited set of sites gets to use auto-play
quirks.

Source/WebCore:

* html/HTMLMediaElement.cpp:
(WebCore::needsAutoplayPlayPauseEventsQuirk):
* loader/DocumentLoader.h:
(WebCore::DocumentLoader::allowsAutoplayQuirks):
(WebCore::DocumentLoader::setAllowsAutoplayQuirks):

Source/WebKit2:

* Shared/WebsitePolicies.h:
(WebKit::WebsitePolicies::encode):
(WebKit::WebsitePolicies::decode):
* UIProcess/API/APIWebsitePolicies.h:
* UIProcess/API/C/WKWebsitePolicies.cpp:
(WKWebsitePoliciesSetAllowsAutoplayQuirks):
(WKWebsitePoliciesGetAllowsAutoplayQuirks):
* UIProcess/API/C/WKWebsitePolicies.h:
* UIProcess/API/Cocoa/_WKWebsitePolicies.h:
* UIProcess/API/Cocoa/_WKWebsitePolicies.mm:
(-[_WKWebsitePolicies setAllowsAutoplayQuirks:]):
(-[_WKWebsitePolicies allowsAutoplayQuirks]):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updateWebsitePolicies):

Tools:

* TestWebKitAPI/Tests/WebKit2/autoplay-check.html:
* TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:
(-[AutoplayPoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
(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="#trunkSourceWebCoreloaderDocumentLoaderh">trunk/Source/WebCore/loader/DocumentLoader.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedWebsitePoliciesh">trunk/Source/WebKit2/Shared/WebsitePolicies.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIWebsitePoliciesh">trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKWebsitePoliciescpp">trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKWebsitePoliciesh">trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKWebsitePoliciesh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKWebsitePoliciesmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2autoplaycheckhtml">trunk/Tools/TestWebKitAPI/Tests/WebKit2/autoplay-check.html</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2CocoaWebsitePoliciesmm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebCore/ChangeLog        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2017-03-08  Matt Rajca  &lt;mrajca@apple.com&gt;
+
+        Let clients control autoplay quirks with website policies.
+        https://bugs.webkit.org/show_bug.cgi?id=169390
+
+        Reviewed by Wenson Hsieh.
+
+        Added API tests.
+
+        Many sites incorrectly assume media will start off playing and display a pause button from the
+        start. We can trick many of these sites into updating their controls by sending a &quot;pause&quot;
+        event when we prevent a media element from playing.
+
+        We don't want this to become standard web behavior, however, since ultimately sites should adapt
+        to the new behavior. This patch lets clients decide which limited set of sites gets to use auto-play
+        quirks.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::needsAutoplayPlayPauseEventsQuirk):
+        * loader/DocumentLoader.h:
+        (WebCore::DocumentLoader::allowsAutoplayQuirks):
+        (WebCore::DocumentLoader::setAllowsAutoplayQuirks):
+
</ins><span class="cx"> 2017-03-09  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make the VM Traps mechanism non-polling for the DFG and FTL.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -591,8 +591,8 @@
</span><span class="cx">     if (!page || !page-&gt;settings().needsSiteSpecificQuirks())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    String host = document.url().host();
-    return equalLettersIgnoringASCIICase(host, &quot;yahoo.com&quot;) || host.endsWithIgnoringASCIICase(&quot;.yahoo.com&quot;);
</del><ins>+    auto* loader = document.loader();
+    return loader &amp;&amp; loader-&gt;allowsAutoplayQuirks();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static bool needsPlaybackControlsManagerQuirk(Page&amp; page)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentLoader.h (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentLoader.h        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebCore/loader/DocumentLoader.h        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -242,6 +242,9 @@
</span><span class="cx">     AutoplayPolicy autoplayPolicy() const { return m_autoplayPolicy; }
</span><span class="cx">     void setAutoplayPolicy(AutoplayPolicy policy) { m_autoplayPolicy = policy; }
</span><span class="cx"> 
</span><ins>+    bool allowsAutoplayQuirks() const { return m_allowsAutoplayQuirks; }
+    void setAllowsAutoplayQuirks(bool allowsQuirks) { m_allowsAutoplayQuirks = allowsQuirks; }
+
</ins><span class="cx">     void addSubresourceLoader(ResourceLoader*);
</span><span class="cx">     void removeSubresourceLoader(ResourceLoader*);
</span><span class="cx">     void addPlugInStreamLoader(ResourceLoader&amp;);
</span><span class="lines">@@ -472,6 +475,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     bool m_userContentExtensionsEnabled { true };
</span><span class="cx">     AutoplayPolicy m_autoplayPolicy { AutoplayPolicy::Default };
</span><ins>+    bool m_allowsAutoplayQuirks { false };
</ins><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     bool m_hasEverBeenAttached { false };
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/ChangeLog        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2017-03-08  Matt Rajca  &lt;mrajca@apple.com&gt;
+
+        Let clients control autoplay quirks with website policies.
+        https://bugs.webkit.org/show_bug.cgi?id=169390
+
+        Reviewed by Wenson Hsieh.
+        
+        Many sites incorrectly assume media will start off playing and display a pause button from the
+        start. We can trick many of these sites into updating their controls by sending a &quot;pause&quot;
+        event when we prevent a media element from playing.
+
+        We don't want this to become standard web behavior, however, since ultimately sites should adapt
+        to the new behavior. This patch lets clients decide which limited set of sites gets to use auto-play
+        quirks.
+
+        * Shared/WebsitePolicies.h:
+        (WebKit::WebsitePolicies::encode):
+        (WebKit::WebsitePolicies::decode):
+        * UIProcess/API/APIWebsitePolicies.h:
+        * UIProcess/API/C/WKWebsitePolicies.cpp:
+        (WKWebsitePoliciesSetAllowsAutoplayQuirks):
+        (WKWebsitePoliciesGetAllowsAutoplayQuirks):
+        * UIProcess/API/C/WKWebsitePolicies.h:
+        * UIProcess/API/Cocoa/_WKWebsitePolicies.h:
+        * UIProcess/API/Cocoa/_WKWebsitePolicies.mm:
+        (-[_WKWebsitePolicies setAllowsAutoplayQuirks:]):
+        (-[_WKWebsitePolicies allowsAutoplayQuirks]):
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::updateWebsitePolicies):
+
</ins><span class="cx"> 2017-03-09  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Prevent app nap for the active tab
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebsitePoliciesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebsitePolicies.h (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebsitePolicies.h        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/Shared/WebsitePolicies.h        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -37,8 +37,9 @@
</span><span class="cx"> struct WebsitePolicies {
</span><span class="cx"> 
</span><span class="cx">     bool contentBlockersEnabled { true };
</span><ins>+    bool allowsAutoplayQuirks { false };
</ins><span class="cx">     WebsiteAutoplayPolicy autoplayPolicy { WebsiteAutoplayPolicy::Default };
</span><del>-    
</del><ins>+
</ins><span class="cx">     template&lt;class Encoder&gt; void encode(Encoder&amp;) const;
</span><span class="cx">     template&lt;class Decoder&gt; static bool decode(Decoder&amp;, WebsitePolicies&amp;);
</span><span class="cx"> };
</span><span class="lines">@@ -47,6 +48,7 @@
</span><span class="cx"> {
</span><span class="cx">     encoder &lt;&lt; contentBlockersEnabled;
</span><span class="cx">     encoder.encodeEnum(autoplayPolicy);
</span><ins>+    encoder &lt;&lt; allowsAutoplayQuirks;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;class Decoder&gt; bool WebsitePolicies::decode(Decoder&amp; decoder, WebsitePolicies&amp; result)
</span><span class="lines">@@ -55,6 +57,8 @@
</span><span class="cx">         return false;
</span><span class="cx">     if (!decoder.decodeEnum(result.autoplayPolicy))
</span><span class="cx">         return false;
</span><ins>+    if (!decoder.decode(result.allowsAutoplayQuirks))
+        return false;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIWebsitePoliciesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -39,6 +39,9 @@
</span><span class="cx">     bool contentBlockersEnabled() const { return m_websitePolicies.contentBlockersEnabled; }
</span><span class="cx">     void setContentBlockersEnabled(bool enabled) { m_websitePolicies.contentBlockersEnabled = enabled; }
</span><span class="cx"> 
</span><ins>+    bool allowsAutoplayQuirks() const { return m_websitePolicies.allowsAutoplayQuirks; }
+    void setAllowsAutoplayQuirks(bool allowsQuirks) { m_websitePolicies.allowsAutoplayQuirks = allowsQuirks; }
+
</ins><span class="cx">     WebKit::WebsiteAutoplayPolicy autoplayPolicy() const { return m_websitePolicies.autoplayPolicy; }
</span><span class="cx">     void setAutoplayPolicy(WebKit::WebsiteAutoplayPolicy policy) { m_websitePolicies.autoplayPolicy = policy; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKWebsitePoliciescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -52,6 +52,16 @@
</span><span class="cx">     return toImpl(websitePolicies)-&gt;contentBlockersEnabled();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WKWebsitePoliciesSetAllowsAutoplayQuirks(WKWebsitePoliciesRef websitePolicies, bool allowsQuirks)
+{
+    toImpl(websitePolicies)-&gt;setAllowsAutoplayQuirks(allowsQuirks);
+}
+
+bool WKWebsitePoliciesGetAllowsAutoplayQuirks(WKWebsitePoliciesRef websitePolicies)
+{
+    return toImpl(websitePolicies)-&gt;allowsAutoplayQuirks();
+}
+
</ins><span class="cx"> WKWebsiteAutoplayPolicy WKWebsitePoliciesGetAutoplayPolicy(WKWebsitePoliciesRef websitePolicies)
</span><span class="cx"> {
</span><span class="cx">     switch (toImpl(websitePolicies)-&gt;autoplayPolicy()) {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKWebsitePoliciesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -45,6 +45,9 @@
</span><span class="cx"> WK_EXPORT bool WKWebsitePoliciesGetContentBlockersEnabled(WKWebsitePoliciesRef);
</span><span class="cx"> WK_EXPORT void WKWebsitePoliciesSetContentBlockersEnabled(WKWebsitePoliciesRef, bool);
</span><span class="cx"> 
</span><ins>+WK_EXPORT bool WKWebsitePoliciesGetAllowsAutoplayQuirks(WKWebsitePoliciesRef);
+WK_EXPORT void WKWebsitePoliciesSetAllowsAutoplayQuirks(WKWebsitePoliciesRef, bool);
+
</ins><span class="cx"> WK_EXPORT WKWebsiteAutoplayPolicy WKWebsitePoliciesGetAutoplayPolicy(WKWebsitePoliciesRef);
</span><span class="cx"> WK_EXPORT void WKWebsitePoliciesSetAutoplayPolicy(WKWebsitePoliciesRef, WKWebsiteAutoplayPolicy);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKWebsitePoliciesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> @interface _WKWebsitePolicies : NSObject
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic) BOOL contentBlockersEnabled;
</span><ins>+@property (nonatomic) BOOL allowsAutoplayQuirks;
</ins><span class="cx"> @property (nonatomic) _WKWebsiteAutoplayPolicy autoplayPolicy;
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKWebsitePoliciesmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -57,6 +57,16 @@
</span><span class="cx">     return _websitePolicies-&gt;contentBlockersEnabled();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)setAllowsAutoplayQuirks:(BOOL)allowsQuirks
+{
+    _websitePolicies-&gt;setAllowsAutoplayQuirks(allowsQuirks);
+}
+
+- (BOOL)allowsAutoplayQuirks
+{
+    return _websitePolicies-&gt;allowsAutoplayQuirks();
+}
+
</ins><span class="cx"> - (void)setAutoplayPolicy:(_WKWebsiteAutoplayPolicy)policy
</span><span class="cx"> {
</span><span class="cx">     switch (policy) {
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -817,6 +817,8 @@
</span><span class="cx">     if (documentLoader-&gt;userContentExtensionsEnabled())
</span><span class="cx">         documentLoader-&gt;setUserContentExtensionsEnabled(websitePolicies.contentBlockersEnabled);
</span><span class="cx"> 
</span><ins>+    documentLoader-&gt;setAllowsAutoplayQuirks(websitePolicies.allowsAutoplayQuirks);
+
</ins><span class="cx">     switch (websitePolicies.autoplayPolicy) {
</span><span class="cx">     case WebsiteAutoplayPolicy::Default:
</span><span class="cx">         documentLoader-&gt;setAutoplayPolicy(AutoplayPolicy::Default);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -5460,6 +5460,8 @@
</span><span class="cx">     if (!documentLoader)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    documentLoader-&gt;setAllowsAutoplayQuirks(websitePolicies.allowsAutoplayQuirks);
+
</ins><span class="cx">     switch (websitePolicies.autoplayPolicy) {
</span><span class="cx">     case WebsiteAutoplayPolicy::Default:
</span><span class="cx">         documentLoader-&gt;setAutoplayPolicy(AutoplayPolicy::Default);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Tools/ChangeLog        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2017-03-08  Matt Rajca  &lt;mrajca@apple.com&gt;
+
+        Let clients control autoplay quirks with website policies.
+        https://bugs.webkit.org/show_bug.cgi?id=169390
+
+        Reviewed by Wenson Hsieh.
+
+        * TestWebKitAPI/Tests/WebKit2/autoplay-check.html:
+        * TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:
+        (-[AutoplayPoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
+        (TEST):
+
</ins><span class="cx"> 2017-03-09  Devin Rousso  &lt;dcrousso+webkit@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, change my status to be a WebKit reviewer
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2autoplaycheckhtml"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/autoplay-check.html (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/autoplay-check.html        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/autoplay-check.html        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -12,9 +12,15 @@
</span><span class="cx">                     } catch(e) { }
</span><span class="cx">                 });
</span><span class="cx">             }
</span><ins>+
+            function videoDidPause() {
+                try {
+                    window.webkit.messageHandlers.testHandler.postMessage(&quot;on-pause&quot;);
+                } catch(e) { }
+            }
</ins><span class="cx">         &lt;/script&gt;
</span><span class="cx">     &lt;/head&gt;
</span><span class="cx">     &lt;body onload=&quot;playVideo()&quot;&gt;
</span><del>-        &lt;video id=&quot;video&quot; playsinline src=&quot;test.mp4&quot; /&gt;
</del><ins>+        &lt;video id=&quot;video&quot; onpause=videoDidPause() playsinline src=&quot;test.mp4&quot; /&gt;
</ins><span class="cx">     &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2CocoaWebsitePoliciesmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm (213655 => 213656)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm        2017-03-09 20:35:10 UTC (rev 213655)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm        2017-03-09 20:47:10 UTC (rev 213656)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #import &quot;PlatformUtilities.h&quot;
</span><span class="cx"> #import &quot;TestWKWebView.h&quot;
</span><span class="cx"> #import &lt;WebKit/WKPagePrivate.h&gt;
</span><ins>+#import &lt;WebKit/WKPreferencesRefPrivate.h&gt;
</ins><span class="cx"> #import &lt;WebKit/WKUserContentControllerPrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKWebViewPrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/_WKUserContentExtensionStorePrivate.h&gt;
</span><span class="lines">@@ -165,6 +166,7 @@
</span><span class="cx"> 
</span><span class="cx"> @interface AutoplayPoliciesDelegate : NSObject &lt;WKNavigationDelegate, WKUIDelegate&gt;
</span><span class="cx"> @property (nonatomic, copy) _WKWebsiteAutoplayPolicy(^autoplayPolicyForURL)(NSURL *);
</span><ins>+@property (nonatomic) BOOL allowsAutoplayQuirks;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @implementation AutoplayPoliciesDelegate
</span><span class="lines">@@ -179,6 +181,7 @@
</span><span class="cx"> - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
</span><span class="cx"> {
</span><span class="cx">     _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
</span><ins>+    websitePolicies.allowsAutoplayQuirks = _allowsAutoplayQuirks;
</ins><span class="cx">     if (_autoplayPolicyForURL)
</span><span class="cx">         websitePolicies.autoplayPolicy = _autoplayPolicyForURL(navigationAction.request.URL);
</span><span class="cx">     decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
</span><span class="lines">@@ -437,6 +440,29 @@
</span><span class="cx">     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@&quot;about:blank&quot;]]];
</span><span class="cx">     runUntilReceivesAutoplayEvent(kWKAutoplayEventUserNeverPlayedMediaPreventedFromPlaying);
</span><span class="cx"> }
</span><ins>+
+TEST(WebKit2, WebsitePoliciesAutoplayQuirks)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    auto delegate = adoptNS([[AutoplayPoliciesDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
+
+    WKRetainPtr&lt;WKPreferencesRef&gt; preferences(AdoptWK, WKPreferencesCreate());
+    WKPreferencesSetNeedsSiteSpecificQuirks(preferences.get(), true);
+    WKPageGroupSetPreferences(WKPageGetPageGroup([webView _pageForTesting]), preferences.get());
+
+    NSURLRequest *requestWithAudio = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@&quot;autoplay-check&quot; withExtension:@&quot;html&quot; subdirectory:@&quot;TestWebKitAPI.resources&quot;]];
+
+    [delegate setAllowsAutoplayQuirks:YES];
+    [delegate setAutoplayPolicyForURL:^(NSURL *) {
+        return _WKWebsiteAutoplayPolicyDeny;
+    }];
+    [webView loadRequest:requestWithAudio];
+    [webView waitForMessage:@&quot;did-not-play&quot;];
+    [webView waitForMessage:@&quot;on-pause&quot;];
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>