<!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>[198383] trunk/Source/WebCore</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/198383">198383</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-03-17 23:56:26 -0700 (Thu, 17 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/195661">r195661</a>): [GTK] very slow scrolling
https://bugs.webkit.org/show_bug.cgi?id=155334

Reviewed by Michael Catanzaro.

We need to also restore the PerAxisData visible length when it's
reset because of a non animated scroll. To prevent making the same
mistake in the future, the current position and visible lengths
members are now required to construct PerAxisData. This also
simplifies the code and ensures that when the ScrollAnimatorSmooth
is created, it's updated to the current position.

* platform/ScrollAnimationSmooth.cpp:
(WebCore::ScrollAnimationSmooth::ScrollAnimationSmooth):
Initialize PerAxisData members.
(WebCore::ScrollAnimationSmooth::setCurrentPosition): Pass the
current position and visible length as parameters to the
PerAxisData constructor.
(WebCore::ScrollAnimationSmooth::animateScroll): Ditto.
* platform/ScrollAnimationSmooth.h: Add a PerAxisData constructor
that receives current position and visible length and disallow to
use the default constructor.
* platform/ScrollAnimatorSmooth.cpp:
(WebCore::ScrollAnimatorSmooth::ScrollAnimatorSmooth): Pass the
current position to the ScrollAnimationSmooth constructor.
* platform/gtk/ScrollAnimatorGtk.cpp:
(WebCore::ScrollAnimatorGtk::ensureSmoothScrollingAnimation): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollAnimationSmoothcpp">trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollAnimationSmoothh">trunk/Source/WebCore/platform/ScrollAnimationSmooth.h</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollAnimatorSmoothcpp">trunk/Source/WebCore/platform/ScrollAnimatorSmooth.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkScrollAnimatorGtkcpp">trunk/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (198382 => 198383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-18 06:53:27 UTC (rev 198382)
+++ trunk/Source/WebCore/ChangeLog        2016-03-18 06:56:26 UTC (rev 198383)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-03-17  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        REGRESSION(r195661): [GTK] very slow scrolling
+        https://bugs.webkit.org/show_bug.cgi?id=155334
+
+        Reviewed by Michael Catanzaro.
+
+        We need to also restore the PerAxisData visible length when it's
+        reset because of a non animated scroll. To prevent making the same
+        mistake in the future, the current position and visible lengths
+        members are now required to construct PerAxisData. This also
+        simplifies the code and ensures that when the ScrollAnimatorSmooth
+        is created, it's updated to the current position.
+
+        * platform/ScrollAnimationSmooth.cpp:
+        (WebCore::ScrollAnimationSmooth::ScrollAnimationSmooth):
+        Initialize PerAxisData members.
+        (WebCore::ScrollAnimationSmooth::setCurrentPosition): Pass the
+        current position and visible length as parameters to the
+        PerAxisData constructor.
+        (WebCore::ScrollAnimationSmooth::animateScroll): Ditto.
+        * platform/ScrollAnimationSmooth.h: Add a PerAxisData constructor
+        that receives current position and visible length and disallow to
+        use the default constructor.
+        * platform/ScrollAnimatorSmooth.cpp:
+        (WebCore::ScrollAnimatorSmooth::ScrollAnimatorSmooth): Pass the
+        current position to the ScrollAnimationSmooth constructor.
+        * platform/gtk/ScrollAnimatorGtk.cpp:
+        (WebCore::ScrollAnimatorGtk::ensureSmoothScrollingAnimation): Ditto.
+
</ins><span class="cx"> 2016-03-17  Chris Fleizach  &lt;cfleizach@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: WEB: VoiceOver does not announce some WAI-ARIA document structures
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollAnimationSmoothcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp (198382 => 198383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp        2016-03-18 06:53:27 UTC (rev 198382)
+++ trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp        2016-03-18 06:56:26 UTC (rev 198383)
</span><span class="lines">@@ -40,9 +40,11 @@
</span><span class="cx"> static const double tickTime = 1 / frameRate;
</span><span class="cx"> static const double minimumTimerInterval = .001;
</span><span class="cx"> 
</span><del>-ScrollAnimationSmooth::ScrollAnimationSmooth(ScrollableArea&amp; scrollableArea, std::function&lt;void (FloatPoint&amp;&amp;)&gt;&amp;&amp; notifyPositionChangedFunction)
</del><ins>+ScrollAnimationSmooth::ScrollAnimationSmooth(ScrollableArea&amp; scrollableArea, const FloatPoint&amp; position, std::function&lt;void (FloatPoint&amp;&amp;)&gt;&amp;&amp; notifyPositionChangedFunction)
</ins><span class="cx">     : ScrollAnimation(scrollableArea)
</span><span class="cx">     , m_notifyPositionChangedFunction(WTFMove(notifyPositionChangedFunction))
</span><ins>+    , m_horizontalData(position.x(), scrollableArea.visibleWidth())
+    , m_verticalData(position.y(), scrollableArea.visibleHeight())
</ins><span class="cx"> #if USE(REQUEST_ANIMATION_FRAME_TIMER)
</span><span class="cx">     , m_animationTimer(*this, &amp;ScrollAnimationSmooth::animationTimerFired)
</span><span class="cx"> #else
</span><span class="lines">@@ -88,13 +90,8 @@
</span><span class="cx"> void ScrollAnimationSmooth::setCurrentPosition(const FloatPoint&amp; position)
</span><span class="cx"> {
</span><span class="cx">     stop();
</span><del>-    m_horizontalData = PerAxisData();
-    m_horizontalData.currentPosition = position.x();
-    m_horizontalData.desiredPosition = m_horizontalData.currentPosition;
-
-    m_verticalData = PerAxisData();
-    m_verticalData.currentPosition = position.y();
-    m_verticalData.desiredPosition = m_verticalData.currentPosition;
</del><ins>+    m_horizontalData = PerAxisData(position.x(), m_horizontalData.visibleLength);
+    m_verticalData = PerAxisData(position.y(), m_verticalData.visibleLength);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !USE(REQUEST_ANIMATION_FRAME_TIMER)
</span><span class="lines">@@ -379,11 +376,7 @@
</span><span class="cx">     double newPosition = data.currentPosition;
</span><span class="cx"> 
</span><span class="cx">     if (deltaTime &gt; data.animationTime) {
</span><del>-        double desiredPosition = data.desiredPosition;
-        int visibleLength = data.visibleLength;
-        data = PerAxisData();
-        data.currentPosition = desiredPosition;
-        data.visibleLength = visibleLength;
</del><ins>+        data = PerAxisData(data.desiredPosition, data.visibleLength);
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     if (deltaTime &lt; data.attackTime)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollAnimationSmoothh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollAnimationSmooth.h (198382 => 198383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollAnimationSmooth.h        2016-03-18 06:53:27 UTC (rev 198382)
+++ trunk/Source/WebCore/platform/ScrollAnimationSmooth.h        2016-03-18 06:56:26 UTC (rev 198383)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ScrollAnimationSmooth final: public ScrollAnimation {
</span><span class="cx"> public:
</span><del>-    ScrollAnimationSmooth(ScrollableArea&amp;, std::function&lt;void (FloatPoint&amp;&amp;)&gt;&amp;&amp; notifyPositionChangedFunction);
</del><ins>+    ScrollAnimationSmooth(ScrollableArea&amp;, const FloatPoint&amp;, std::function&lt;void (FloatPoint&amp;&amp;)&gt;&amp;&amp; notifyPositionChangedFunction);
</ins><span class="cx">     virtual ~ScrollAnimationSmooth();
</span><span class="cx"> 
</span><span class="cx">     enum class Curve {
</span><span class="lines">@@ -64,6 +64,15 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     struct PerAxisData {
</span><ins>+        PerAxisData() = delete;
+
+        PerAxisData(float position, int length)
+            : currentPosition(position)
+            , desiredPosition(position)
+            , visibleLength(length)
+        {
+        }
+
</ins><span class="cx">         float currentPosition { 0 };
</span><span class="cx">         double currentVelocity { 0 };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollAnimatorSmoothcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollAnimatorSmooth.cpp (198382 => 198383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollAnimatorSmooth.cpp        2016-03-18 06:53:27 UTC (rev 198382)
+++ trunk/Source/WebCore/platform/ScrollAnimatorSmooth.cpp        2016-03-18 06:56:26 UTC (rev 198383)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> 
</span><span class="cx"> ScrollAnimatorSmooth::ScrollAnimatorSmooth(ScrollableArea&amp; scrollableArea)
</span><span class="cx">     : ScrollAnimator(scrollableArea)
</span><del>-    , m_animation(std::make_unique&lt;ScrollAnimationSmooth&gt;(scrollableArea, [this](FloatPoint&amp;&amp; position) {
</del><ins>+    , m_animation(std::make_unique&lt;ScrollAnimationSmooth&gt;(scrollableArea, m_currentPosition, [this](FloatPoint&amp;&amp; position) {
</ins><span class="cx">         FloatSize delta = position - m_currentPosition;
</span><span class="cx">         m_currentPosition = WTFMove(position);
</span><span class="cx">         notifyPositionChanged(delta);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkScrollAnimatorGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp (198382 => 198383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp        2016-03-18 06:53:27 UTC (rev 198382)
+++ trunk/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp        2016-03-18 06:56:26 UTC (rev 198383)
</span><span class="lines">@@ -66,12 +66,11 @@
</span><span class="cx">     if (m_animation)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_animation = std::make_unique&lt;ScrollAnimationSmooth&gt;(m_scrollableArea, [this](FloatPoint&amp;&amp; position) {
</del><ins>+    m_animation = std::make_unique&lt;ScrollAnimationSmooth&gt;(m_scrollableArea, m_currentPosition, [this](FloatPoint&amp;&amp; position) {
</ins><span class="cx">         FloatSize delta = position - m_currentPosition;
</span><span class="cx">         m_currentPosition = WTFMove(position);
</span><span class="cx">         notifyPositionChanged(delta);
</span><span class="cx">     });
</span><del>-    m_animation-&gt;setCurrentPosition(m_currentPosition);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ScrollAnimatorGtk::scroll(ScrollbarOrientation orientation, ScrollGranularity granularity, float step, float multiplier)
</span></span></pre>
</div>
</div>

</body>
</html>