<!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>[168602] 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/168602">168602</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2014-05-11 14:02:52 -0700 (Sun, 11 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Headers and footers are not positioned correctly with topContentInset
https://bugs.webkit.org/show_bug.cgi?id=132787
-and corresponding-
&lt;rdar://problem/16641115&gt;

Reviewed by Tim Horton.

Headers and footers need to take the inset into account, and they also need to 
factor in the fact that the root layer moves around now too.

The existing yPositionForRootContentLayer() is actually the right calculation for 
the header layer. The root content layer wants that value, but pushed down by the 
header height. Now there are static functions for both of them and the footer to 
avoid duplicated code in the three spots where we need this information.
* page/FrameView.cpp:
(WebCore::FrameView::yPositionForHeaderLayer):
(WebCore::FrameView::yPositionForRootContentLayer):
(WebCore::FrameView::yPositionForFooterLayer):
* page/FrameView.h:

Use the static functions to compute the layer positions.
* page/scrolling/AsyncScrollingCoordinator.cpp:
(WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll):

How did headers ever work with this bug?? I don’t know. We need to return that 
layer.
* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::ScrollingCoordinator::headerLayerForFrameView):

Use the static functions to compute the layer positions.
* page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm:
(WebCore::ScrollingTreeScrollingNodeMac::setScrollLayerPosition):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateRootLayerPosition):
(WebCore::RenderLayerCompositor::updateLayerForHeader):
(WebCore::RenderLayerCompositor::updateLayerForFooter):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewh">trunk/Source/WebCore/page/FrameView.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingmacScrollingTreeScrollingNodeMacmm">trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/ChangeLog        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2014-05-11  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Headers and footers are not positioned correctly with topContentInset
+        https://bugs.webkit.org/show_bug.cgi?id=132787
+        -and corresponding-
+        &lt;rdar://problem/16641115&gt;
+
+        Reviewed by Tim Horton.
+
+        Headers and footers need to take the inset into account, and they also need to 
+        factor in the fact that the root layer moves around now too.
+
+        The existing yPositionForRootContentLayer() is actually the right calculation for 
+        the header layer. The root content layer wants that value, but pushed down by the 
+        header height. Now there are static functions for both of them and the footer to 
+        avoid duplicated code in the three spots where we need this information.
+        * page/FrameView.cpp:
+        (WebCore::FrameView::yPositionForHeaderLayer):
+        (WebCore::FrameView::yPositionForRootContentLayer):
+        (WebCore::FrameView::yPositionForFooterLayer):
+        * page/FrameView.h:
+
+        Use the static functions to compute the layer positions.
+        * page/scrolling/AsyncScrollingCoordinator.cpp:
+        (WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll):
+
+        How did headers ever work with this bug?? I don’t know. We need to return that 
+        layer.
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::ScrollingCoordinator::headerLayerForFrameView):
+
+        Use the static functions to compute the layer positions.
+        * page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm:
+        (WebCore::ScrollingTreeScrollingNodeMac::setScrollLayerPosition):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateRootLayerPosition):
+        (WebCore::RenderLayerCompositor::updateLayerForHeader):
+        (WebCore::RenderLayerCompositor::updateLayerForFooter):
+
</ins><span class="cx"> 2014-05-11  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Subpixel rendering[iOS]: &lt;select&gt; decoration is misaligned when the renderer is on subpixel position.
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/page/FrameView.cpp        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -1616,12 +1616,11 @@
</span><span class="cx">     return topContentInset - scrollY;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-float FrameView::yPositionForRootContentLayer(const FloatPoint&amp; scrollPosition, float topContentInset)
</del><ins>+float FrameView::yPositionForHeaderLayer(const FloatPoint&amp; scrollPosition, float topContentInset)
</ins><span class="cx"> {
</span><span class="cx">     if (!topContentInset)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    // The rootContentLayer should not move for negative scroll values.
</del><span class="cx">     float scrollY = std::max&lt;float&gt;(0, scrollPosition.y());
</span><span class="cx"> 
</span><span class="cx">     if (scrollY &gt;= topContentInset)
</span><span class="lines">@@ -1629,7 +1628,17 @@
</span><span class="cx"> 
</span><span class="cx">     return scrollY;
</span><span class="cx"> }
</span><del>-    
</del><ins>+
+float FrameView::yPositionForRootContentLayer(const FloatPoint&amp; scrollPosition, float topContentInset, float headerHeight)
+{
+    return yPositionForHeaderLayer(scrollPosition, topContentInset) + headerHeight;
+}
+
+float FrameView::yPositionForFooterLayer(const FloatPoint&amp; scrollPosition, float topContentInset, float totalContentsHeight, float footerHeight)
+{
+    return yPositionForHeaderLayer(scrollPosition, topContentInset) + totalContentsHeight - footerHeight;
+}
+
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> LayoutRect FrameView::rectForViewportConstrainedObjects(const LayoutRect&amp; visibleContentRect, const LayoutSize&amp; totalContentsSize, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements scrollBehavior)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.h (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.h        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/page/FrameView.h        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -277,10 +277,12 @@
</span><span class="cx">     // Static function can be called from another thread.
</span><span class="cx">     static LayoutSize scrollOffsetForFixedPosition(const LayoutRect&amp; visibleContentRect, const LayoutSize&amp; totalContentsSize, const LayoutPoint&amp; scrollPosition, const LayoutPoint&amp; scrollOrigin, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements, int headerHeight, int footerHeight);
</span><span class="cx"> 
</span><del>-    // These layers are positioned differently when there is a topContentInset. These value need to be computed
</del><ins>+    // These layers are positioned differently when there is a topContentInset, a header, or a footer. These value need to be computed
</ins><span class="cx">     // on both the main thread and the scrolling thread.
</span><span class="cx">     static float yPositionForInsetClipLayer(const FloatPoint&amp; scrollPosition, float topContentInset);
</span><del>-    static float yPositionForRootContentLayer(const FloatPoint&amp; scrollPosition, float topContentInset);
</del><ins>+    static float yPositionForRootContentLayer(const FloatPoint&amp; scrollPosition, float topContentInset, float headerHeight);
+    static float yPositionForHeaderLayer(const FloatPoint&amp; scrollPosition, float topContentInset);
+    static float yPositionForFooterLayer(const FloatPoint&amp; scrollPosition, float topContentInset, float totalContentsHeight, float footerHeight);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     LayoutRect viewportConstrainedObjectsRect() const;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -223,7 +223,10 @@
</span><span class="cx">             float topContentInset = frameView-&gt;topContentInset();
</span><span class="cx">             FloatPoint positionForInsetClipLayer = FloatPoint(0, FrameView::yPositionForInsetClipLayer(scrollPosition, topContentInset));
</span><span class="cx">             FloatPoint positionForContentsLayer = FloatPoint(scrolledContentsLayer-&gt;position().x(),
</span><del>-                FrameView::yPositionForRootContentLayer(scrollPosition, topContentInset));
</del><ins>+                FrameView::yPositionForRootContentLayer(scrollPosition, topContentInset, frameView-&gt;headerHeight()));
+            FloatPoint positionForHeaderLayer = FloatPoint(scrollOffsetForFixed.width(), FrameView::yPositionForHeaderLayer(scrollPosition, topContentInset));
+            FloatPoint positionForFooterLayer = FloatPoint(scrollOffsetForFixed.width(),
+                FrameView::yPositionForFooterLayer(scrollPosition, topContentInset, frameView-&gt;totalContentsSize().height(), frameView-&gt;footerHeight()));
</ins><span class="cx"> 
</span><span class="cx">             if (programmaticScroll || scrollingLayerPositionAction == SetScrollingLayerPosition) {
</span><span class="cx">                 scrollLayer-&gt;setPosition(-frameView-&gt;scrollPosition());
</span><span class="lines">@@ -234,9 +237,9 @@
</span><span class="cx">                 if (scrolledContentsLayer)
</span><span class="cx">                     scrolledContentsLayer-&gt;setPosition(positionForContentsLayer);
</span><span class="cx">                 if (headerLayer)
</span><del>-                    headerLayer-&gt;setPosition(FloatPoint(scrollOffsetForFixed.width(), 0));
</del><ins>+                    headerLayer-&gt;setPosition(positionForHeaderLayer);
</ins><span class="cx">                 if (footerLayer)
</span><del>-                    footerLayer-&gt;setPosition(FloatPoint(scrollOffsetForFixed.width(), frameView-&gt;totalContentsSize().height() - frameView-&gt;footerHeight()));
</del><ins>+                    footerLayer-&gt;setPosition(positionForFooterLayer);
</ins><span class="cx">             } else {
</span><span class="cx">                 scrollLayer-&gt;syncPosition(-frameView-&gt;scrollPosition());
</span><span class="cx">                 if (counterScrollingLayer)
</span><span class="lines">@@ -246,9 +249,9 @@
</span><span class="cx">                 if (scrolledContentsLayer)
</span><span class="cx">                     scrolledContentsLayer-&gt;syncPosition(positionForContentsLayer);
</span><span class="cx">                 if (headerLayer)
</span><del>-                    headerLayer-&gt;syncPosition(FloatPoint(scrollOffsetForFixed.width(), 0));
</del><ins>+                    headerLayer-&gt;syncPosition(positionForHeaderLayer);
</ins><span class="cx">                 if (footerLayer)
</span><del>-                    footerLayer-&gt;syncPosition(FloatPoint(scrollOffsetForFixed.width(), frameView-&gt;totalContentsSize().height() - frameView-&gt;footerHeight()));
</del><ins>+                    footerLayer-&gt;syncPosition(positionForFooterLayer);
</ins><span class="cx"> 
</span><span class="cx">                 LayoutRect viewportRect = frameView-&gt;viewportConstrainedVisibleContentRect();
</span><span class="cx">                 syncChildPositions(viewportRect);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -214,18 +214,18 @@
</span><span class="cx"> {
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><span class="cx">         return renderView-&gt;compositor().scrollLayer();
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GraphicsLayer* ScrollingCoordinator::headerLayerForFrameView(FrameView* frameView)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(RUBBER_BANDING)
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><del>-        renderView-&gt;compositor().headerLayer();
-    return 0;
</del><ins>+        return renderView-&gt;compositor().headerLayer();
+    return nullptr;
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(frameView);
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -234,10 +234,10 @@
</span><span class="cx"> #if ENABLE(RUBBER_BANDING)
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><span class="cx">         return renderView-&gt;compositor().footerLayer();
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(frameView);
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -245,21 +245,21 @@
</span><span class="cx"> {
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><span class="cx">         return renderView-&gt;compositor().fixedRootBackgroundLayer();
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GraphicsLayer* ScrollingCoordinator::insetClipLayerForFrameView(FrameView* frameView)
</span><span class="cx"> {
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><span class="cx">         return renderView-&gt;compositor().clipLayer();
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GraphicsLayer* ScrollingCoordinator::rootContentLayerForFrameView(FrameView* frameView)
</span><span class="cx"> {
</span><span class="cx">     if (RenderView* renderView = frameView-&gt;frame().contentRenderer())
</span><span class="cx">         return renderView-&gt;compositor().rootContentLayer();
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingCoordinator::frameViewRootLayerDidChange(FrameView* frameView)
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingmacScrollingTreeScrollingNodeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -359,7 +359,7 @@
</span><span class="cx">     if (m_insetClipLayer &amp;&amp; m_scrolledContentsLayer &amp;&amp; topContentInset) {
</span><span class="cx">         m_insetClipLayer.get().position = FloatPoint(0, FrameView::yPositionForInsetClipLayer(position, topContentInset));
</span><span class="cx">         m_scrolledContentsLayer.get().position = FloatPoint(m_scrolledContentsLayer.get().position.x,
</span><del>-            FrameView::yPositionForRootContentLayer(position, topContentInset));
</del><ins>+            FrameView::yPositionForRootContentLayer(position, topContentInset, headerHeight()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_headerLayer || m_footerLayer) {
</span><span class="lines">@@ -371,10 +371,11 @@
</span><span class="cx">             horizontalScrollOffsetForBanner = FrameView::scrollOffsetForFixedPosition(enclosingLayoutRect(viewportRect), totalContentsSize(), flooredIntPoint(scrollOffset), scrollOrigin(), 1, false, behaviorForFixed, headerHeight(), footerHeight()).width();
</span><span class="cx"> 
</span><span class="cx">         if (m_headerLayer)
</span><del>-            m_headerLayer.get().position = FloatPoint(horizontalScrollOffsetForBanner, 0);
</del><ins>+            m_headerLayer.get().position = FloatPoint(horizontalScrollOffsetForBanner, FrameView::yPositionForHeaderLayer(position, topContentInset));
</ins><span class="cx"> 
</span><span class="cx">         if (m_footerLayer)
</span><del>-            m_footerLayer.get().position = FloatPoint(horizontalScrollOffsetForBanner, totalContentsSize().height() - footerHeight());
</del><ins>+            m_footerLayer.get().position = FloatPoint(horizontalScrollOffsetForBanner,
+                FrameView::yPositionForFooterLayer(position, topContentInset, totalContentsSize().height(), footerHeight()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_verticalScrollbarPainter || m_horizontalScrollbarPainter) {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (168601 => 168602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-05-11 19:46:53 UTC (rev 168601)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-05-11 21:02:52 UTC (rev 168602)
</span><span class="lines">@@ -1953,8 +1953,8 @@
</span><span class="cx">     if (m_rootContentLayer) {
</span><span class="cx">         const IntRect&amp; documentRect = m_renderView.documentRect();
</span><span class="cx">         m_rootContentLayer-&gt;setSize(documentRect.size());        
</span><del>-        m_rootContentLayer-&gt;setPosition(FloatPoint(documentRect.x(), documentRect.y() + m_renderView.frameView().headerHeight()
-            + FrameView::yPositionForRootContentLayer(m_renderView.frameView().scrollPosition(), m_renderView.frameView().topContentInset())));
</del><ins>+        m_rootContentLayer-&gt;setPosition(FloatPoint(documentRect.x(), documentRect.y()
+            + FrameView::yPositionForRootContentLayer(m_renderView.frameView().scrollPosition(), m_renderView.frameView().topContentInset(), m_renderView.frameView().headerHeight())));
</ins><span class="cx">         m_rootContentLayer-&gt;setAnchorPoint(FloatPoint3D());
</span><span class="cx">     }
</span><span class="cx">     if (m_clipLayer) {
</span><span class="lines">@@ -2966,7 +2966,8 @@
</span><span class="cx">         m_renderView.frameView().addPaintPendingMilestones(DidFirstFlushForHeaderLayer);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_layerForHeader-&gt;setPosition(FloatPoint());
</del><ins>+    m_layerForHeader-&gt;setPosition(FloatPoint(0,
+        FrameView::yPositionForHeaderLayer(m_renderView.frameView().scrollPosition(), m_renderView.frameView().topContentInset())));
</ins><span class="cx">     m_layerForHeader-&gt;setAnchorPoint(FloatPoint3D());
</span><span class="cx">     m_layerForHeader-&gt;setSize(FloatSize(m_renderView.frameView().visibleWidth(), m_renderView.frameView().headerHeight()));
</span><span class="cx"> 
</span><span class="lines">@@ -3005,7 +3006,9 @@
</span><span class="cx">         m_scrollLayer-&gt;addChildBelow(m_layerForFooter.get(), m_rootContentLayer.get());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_layerForFooter-&gt;setPosition(FloatPoint(0, m_rootContentLayer-&gt;size().height() + m_renderView.frameView().headerHeight()));
</del><ins>+    float totalContentHeight = m_rootContentLayer-&gt;size().height() + m_renderView.frameView().headerHeight() + m_renderView.frameView().footerHeight();
+    m_layerForFooter-&gt;setPosition(FloatPoint(0, FrameView::yPositionForFooterLayer(m_renderView.frameView().scrollPosition(),
+        m_renderView.frameView().topContentInset(), totalContentHeight, m_renderView.frameView().footerHeight())));
</ins><span class="cx">     m_layerForFooter-&gt;setAnchorPoint(FloatPoint3D());
</span><span class="cx">     m_layerForFooter-&gt;setSize(FloatSize(m_renderView.frameView().visibleWidth(), m_renderView.frameView().footerHeight()));
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>