<!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>[168078] 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/168078">168078</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-04-30 19:15:17 -0700 (Wed, 30 Apr 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[iOS WK2] Some accerated overflow-scroll doesn't scroll correctly
https://bugs.webkit.org/show_bug.cgi?id=132375
Reviewed by Tim Horton.
Source/WebCore:
We set the size of the scrolling layer (which becomes the bounds of
the UIScrollView) to a non-pixel-snapped padding box size, but the
size of the contents layer is an integral-snapped scroll size.
This would result in a fractional difference between the two, which
makes us thing that the element is scrollable when it really is not.
Fix by setting the size of the scroll layer to pixel snapped client size,
which is what we also use for scrollability computation.
Added some FIXMEs in code that requires pixel snapping.
Also use #if PLATFORM(IOS)/#else to bracket some code that never runs on iOS
but tries to do something similar to iOS-only code.
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
LayoutTests:
New test that dumps compositing layers on iOS so we can see the sizes of the
scroll layers that get created.
* compositing/overflow/subpixel-overflow-expected.txt: Added.
* compositing/overflow/subpixel-overflow.html: Added.
* platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt: Added.
* platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt:
This is a progression; the old code failed to take the scrollbar width into
account, and the new code does.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmaccompositingoverflowcompositedscrollingcreatesastackingcontainerexpectedtxt">trunk/LayoutTests/platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscompositingoverflowsubpixeloverflowexpectedtxt">trunk/LayoutTests/compositing/overflow/subpixel-overflow-expected.txt</a></li>
<li><a href="#trunkLayoutTestscompositingoverflowsubpixeloverflowhtml">trunk/LayoutTests/compositing/overflow/subpixel-overflow.html</a></li>
<li><a href="#trunkLayoutTestsplatformiossimcompositingoverflowsubpixeloverflowexpectedtxt">trunk/LayoutTests/platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (168077 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog 2014-05-01 02:15:15 UTC (rev 168077)
+++ trunk/LayoutTests/ChangeLog 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -1,5 +1,23 @@
</span><span class="cx"> 2014-04-30 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><ins>+ [iOS WK2] Some accerated overflow-scroll doesn't scroll correctly
+ https://bugs.webkit.org/show_bug.cgi?id=132375
+
+ Reviewed by Tim Horton.
+
+ New test that dumps compositing layers on iOS so we can see the sizes of the
+ scroll layers that get created.
+
+ * compositing/overflow/subpixel-overflow-expected.txt: Added.
+ * compositing/overflow/subpixel-overflow.html: Added.
+ * platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt: Added.
+ * platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt:
+ This is a progression; the old code failed to take the scrollbar width into
+ account, and the new code does.
+
+
+2014-04-30 Simon Fraser <simon.fraser@apple.com>
+
</ins><span class="cx"> Rebaseline compositing/overflow tests for iOS.
</span><span class="cx">
</span><span class="cx"> * platform/ios-sim/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt:
</span></span></pre></div>
<a id="trunkLayoutTestscompositingoverflowsubpixeloverflowexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/overflow/subpixel-overflow-expected.txt (0 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/overflow/subpixel-overflow-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/overflow/subpixel-overflow-expected.txt 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+Content
+
+Content
+
+Content
+
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingoverflowsubpixeloverflowhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/overflow/subpixel-overflow.html (0 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/overflow/subpixel-overflow.html (rev 0)
+++ trunk/LayoutTests/compositing/overflow/subpixel-overflow.html 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -0,0 +1,54 @@
</span><ins>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ html {
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .container {
+ margin: 10px;
+ width: 200px;
+ border: 1px solid black;
+ overflow: auto;
+ display: inline-block;
+ }
+
+ .contents {
+ width: 100%;
+ }
+ </style>
+ <script>
+ if (window.testRunner)
+ testRunner.dumpAsText();
+
+ window.addEventListener('load', function() {
+ if (window.testRunner)
+ document.getElementById('layers').innerHTML = window.internals.layerTreeAsText(document);
+ }, true);
+ </script>
+</head>
+<body>
+
+ <!-- None of these should be scrollable -->
+ <div class="container">
+ <div class="contents" style="height: 200.25px">
+ Content
+ </div>
+ </div>
+
+ <div class="container">
+ <div class="contents" style="height: 200.5px">
+ Content
+ </div>
+ </div>
+
+ <div class="container">
+ <div class="contents" style="height: 200.75px">
+ Content
+ </div>
+ </div>
+<pre id="layers"></pre>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformiossimcompositingoverflowsubpixeloverflowexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt (0 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/ios-sim/compositing/overflow/subpixel-overflow-expected.txt 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+Content
+
+Content
+
+Content
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 3
+ (GraphicsLayer
+ (position 18.00 18.00)
+ (bounds 202.00 202.50)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 200.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 200.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 244.00 18.00)
+ (bounds 202.00 202.50)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 201.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 201.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 470.00 18.00)
+ (bounds 202.00 203.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 201.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 201.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmaccompositingoverflowcompositedscrollingcreatesastackingcontainerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt (168077 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt 2014-05-01 02:15:15 UTC (rev 168077)
+++ trunk/LayoutTests/platform/mac/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> (children 4
</span><span class="cx"> (GraphicsLayer
</span><span class="cx"> (position 1.00 1.00)
</span><del>- (bounds 200.00 200.00)
</del><ins>+ (bounds 185.00 185.00)
</ins><span class="cx"> (children 1
</span><span class="cx"> (GraphicsLayer
</span><span class="cx"> (bounds 200.00 300.00)
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (168077 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog 2014-05-01 02:15:15 UTC (rev 168077)
+++ trunk/Source/WebCore/ChangeLog 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2014-04-30 Simon Fraser <simon.fraser@apple.com>
+
+ [iOS WK2] Some accerated overflow-scroll doesn't scroll correctly
+ https://bugs.webkit.org/show_bug.cgi?id=132375
+
+ Reviewed by Tim Horton.
+
+ We set the size of the scrolling layer (which becomes the bounds of
+ the UIScrollView) to a non-pixel-snapped padding box size, but the
+ size of the contents layer is an integral-snapped scroll size.
+ This would result in a fractional difference between the two, which
+ makes us thing that the element is scrollable when it really is not.
+
+ Fix by setting the size of the scroll layer to pixel snapped client size,
+ which is what we also use for scrollability computation.
+
+ Added some FIXMEs in code that requires pixel snapping.
+
+ Also use #if PLATFORM(IOS)/#else to bracket some code that never runs on iOS
+ but tries to do something similar to iOS-only code.
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
+
</ins><span class="cx"> 2014-04-30 David Hyatt <hyatt@apple.com>
</span><span class="cx">
</span><span class="cx"> REGRESSION (r168046): [New Multicolumn] Painting order is wrong for columns and fixed positioned elements
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (168077 => 168078)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2014-05-01 02:15:15 UTC (rev 168077)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2014-05-01 02:15:17 UTC (rev 168078)
</span><span class="lines">@@ -743,6 +743,7 @@
</span><span class="cx"> if (compAncestor && compAncestor->backing()->hasClippingLayer()) {
</span><span class="cx"> // If the compositing ancestor has a layer to clip children, we parent in that, and therefore
</span><span class="cx"> // position relative to it.
</span><ins>+ // FIXME: need to do some pixel snapping here.
</ins><span class="cx"> LayoutRect clippingBox = clipBox(toRenderBox(compAncestor->renderer()));
</span><span class="cx"> graphicsLayerParentLocation = clippingBox.location();
</span><span class="cx"> } else if (compAncestor)
</span><span class="lines">@@ -757,18 +758,19 @@
</span><span class="cx"> renderBox->width() - renderBox->borderLeft() - renderBox->borderRight(),
</span><span class="cx"> renderBox->height() - renderBox->borderTop() - renderBox->borderBottom());
</span><span class="cx">
</span><del>- LayoutSize scrollOffset = compAncestor->scrolledContentOffset();
</del><ins>+ IntSize scrollOffset = compAncestor->scrolledContentOffset();
+ // FIXME: pixel snap the padding box.
</ins><span class="cx"> graphicsLayerParentLocation = paddingBox.location() - scrollOffset;
</span><span class="cx"> }
</span><del>-#endif
-
</del><ins>+#else
</ins><span class="cx"> if (compAncestor && compAncestor->needsCompositedScrolling()) {
</span><span class="cx"> RenderBox& renderBox = toRenderBox(compAncestor->renderer());
</span><span class="cx"> LayoutSize scrollOffset = compAncestor->scrolledContentOffset();
</span><span class="cx"> LayoutPoint scrollOrigin(renderBox.borderLeft(), renderBox.borderTop());
</span><span class="cx"> graphicsLayerParentLocation = scrollOrigin - scrollOffset;
</span><span class="cx"> }
</span><del>-
</del><ins>+#endif
+
</ins><span class="cx"> if (compAncestor && m_ancestorClippingLayer) {
</span><span class="cx"> // Call calculateRects to get the backgroundRect which is what is used to clip the contents of this
</span><span class="cx"> // layer. Note that we call it with temporaryClipRects = true because normally when computing clip rects
</span><span class="lines">@@ -813,6 +815,7 @@
</span><span class="cx"> // If we have a layer that clips children, position it.
</span><span class="cx"> LayoutRect clippingBox;
</span><span class="cx"> if (GraphicsLayer* clipLayer = clippingLayer()) {
</span><ins>+ // FIXME: need to do some pixel snapping here.
</ins><span class="cx"> clippingBox = clipBox(toRenderBox(renderer()));
</span><span class="cx"> clipLayer->setPosition(FloatPoint(clippingBox.location() - localCompositingBounds.location()));
</span><span class="cx"> clipLayer->setSize(clippingBox.size());
</span><span class="lines">@@ -909,9 +912,11 @@
</span><span class="cx"> LayoutRect paddingBox(renderBox.borderLeft(), renderBox.borderTop(), renderBox.width() - renderBox.borderLeft() - renderBox.borderRight(), renderBox.height() - renderBox.borderTop() - renderBox.borderBottom());
</span><span class="cx"> LayoutSize scrollOffset = m_owningLayer.scrollOffset();
</span><span class="cx">
</span><ins>+ // FIXME: need to do some pixel snapping here.
</ins><span class="cx"> m_scrollingLayer->setPosition(FloatPoint(paddingBox.location() - localCompositingBounds.location()));
</span><span class="cx">
</span><del>- m_scrollingLayer->setSize(paddingBox.size());
</del><ins>+ IntSize pixelSnappedClientSize(renderBox.pixelSnappedClientWidth(), renderBox.pixelSnappedClientHeight());
+ m_scrollingLayer->setSize(pixelSnappedClientSize);
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> FloatSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromRenderer();
</span><span class="cx"> m_scrollingLayer->setOffsetFromRenderer(FloatPoint() - paddingBox.location());
</span></span></pre>
</div>
</div>
</body>
</html>