<!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>[238394] trunk/Source/WebKit</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/238394">238394</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2018-11-20 01:02:25 -0800 (Tue, 20 Nov 2018)</dd>
</dl>

<h3>Log Message</h3>
<pre>Avoid potential longer than expected layer flush delays
https://bugs.webkit.org/show_bug.cgi?id=191833

Reviewed by Dean Jackson.

Layer flush throttling also stops style recalcs and layouts. Layouts schedule layer flushes. Especially
on a slow network we can in principle end up in situation where layer flush timer fires but there is no
flush scheduled and so nothing happens. However there is a pending style recalc or layout that would
actually schedule a flush (in practice various things force style recalcs and this doesn't occur
commonly).

To avoid this we should flush unconditionally when the flush timer fires. This performs any pending
style recalc and layout too. If there is nothing to do the flush will be cheap.

PLT doesn't appear to hit cases affected by this patch and there shouldn't be any impact.

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:

Remove now unnecessary m_hasPendingFlush bit, simplifying the logic.

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::setLayerTreeStateIsFrozen):

Schedule unconditionally when unfreezing.

(WebKit::TiledCoreAnimationDrawingArea::scheduleCompositingLayerFlush):

Remove branch that starts the flush timer. It is not needed as either it was already running
or immediate flush is already scheduled and will start the timer anyway.

(WebKit::TiledCoreAnimationDrawingArea::flushLayers):
(WebKit::TiledCoreAnimationDrawingArea::adjustLayerFlushThrottling):
(WebKit::TiledCoreAnimationDrawingArea::layerFlushThrottlingTimerFired):

Flush unconditionally.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPagemacTiledCoreAnimationDrawingAreah">trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPagemacTiledCoreAnimationDrawingAreamm">trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (238393 => 238394)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2018-11-20 08:53:57 UTC (rev 238393)
+++ trunk/Source/WebKit/ChangeLog       2018-11-20 09:02:25 UTC (rev 238394)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2018-11-20  Antti Koivisto  <antti@apple.com>
+
+        Avoid potential longer than expected layer flush delays
+        https://bugs.webkit.org/show_bug.cgi?id=191833
+
+        Reviewed by Dean Jackson.
+
+        Layer flush throttling also stops style recalcs and layouts. Layouts schedule layer flushes. Especially
+        on a slow network we can in principle end up in situation where layer flush timer fires but there is no
+        flush scheduled and so nothing happens. However there is a pending style recalc or layout that would
+        actually schedule a flush (in practice various things force style recalcs and this doesn't occur
+        commonly).
+
+        To avoid this we should flush unconditionally when the flush timer fires. This performs any pending
+        style recalc and layout too. If there is nothing to do the flush will be cheap.
+
+        PLT doesn't appear to hit cases affected by this patch and there shouldn't be any impact.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+
+        Remove now unnecessary m_hasPendingFlush bit, simplifying the logic.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::setLayerTreeStateIsFrozen):
+
+        Schedule unconditionally when unfreezing.
+
+        (WebKit::TiledCoreAnimationDrawingArea::scheduleCompositingLayerFlush):
+
+        Remove branch that starts the flush timer. It is not needed as either it was already running
+        or immediate flush is already scheduled and will start the timer anyway.
+
+        (WebKit::TiledCoreAnimationDrawingArea::flushLayers):
+        (WebKit::TiledCoreAnimationDrawingArea::adjustLayerFlushThrottling):
+        (WebKit::TiledCoreAnimationDrawingArea::layerFlushThrottlingTimerFired):
+
+        Flush unconditionally.
+
</ins><span class="cx"> 2018-11-19  Don Olmstead  <don.olmstead@sony.com>
</span><span class="cx"> 
</span><span class="cx">         Simplify platform check in WebEditorClient
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPagemacTiledCoreAnimationDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (238393 => 238394)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h       2018-11-20 08:53:57 UTC (rev 238393)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h  2018-11-20 09:02:25 UTC (rev 238394)
</span><span class="lines">@@ -177,7 +177,6 @@
</span><span class="cx"> 
</span><span class="cx">     bool m_isThrottlingLayerFlushes { false };
</span><span class="cx">     bool m_isLayerFlushThrottlingTemporarilyDisabledForInteraction { false };
</span><del>-    bool m_hasPendingFlush { false };
</del><span class="cx"> 
</span><span class="cx">     WebCore::Timer m_layerFlushThrottlingTimer;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPagemacTiledCoreAnimationDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (238393 => 238394)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm      2018-11-20 08:53:57 UTC (rev 238393)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2018-11-20 09:02:25 UTC (rev 238394)
</span><span class="lines">@@ -180,8 +180,7 @@
</span><span class="cx">         m_layerFlushThrottlingTimer.stop();
</span><span class="cx">     } else {
</span><span class="cx">         // Immediate flush as any delay in unfreezing can result in flashes.
</span><del>-        if (m_hasPendingFlush)
-            scheduleLayerFlushRunLoopObserver();
</del><ins>+        scheduleLayerFlushRunLoopObserver();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -196,8 +195,6 @@
</span><span class="cx"> 
</span><span class="cx"> void TiledCoreAnimationDrawingArea::scheduleCompositingLayerFlush()
</span><span class="cx"> {
</span><del>-    m_hasPendingFlush = true;
-
</del><span class="cx">     if (m_layerTreeStateIsFrozen) {
</span><span class="cx">         m_isLayerFlushThrottlingTemporarilyDisabledForInteraction = false;
</span><span class="cx">         return;
</span><span class="lines">@@ -215,11 +212,6 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_isThrottlingLayerFlushes) {
-        startLayerFlushThrottlingTimer();
-        return;
-    }
-
</del><span class="cx">     scheduleLayerFlushRunLoopObserver();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -487,7 +479,7 @@
</span><span class="cx">                 drawingArea->sendPendingNewlyReachedLayoutMilestones();
</span><span class="cx">         } forPhase:kCATransactionPhasePostCommit];
</span><span class="cx"> 
</span><del>-        m_hasPendingFlush = !m_webPage.mainFrameView()->flushCompositingStateIncludingSubframes();
</del><ins>+        bool didFlushAllFrames = m_webPage.mainFrameView()->flushCompositingStateIncludingSubframes();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING)
</span><span class="cx">         if (ScrollingCoordinator* scrollingCoordinator = m_webPage.corePage()->scrollingCoordinator())
</span><span class="lines">@@ -504,7 +496,7 @@
</span><span class="cx">             m_pendingCallbackIDs.clear();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!m_hasPendingFlush)
</del><ins>+        if (didFlushAllFrames)
</ins><span class="cx">             invalidateLayerFlushRunLoopObserver();
</span><span class="cx"> 
</span><span class="cx">         if (m_isThrottlingLayerFlushes)
</span><span class="lines">@@ -965,7 +957,7 @@
</span><span class="cx">     if (m_isThrottlingLayerFlushes) {
</span><span class="cx">         invalidateLayerFlushRunLoopObserver();
</span><span class="cx">         startLayerFlushThrottlingTimer();
</span><del>-    } else if (m_hasPendingFlush)
</del><ins>+    } else
</ins><span class="cx">         scheduleLayerFlushRunLoopObserver();
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="lines">@@ -988,8 +980,6 @@
</span><span class="cx"> {
</span><span class="cx">     if (m_layerTreeStateIsFrozen)
</span><span class="cx">         return;
</span><del>-    if (!m_hasPendingFlush)
-        return;
</del><span class="cx">     scheduleLayerFlushRunLoopObserver();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>