<!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>[195660] 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/195660">195660</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-01-27 02:28:49 -0800 (Wed, 27 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Overlay scrollbars should always use the whole contents
https://bugs.webkit.org/show_bug.cgi?id=153352

Reviewed by Michael Catanzaro.

In case of having both horizontal and vertical scrollbars, the
scrollbars respect the scroll corner. That looks good for legacy
scrollbars that show the track, but with the overlay indicators
it looks weird that the indicator stops so early before the end of
the contents, giving the impression that there's something else to
scroll. This happens because the scroll corner is transparent, so
it's not obvious that's the scroll corner. It also happens with
the text areas having a resizer. Legacy scrollbars take into
account the resizer, which is good, but I expect overlay
scrollbars to be rendered also over the resizer. The resizer takes
precedence so you can still click and drag to resize the text area.
In the case of main frame scrollbars we are indeed returning an
empty rectangle from ScrollView::scrollCornerRect() when using
overlay scrollbars, but when calculating the size of the
scrollbars we are using the actual width/height instead of the
occupied with/height. For other scrollbars
RenderLayer::scrollCornerRect() is not checking whether scrollbars
are overlay or not and we are always returning a scroll corner
rectangle when scrollbars are present.

* platform/ScrollView.cpp:
(WebCore::ScrollView::updateScrollbars): Use the occupied
width/height when calculating the space the one scrollbar
should leave for the other.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::scrollCornerRect): Return an empty
rectangle when using overlay scrollbars.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollViewcpp">trunk/Source/WebCore/platform/ScrollView.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195659 => 195660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-27 10:24:57 UTC (rev 195659)
+++ trunk/Source/WebCore/ChangeLog        2016-01-27 10:28:49 UTC (rev 195660)
</span><span class="lines">@@ -1,5 +1,40 @@
</span><span class="cx"> 2016-01-27  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        Overlay scrollbars should always use the whole contents
+        https://bugs.webkit.org/show_bug.cgi?id=153352
+
+        Reviewed by Michael Catanzaro.
+
+        In case of having both horizontal and vertical scrollbars, the
+        scrollbars respect the scroll corner. That looks good for legacy
+        scrollbars that show the track, but with the overlay indicators
+        it looks weird that the indicator stops so early before the end of
+        the contents, giving the impression that there's something else to
+        scroll. This happens because the scroll corner is transparent, so
+        it's not obvious that's the scroll corner. It also happens with
+        the text areas having a resizer. Legacy scrollbars take into
+        account the resizer, which is good, but I expect overlay
+        scrollbars to be rendered also over the resizer. The resizer takes
+        precedence so you can still click and drag to resize the text area.
+        In the case of main frame scrollbars we are indeed returning an
+        empty rectangle from ScrollView::scrollCornerRect() when using
+        overlay scrollbars, but when calculating the size of the
+        scrollbars we are using the actual width/height instead of the
+        occupied with/height. For other scrollbars
+        RenderLayer::scrollCornerRect() is not checking whether scrollbars
+        are overlay or not and we are always returning a scroll corner
+        rectangle when scrollbars are present.
+
+        * platform/ScrollView.cpp:
+        (WebCore::ScrollView::updateScrollbars): Use the occupied
+        width/height when calculating the space the one scrollbar
+        should leave for the other.
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::scrollCornerRect): Return an empty
+        rectangle when using overlay scrollbars.
+
+2016-01-27  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         ScrollAnimator is not notified when mouse entered, moved or exited a RenderListBox
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=153398
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.cpp (195659 => 195660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.cpp        2016-01-27 10:24:57 UTC (rev 195659)
+++ trunk/Source/WebCore/platform/ScrollView.cpp        2016-01-27 10:28:49 UTC (rev 195660)
</span><span class="lines">@@ -711,7 +711,7 @@
</span><span class="cx">         IntRect oldRect(m_horizontalScrollbar-&gt;frameRect());
</span><span class="cx">         IntRect hBarRect(0,
</span><span class="cx">             height() - m_horizontalScrollbar-&gt;height(),
</span><del>-            width() - (m_verticalScrollbar ? m_verticalScrollbar-&gt;width() : 0),
</del><ins>+            width() - (m_verticalScrollbar ? m_verticalScrollbar-&gt;occupiedWidth() : 0),
</ins><span class="cx">             m_horizontalScrollbar-&gt;height());
</span><span class="cx">         m_horizontalScrollbar-&gt;setFrameRect(hBarRect);
</span><span class="cx">         if (!m_scrollbarsSuppressed &amp;&amp; oldRect != m_horizontalScrollbar-&gt;frameRect())
</span><span class="lines">@@ -733,7 +733,7 @@
</span><span class="cx">         IntRect vBarRect(width() - m_verticalScrollbar-&gt;width(), 
</span><span class="cx">             topContentInset(),
</span><span class="cx">             m_verticalScrollbar-&gt;width(),
</span><del>-            height() - topContentInset() - (m_horizontalScrollbar ? m_horizontalScrollbar-&gt;height() : 0));
</del><ins>+            height() - topContentInset() - (m_horizontalScrollbar ? m_horizontalScrollbar-&gt;occupiedHeight() : 0));
</ins><span class="cx">         m_verticalScrollbar-&gt;setFrameRect(vBarRect);
</span><span class="cx">         if (!m_scrollbarsSuppressed &amp;&amp; oldRect != m_verticalScrollbar-&gt;frameRect())
</span><span class="cx">             m_verticalScrollbar-&gt;invalidate();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (195659 => 195660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2016-01-27 10:24:57 UTC (rev 195659)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2016-01-27 10:28:49 UTC (rev 195660)
</span><span class="lines">@@ -2821,12 +2821,13 @@
</span><span class="cx"> 
</span><span class="cx"> IntRect RenderLayer::scrollCornerRect() const
</span><span class="cx"> {
</span><del>-    // We have a scrollbar corner when a scrollbar is visible and not filling the entire length of the box.
</del><ins>+    // We have a scrollbar corner when a non overlay scrollbar is visible and not filling the entire length of the box.
</ins><span class="cx">     // This happens when:
</span><del>-    // (a) A resizer is present and at least one scrollbar is present
-    // (b) Both scrollbars are present.
-    bool hasHorizontalBar = horizontalScrollbar();
-    bool hasVerticalBar = verticalScrollbar();
</del><ins>+    // (a) A resizer is present and at least one non overlay scrollbar is present
+    // (b) Both non overlay scrollbars are present.
+    // Overlay scrollbars always fill the entire length of the box so we never have scroll corner in that case.
+    bool hasHorizontalBar = m_hBar &amp;&amp; !m_hBar-&gt;isOverlayScrollbar();
+    bool hasVerticalBar = m_vBar &amp;&amp; !m_vBar-&gt;isOverlayScrollbar();
</ins><span class="cx">     bool hasResizer = renderer().style().resize() != RESIZE_NONE;
</span><span class="cx">     if ((hasHorizontalBar &amp;&amp; hasVerticalBar) || (hasResizer &amp;&amp; (hasHorizontalBar || hasVerticalBar)))
</span><span class="cx">         return snappedIntRect(cornerRect(this, renderBox()-&gt;borderBoxRect()));
</span></span></pre>
</div>
</div>

</body>
</html>