<!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>[214532] 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/214532">214532</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-03-29 02:39:41 -0700 (Wed, 29 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[mac-wk1] LayoutTest media/modern-media-controls/airplay-button/airplay-button.html is a flaky timeout
https://bugs.webkit.org/show_bug.cgi?id=168409
&lt;rdar://problem/30799198&gt;

Patch by Antoine Quint &lt;graouts@apple.com&gt; on 2017-03-29
Reviewed by Dean Jackson.

Source/WebCore:

Add a new internals setting to opt into ScriptedAnimationController logging through DOM events dispatched
through the document. This should allow this flaky test to get information as to why the frame isn't
firing when it times out.

* dom/ScriptedAnimationController.cpp:
(WebCore::ScriptedAnimationController::suspend):
(WebCore::ScriptedAnimationController::resume):
(WebCore::ScriptedAnimationController::addThrottlingReason):
(WebCore::ScriptedAnimationController::removeThrottlingReason):
(WebCore::ScriptedAnimationController::registerCallback):
(WebCore::ScriptedAnimationController::cancelCallback):
(WebCore::ScriptedAnimationController::serviceScriptedAnimations):
(WebCore::ScriptedAnimationController::scheduleAnimation):
(WebCore::ScriptedAnimationController::dispatchLoggingEventIfRequired):
* dom/ScriptedAnimationController.h:
* page/Settings.in:
* testing/InternalSettings.cpp:
(WebCore::InternalSettings::resetToConsistentState):
(WebCore::InternalSettings::shouldDispatchRequestAnimationFrameEvents):
(WebCore::InternalSettings::setShouldDispatchRequestAnimationFrameEvents):
* testing/InternalSettings.h:
* testing/InternalSettings.idl:

LayoutTests:

Opt into ScriptedAnimationController logging.

* media/modern-media-controls/airplay-button/airplay-button-expected.txt:
* media/modern-media-controls/airplay-button/airplay-button.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsmediamodernmediacontrolsairplaybuttonairplaybuttonexpectedtxt">trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamodernmediacontrolsairplaybuttonairplaybuttonhtml">trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomScriptedAnimationControllercpp">trunk/Source/WebCore/dom/ScriptedAnimationController.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptedAnimationControllerh">trunk/Source/WebCore/dom/ScriptedAnimationController.h</a></li>
<li><a href="#trunkSourceWebCorepageSettingsin">trunk/Source/WebCore/page/Settings.in</a></li>
<li><a href="#trunkSourceWebCoretestingInternalSettingscpp">trunk/Source/WebCore/testing/InternalSettings.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalSettingsh">trunk/Source/WebCore/testing/InternalSettings.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalSettingsidl">trunk/Source/WebCore/testing/InternalSettings.idl</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/LayoutTests/ChangeLog        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-03-29  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        [mac-wk1] LayoutTest media/modern-media-controls/airplay-button/airplay-button.html is a flaky timeout
+        https://bugs.webkit.org/show_bug.cgi?id=168409
+        &lt;rdar://problem/30799198&gt;
+
+        Reviewed by Dean Jackson.
+
+        Opt into ScriptedAnimationController logging.
+
+        * media/modern-media-controls/airplay-button/airplay-button-expected.txt:
+        * media/modern-media-controls/airplay-button/airplay-button.html:
+
</ins><span class="cx"> 2017-03-28  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebRTC] After r214441 addIceCandidate no longer accepts an RTCIceCandidateInit dictionary
</span></span></pre></div>
<a id="trunkLayoutTestsmediamodernmediacontrolsairplaybuttonairplaybuttonexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -3,8 +3,19 @@
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+PASS airplayButton.element.localName is &quot;button&quot;
+PASS airplayButton.element.classList.contains(&quot;icon&quot;) is true
+PASS airplayButton.element.classList.contains(&quot;airplay&quot;) is true
+PASS airplayButton.iconName is Icons.Airplay
+PASS airplayButton.width is 0
+PASS airplayButton.height is 0
+PASS airplayButton._image is iconService.imageForIconNameAndLayoutTraits(Icons.Airplay.name, LayoutTraits.macOS)
+PASS airplayButton._image.src is not &quot;&quot;
+PASS airplayButton._image.complete is false
</ins><span class="cx"> scheduleLayout() - start
</span><span class="cx"> _requestFrameIfNeeded()
</span><ins>+[ScriptedAnimationController] raf-register-callback
+[ScriptedAnimationController] raf-schedule-animation
</ins><span class="cx"> _requestFrameIfNeeded() - registered rAF, _frameID = 1
</span><span class="cx"> scheduleLayout() - _layoutCallbacks.size = 1
</span><span class="cx"> scheduleLayout() - end
</span><span class="lines">@@ -18,15 +29,6 @@
</span><span class="cx"> _requestFrameIfNeeded() - failed to register rAF call, _frameID = 1, _layoutCallbacks.size = 1
</span><span class="cx"> scheduleLayout() - _layoutCallbacks.size = 1
</span><span class="cx"> scheduleLayout() - end
</span><del>-PASS airplayButton.element.localName is &quot;button&quot;
-PASS airplayButton.element.classList.contains(&quot;icon&quot;) is true
-PASS airplayButton.element.classList.contains(&quot;airplay&quot;) is true
-PASS airplayButton.iconName is Icons.Airplay
-FAIL airplayButton.width should be 0. Was 25.
-FAIL airplayButton.height should be 0. Was 22.
-PASS airplayButton._image is iconService.imageForIconNameAndLayoutTraits(Icons.Airplay.name, LayoutTraits.macOS)
-PASS airplayButton._image.src is not &quot;&quot;
-FAIL airplayButton._image.complete should be false. Was true.
</del><span class="cx"> PASS airplayButton.width is not 0
</span><span class="cx"> PASS airplayButton.height is not 0
</span><span class="cx"> PASS airplayButton.needsLayout is true
</span><span class="lines">@@ -34,6 +36,9 @@
</span><span class="cx"> PASS scheduler._layoutCallbacks.size is 1
</span><span class="cx"> PASS scheduler._frameID is not -1
</span><span class="cx"> PASS dirtyNodes.has(airplayButton) is true
</span><ins>+PASS airplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay@&quot;) became true
+[ScriptedAnimationController] raf-service-scripted-animations
+[ScriptedAnimationController] raf-will-fire
</ins><span class="cx"> _frameDidFire() - start
</span><span class="cx"> frameWillFire()
</span><span class="cx"> PASS dirtyNodes.has(airplayButton) is true
</span><span class="lines">@@ -48,7 +53,7 @@
</span><span class="cx"> PASS airplayButton.needsLayout is false
</span><span class="cx"> PASS airplayButton.element.getAttribute('aria-label') is &quot;AirPlay&quot;
</span><span class="cx"> _frameDidFire() - end
</span><del>-PASS airplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay@&quot;) became true
</del><ins>+[ScriptedAnimationController] raf-did-fire
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsmediamodernmediacontrolsairplaybuttonairplaybuttonhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -5,11 +5,34 @@
</span><span class="cx"> &lt;body&gt;
</span><span class="cx"> &lt;script type=&quot;text/javascript&quot;&gt;
</span><span class="cx"> 
</span><ins>+let reachedEndOfTest = false;
+let receivedRAFDidFireEvent = false;
+
</ins><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> scheduler.debug = debug;
</span><span class="cx"> 
</span><span class="cx"> description(&quot;Testing the &lt;code&gt;AirplayButton&lt;/code&gt; class.&quot;);
</span><span class="cx"> 
</span><ins>+if (window.internals) {
+    [&quot;raf-suspend&quot;, &quot;raf-resume&quot;, &quot;raf-add-throttling-reason&quot;, &quot;raf-remove-throttling-reason&quot;, &quot;raf-register-callback&quot;, &quot;raf-cancel-callback&quot;, &quot;raf-did-cancel-callback&quot;, &quot;raf-service-scripted-animations&quot;, &quot;raf-will-fire&quot;, &quot;raf-did-fire&quot;, &quot;raf-schedule-animation&quot;, &quot;raf-schedule-animation-display-refresh-monitor&quot;, &quot;raf-schedule-animation-timer&quot;, &quot;raf-schedule-animation-frame-view&quot;].forEach(eventType =&gt; document.addEventListener(eventType, handleRAFEvent));
+    window.internals.settings.setShouldDispatchRequestAnimationFrameEvents(true);
+}
+
+function handleRAFEvent(event)
+{
+    debug(`[ScriptedAnimationController] ${event.type}`);
+    if (event.type === &quot;raf-did-fire&quot;) {
+        receivedRAFDidFireEvent = true;
+        considerFinishingTest();
+    }
+}
+
+function considerFinishingTest()
+{
+    if (reachedEndOfTest &amp;&amp; receivedRAFDidFireEvent)
+        finishJSTest();
+}
+
</ins><span class="cx"> const airplayButton = new AirplayButton({ layoutTraits: LayoutTraits.macOS });
</span><span class="cx"> 
</span><span class="cx"> shouldBeEqualToString(&quot;airplayButton.element.localName&quot;, &quot;button&quot;);
</span><span class="lines">@@ -44,7 +67,10 @@
</span><span class="cx">         shouldBeFalse(&quot;airplayButton.needsLayout&quot;);
</span><span class="cx">         shouldBeEqualToString(&quot;airplayButton.element.getAttribute('aria-label')&quot;, &quot;AirPlay&quot;);
</span><span class="cx">     }
</span><del>-    shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay@&quot;)', &quot;true&quot;, finishJSTest);
</del><ins>+    shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay@&quot;)', &quot;true&quot;, () =&gt; {
+        reachedEndOfTest = true;
+        considerFinishingTest();
+    });
</ins><span class="cx">     // shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay@&quot;)', &quot;true&quot;, () =&gt; {
</span><span class="cx">     //     shouldBecomeEqual('macOSFullscreenAirplayButton.element.style.webkitMaskImage.includes(&quot;macOS/airplay-fullscreen@&quot;)', &quot;true&quot;, () =&gt; {
</span><span class="cx">     //         shouldBecomeEqual('iOSAirplayButton.element.style.webkitMaskImage.includes(&quot;iOS/airplay@&quot;)', &quot;true&quot;, finishJSTest);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/ChangeLog        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2017-03-29  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        [mac-wk1] LayoutTest media/modern-media-controls/airplay-button/airplay-button.html is a flaky timeout
+        https://bugs.webkit.org/show_bug.cgi?id=168409
+        &lt;rdar://problem/30799198&gt;
+
+        Reviewed by Dean Jackson.
+
+        Add a new internals setting to opt into ScriptedAnimationController logging through DOM events dispatched
+        through the document. This should allow this flaky test to get information as to why the frame isn't
+        firing when it times out.
+
+        * dom/ScriptedAnimationController.cpp:
+        (WebCore::ScriptedAnimationController::suspend):
+        (WebCore::ScriptedAnimationController::resume):
+        (WebCore::ScriptedAnimationController::addThrottlingReason):
+        (WebCore::ScriptedAnimationController::removeThrottlingReason):
+        (WebCore::ScriptedAnimationController::registerCallback):
+        (WebCore::ScriptedAnimationController::cancelCallback):
+        (WebCore::ScriptedAnimationController::serviceScriptedAnimations):
+        (WebCore::ScriptedAnimationController::scheduleAnimation):
+        (WebCore::ScriptedAnimationController::dispatchLoggingEventIfRequired):
+        * dom/ScriptedAnimationController.h:
+        * page/Settings.in:
+        * testing/InternalSettings.cpp:
+        (WebCore::InternalSettings::resetToConsistentState):
+        (WebCore::InternalSettings::shouldDispatchRequestAnimationFrameEvents):
+        (WebCore::InternalSettings::setShouldDispatchRequestAnimationFrameEvents):
+        * testing/InternalSettings.h:
+        * testing/InternalSettings.idl:
+
</ins><span class="cx"> 2017-03-28  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebRTC] After r214441 addIceCandidate no longer accepts an RTCIceCandidateInit dictionary
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptedAnimationControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptedAnimationController.cpp (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptedAnimationController.cpp        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/dom/ScriptedAnimationController.cpp        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -81,11 +81,13 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptedAnimationController::suspend()
</span><span class="cx"> {
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-suspend&quot;);
</ins><span class="cx">     ++m_suspendCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScriptedAnimationController::resume()
</span><span class="cx"> {
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-resume&quot;);
</ins><span class="cx">     // It would be nice to put an ASSERT(m_suspendCount &gt; 0) here, but in WK1 resume() can be called
</span><span class="cx">     // even when suspend hasn't (if a tab was created in the background).
</span><span class="cx">     if (m_suspendCount &gt; 0)
</span><span class="lines">@@ -134,6 +136,7 @@
</span><span class="cx">     m_throttlingReasons |= reason;
</span><span class="cx"> 
</span><span class="cx">     RELEASE_LOG_IF_ALLOWED(&quot;addThrottlingReason(%s) -&gt; %s&quot;, throttlingReasonToString(reason), throttlingReasonsToString(m_throttlingReasons).utf8().data());
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-add-throttling-reason&quot;);
</ins><span class="cx"> 
</span><span class="cx">     if (m_animationTimer.isActive()) {
</span><span class="cx">         m_animationTimer.stop();
</span><span class="lines">@@ -153,6 +156,7 @@
</span><span class="cx">     m_throttlingReasons -= reason;
</span><span class="cx"> 
</span><span class="cx">     RELEASE_LOG_IF_ALLOWED(&quot;removeThrottlingReason(%s) -&gt; %s&quot;, throttlingReasonToString(reason), throttlingReasonsToString(m_throttlingReasons).utf8().data());
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-remove-throttling-reason&quot;);
</ins><span class="cx"> 
</span><span class="cx">     if (m_animationTimer.isActive()) {
</span><span class="cx">         m_animationTimer.stop();
</span><span class="lines">@@ -180,6 +184,7 @@
</span><span class="cx">     m_callbacks.append(WTFMove(callback));
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentation::didRequestAnimationFrame(m_document, id);
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-register-callback&quot;);
</ins><span class="cx"> 
</span><span class="cx">     if (!m_suspendCount)
</span><span class="cx">         scheduleAnimation();
</span><span class="lines">@@ -188,11 +193,13 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptedAnimationController::cancelCallback(CallbackId id)
</span><span class="cx"> {
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-cancel-callback&quot;);
</ins><span class="cx">     for (size_t i = 0; i &lt; m_callbacks.size(); ++i) {
</span><span class="cx">         if (m_callbacks[i]-&gt;m_id == id) {
</span><span class="cx">             m_callbacks[i]-&gt;m_firedOrCancelled = true;
</span><span class="cx">             InspectorInstrumentation::didCancelAnimationFrame(m_document, id);
</span><span class="cx">             m_callbacks.remove(i);
</span><ins>+            dispatchLoggingEventIfRequired(&quot;raf-did-cancel-callback&quot;);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -200,6 +207,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptedAnimationController::serviceScriptedAnimations(double timestamp)
</span><span class="cx"> {
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-service-scripted-animations&quot;);
</ins><span class="cx">     if (!m_callbacks.size() || m_suspendCount || !requestAnimationFrameEnabled())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -220,11 +228,13 @@
</span><span class="cx">         if (!callback-&gt;m_firedOrCancelled) {
</span><span class="cx">             callback-&gt;m_firedOrCancelled = true;
</span><span class="cx">             InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback-&gt;m_id);
</span><ins>+            dispatchLoggingEventIfRequired(&quot;raf-will-fire&quot;);
</ins><span class="cx">             if (callback-&gt;m_useLegacyTimeBase)
</span><span class="cx">                 callback-&gt;handleEvent(legacyHighResNowMs);
</span><span class="cx">             else
</span><span class="cx">                 callback-&gt;handleEvent(highResNowMs);
</span><span class="cx">             InspectorInstrumentation::didFireAnimationFrame(cookie);
</span><ins>+            dispatchLoggingEventIfRequired(&quot;raf-did-fire&quot;);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -270,6 +280,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptedAnimationController::scheduleAnimation()
</span><span class="cx"> {
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-schedule-animation&quot;);
</ins><span class="cx">     if (!requestAnimationFrameEnabled())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -280,6 +291,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         m_isUsingTimer = true;
</span><ins>+        dispatchLoggingEventIfRequired(&quot;raf-schedule-animation-display-refresh-monitor&quot;);
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx">     if (m_animationTimer.isActive())
</span><span class="lines">@@ -288,9 +300,11 @@
</span><span class="cx">     Seconds animationInterval = interval();
</span><span class="cx">     double scheduleDelay = std::max&lt;double&gt;(animationInterval.value() - (m_document-&gt;domWindow()-&gt;nowTimestamp() - m_lastAnimationFrameTimestamp), 0);
</span><span class="cx">     m_animationTimer.startOneShot(scheduleDelay);
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-schedule-animation-timer&quot;);
</ins><span class="cx"> #else
</span><span class="cx">     if (FrameView* frameView = m_document-&gt;view())
</span><span class="cx">         frameView-&gt;scheduleAnimation();
</span><ins>+    dispatchLoggingEventIfRequired(&quot;raf-schedule-animation-frame-view&quot;);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -322,4 +336,10 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void ScriptedAnimationController::dispatchLoggingEventIfRequired(const AtomicString&amp; type)
+{
+    if (m_document &amp;&amp; m_document-&gt;frame() &amp;&amp; m_document-&gt;frame()-&gt;settings().shouldDispatchRequestAnimationFrameEvents())
+        m_document-&gt;dispatchEvent(Event::create(type, false, false));
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoredomScriptedAnimationControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptedAnimationController.h (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptedAnimationController.h        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/dom/ScriptedAnimationController.h        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><ins>+#include &lt;wtf/text/AtomicString.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if USE(REQUEST_ANIMATION_FRAME_TIMER)
</span><span class="cx"> #include &quot;Timer.h&quot;
</span><span class="lines">@@ -96,6 +97,7 @@
</span><span class="cx">     int m_suspendCount { 0 };
</span><span class="cx"> 
</span><span class="cx">     void scheduleAnimation();
</span><ins>+    void dispatchLoggingEventIfRequired(const AtomicString&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #if USE(REQUEST_ANIMATION_FRAME_TIMER)
</span><span class="cx">     void animationTimerFired();
</span></span></pre></div>
<a id="trunkSourceWebCorepageSettingsin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Settings.in (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Settings.in        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/page/Settings.in        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -274,6 +274,8 @@
</span><span class="cx"> 
</span><span class="cx"> inputEventsEnabled initial=true
</span><span class="cx"> 
</span><ins>+shouldDispatchRequestAnimationFrameEvents initial=false
+
</ins><span class="cx"> quickTimePluginReplacementEnabled initial=defaultQuickTimePluginReplacementEnabled
</span><span class="cx"> youTubeFlashPluginReplacementEnabled initial=defaultYouTubeFlashPluginReplacementEnabled
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/InternalSettings.cpp (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/InternalSettings.cpp        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/testing/InternalSettings.cpp        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -253,6 +253,8 @@
</span><span class="cx">     m_page-&gt;mainFrame().setPageAndTextZoomFactors(1, 1);
</span><span class="cx">     m_page-&gt;setCanStartMedia(true);
</span><span class="cx"> 
</span><ins>+    settings().setShouldDispatchRequestAnimationFrameEvents(false);
+
</ins><span class="cx">     settings().setForcePendingWebGLPolicy(false);
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     settings().setAllowsAirPlayForMediaPlayback(false);
</span><span class="lines">@@ -709,6 +711,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool InternalSettings::shouldDispatchRequestAnimationFrameEvents()
+{
+    return settings().shouldDispatchRequestAnimationFrameEvents();
+}
+
+void InternalSettings::setShouldDispatchRequestAnimationFrameEvents(bool shouldDispatchRequestAnimationFrameEvents)
+{
+    settings().setShouldDispatchRequestAnimationFrameEvents(shouldDispatchRequestAnimationFrameEvents);
+}
+
</ins><span class="cx"> ExceptionOr&lt;String&gt; InternalSettings::userInterfaceDirectionPolicy()
</span><span class="cx"> {
</span><span class="cx">     if (!m_page)
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalSettingsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/InternalSettings.h (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/InternalSettings.h        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/testing/InternalSettings.h        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -109,6 +109,9 @@
</span><span class="cx">     ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue() const;
</span><span class="cx">     void setForcedPrefersReducedMotionAccessibilityValue(ForcedAccessibilityValue);
</span><span class="cx"> 
</span><ins>+    bool shouldDispatchRequestAnimationFrameEvents();
+    void setShouldDispatchRequestAnimationFrameEvents(bool);
+
</ins><span class="cx">     // RuntimeEnabledFeatures.
</span><span class="cx">     static void setIndexedDBWorkersEnabled(bool);
</span><span class="cx">     static void setCSSGridLayoutEnabled(bool);
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalSettingsidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/InternalSettings.idl (214531 => 214532)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/InternalSettings.idl        2017-03-29 06:15:23 UTC (rev 214531)
+++ trunk/Source/WebCore/testing/InternalSettings.idl        2017-03-29 09:39:41 UTC (rev 214532)
</span><span class="lines">@@ -96,6 +96,9 @@
</span><span class="cx">     [MayThrowException] boolean deferredCSSParserEnabled();
</span><span class="cx">     [MayThrowException] void setDeferredCSSParserEnabled(boolean enabled);
</span><span class="cx"> 
</span><ins>+    boolean shouldDispatchRequestAnimationFrameEvents();
+    void setShouldDispatchRequestAnimationFrameEvents(boolean shouldDispatchRequestAnimationFrameEvents);
+
</ins><span class="cx">     attribute ForcedAccessibilityValue forcedColorsAreInvertedAccessibilityValue;
</span><span class="cx">     attribute ForcedAccessibilityValue forcedDisplayIsMonochromeAccessibilityValue;
</span><span class="cx">     attribute ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue;
</span></span></pre>
</div>
</div>

</body>
</html>