<!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>[208927] 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/208927">208927</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2016-11-19 11:34:18 -0800 (Sat, 19 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS WK2] When zoomed in and panning on pages with fixed bars, parts of the bars are sometimes missing
https://bugs.webkit.org/show_bug.cgi?id=164855

Reviewed by Sam Weinig.
Source/WebCore:

During UI-process panning and zooming, we send visible rect updates to the web process
with inStableState=false, and don't update GraphicsLayers until we get into a stable state.

This causes a problem where the web process has a stale notion of where the GraphicsLayers
for position:fixed elements are, but is then told to update tiling coverage with an up-to-date
visible rect. The existing &quot;sync layer positions&quot; path isn't useful to fix this, because it
breaks the relationship between the GraphicsLayer positions and their FixedPositionViewportConstraints
in the scrolling tree.

To address this, add the notion of an Optional&lt;&gt; approximatePosition on GraphicsLayers. This is used
only by the coverageRect computation code path, and is cleared by a setPosition(). ApproximatePositions
are pushed onto GraphicsLayers via the syncViewportConstrainedLayerPositions() code path (renamed to
reconcileViewportConstrainedLayerPositions).

This allows us to remmove &quot;viewportIsStable&quot; from GraphicsLayer flushing, and FrameView.

SetOrSyncScrollingLayerPosition is made into an enum class.

Tested by scrollingcoordinator/ios/non-stable-viewport-scroll.html

* page/FrameView.cpp:
(WebCore::FrameView::reset):
* page/FrameView.h:
* page/scrolling/AsyncScrollingCoordinator.cpp:
(WebCore::AsyncScrollingCoordinator::requestScrollPositionUpdate):
(WebCore::AsyncScrollingCoordinator::scheduleUpdateScrollPositionAfterAsyncScroll):
(WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll):
(WebCore::AsyncScrollingCoordinator::reconcileScrollingState):
(WebCore::AsyncScrollingCoordinator::reconcileViewportConstrainedLayerPositions):
(WebCore::AsyncScrollingCoordinator::syncViewportConstrainedLayerPositions): Deleted.
* page/scrolling/AsyncScrollingCoordinator.h:
(WebCore::AsyncScrollingCoordinator::ScheduledScrollUpdate::ScheduledScrollUpdate):
* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::operator&lt;&lt;):
* page/scrolling/ScrollingCoordinator.h:
(WebCore::ScrollingCoordinator::reconcileScrollingState):
(WebCore::ScrollingCoordinator::reconcileViewportConstrainedLayerPositions):
(WebCore::ScrollingCoordinator::syncViewportConstrainedLayerPositions): Deleted.
* page/scrolling/ScrollingStateFixedNode.cpp:
(WebCore::ScrollingStateFixedNode::reconcileLayerPositionForViewportRect):
(WebCore::ScrollingStateFixedNode::syncLayerPositionForViewportRect): Deleted.
* page/scrolling/ScrollingStateFixedNode.h:
* page/scrolling/ScrollingStateNode.h:
(WebCore::ScrollingStateNode::reconcileLayerPositionForViewportRect):
(WebCore::ScrollingStateNode::syncLayerPositionForViewportRect): Deleted.
* page/scrolling/ScrollingStateStickyNode.cpp:
(WebCore::ScrollingStateStickyNode::reconcileLayerPositionForViewportRect):
(WebCore::ScrollingStateStickyNode::syncLayerPositionForViewportRect): Deleted.
* page/scrolling/ScrollingStateStickyNode.h:
* page/scrolling/ScrollingTree.cpp:
(WebCore::ScrollingTree::scrollPositionChangedViaDelegatedScrolling):
* page/scrolling/ScrollingTree.h:
* page/scrolling/ThreadedScrollingTree.cpp:
(WebCore::ThreadedScrollingTree::scrollingTreeNodeDidScroll):
* page/scrolling/ThreadedScrollingTree.h:
* page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm:
(WebCore::ScrollingTreeFrameScrollingNodeIOS::setScrollPositionWithoutContentEdgeConstraints):
* page/scrolling/ios/ScrollingTreeIOS.cpp:
(WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
* page/scrolling/ios/ScrollingTreeIOS.h:
* page/scrolling/mac/ScrollingTreeFixedNode.mm:
(WebCore::ScrollingTreeFixedNode::updateLayersAfterAncestorChange):
* platform/graphics/GraphicsLayer.cpp:
(WebCore::GraphicsLayer::dumpProperties):
* platform/graphics/GraphicsLayer.h:
(WebCore::GraphicsLayer::setPosition):
(WebCore::GraphicsLayer::approximatePosition):
(WebCore::GraphicsLayer::setApproximatePosition):
(WebCore::GraphicsLayer::flushCompositingState):
(WebCore::GraphicsLayer::flushCompositingStateForThisLayerOnly):
* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::flushCompositingState):
(WebCore::GraphicsLayerCA::flushCompositingStateForThisLayerOnly):
(WebCore::GraphicsLayerCA::computeVisibleAndCoverageRect):
(WebCore::GraphicsLayerCA::setVisibleAndCoverageRects): No longer bail for viewportConstained layers when the viewport is unstable.
(WebCore::GraphicsLayerCA::recursiveCommitChanges):
* platform/graphics/ca/GraphicsLayerCA.h:
(WebCore::GraphicsLayerCA::CommitState::CommitState): Deleted.
* platform/graphics/texmap/GraphicsLayerTextureMapper.cpp:
(WebCore::GraphicsLayerTextureMapper::flushCompositingState):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::flushCompositingState):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::flushPendingLayerChanges):

Source/WebKit/win:

Remove the &quot;inStableState&quot; parameter from flushCompositingState() etc.

* WebCoreSupport/AcceleratedCompositingContext.cpp:
(AcceleratedCompositingContext::flushPendingLayerChanges):
* WebView.cpp:
(WebView::flushPendingGraphicsLayerChanges):

Source/WebKit2:

During UI-process panning and zooming, we send visible rect updates to the web process
with inStableState=false, and don't update GraphicsLayers until we get into a stable state.

This causes a problem where the web process has a stale notion of where the GraphicsLayers
for position:fixed elements are, but is then told to update tiling coverage with an up-to-date
visible rect. The existing &quot;sync layer positions&quot; path isn't useful to fix this, because it
breaks the relationship between the GraphicsLayer positions and their FixedPositionViewportConstraints
in the scrolling tree.

To address this, add the notion of an Optional&lt;&gt; approximatePosition on GraphicsLayers. This is used
only by the coverageRect computation code path, and is cleared by a setPosition(). ApproximatePositions
are pushed onto GraphicsLayers via the syncViewportConstrainedLayerPositions() code path (renamed to
reconcileViewportConstrainedLayerPositions).

Tested by scrollingcoordinator/ios/non-stable-viewport-scroll.html

* UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp:
(WebKit::RemoteScrollingCoordinatorProxy::scrollingTreeNodeDidScroll):
* UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h:
* UIProcess/Scrolling/RemoteScrollingTree.cpp:
(WebKit::RemoteScrollingTree::scrollingTreeNodeDidScroll):
* UIProcess/Scrolling/RemoteScrollingTree.h:
* WebProcess/Scrolling/RemoteScrollingCoordinator.mm:
(WebKit::RemoteScrollingCoordinator::scrollPositionChangedForNode):
* WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp:
(WebKit::CompositingCoordinator::flushPendingLayerChanges):
* WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp:
(WebKit::CoordinatedLayerTreeHost::didFlushRootLayer):
* WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp:
(WebKit::LayerTreeHostGtk::flushPendingLayerChanges):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::updateVisibleContentRects): Always push the custom fixed position rect down, but send
ScrollingLayerPositionAction::SetApproximate if the state is not stable.
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::flushLayers):
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::flushLayers):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsscrollingcoordinatoriosnonstableviewportscrollexpectedtxt">trunk/LayoutTests/scrollingcoordinator/ios/non-stable-viewport-scroll-expected.txt</a></li>
<li><a href="#trunkLayoutTestsscrollingcoordinatoriossynclayerpositionsafterscrollexpectedtxt">trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt</a></li>
<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="#trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorh">trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingCoordinatorh">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateFixedNodecpp">trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateFixedNodeh">trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateNodeh">trunk/Source/WebCore/page/scrolling/ScrollingStateNode.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateStickyNodecpp">trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateStickyNodeh">trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingTreecpp">trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingTreeh">trunk/Source/WebCore/page/scrolling/ScrollingTree.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingThreadedScrollingTreecpp">trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingThreadedScrollingTreeh">trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingiosScrollingTreeFrameScrollingNodeIOSmm">trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm</a></li>
<li><a href="#trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp">trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingiosScrollingTreeIOSh">trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm">trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayercpp">trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayerh">trunk/Source/WebCore/platform/graphics/GraphicsLayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAh">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapGraphicsLayerTextureMappercpp">trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapGraphicsLayerTextureMapperh">trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp">trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayerh">trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinWebCoreSupportAcceleratedCompositingContextcpp">trunk/Source/WebKit/win/WebCoreSupport/AcceleratedCompositingContext.cpp</a></li>
<li><a href="#trunkSourceWebKitwinWebViewcpp">trunk/Source/WebKit/win/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxycpp">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxyh">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingTreecpp">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingTreeh">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessScrollingRemoteScrollingCoordinatormm">trunk/Source/WebKit2/WebProcess/Scrolling/RemoteScrollingCoordinator.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsCompositingCoordinatorcpp">trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsCoordinatedLayerTreeHostcpp">trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkcpp">trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsscrollingcoordinatoriosnonstableviewportscrollexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/scrollingcoordinator/ios/non-stable-viewport-scroll-expected.txt (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/scrollingcoordinator/ios/non-stable-viewport-scroll-expected.txt        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/LayoutTests/scrollingcoordinator/ios/non-stable-viewport-scroll-expected.txt        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -17,12 +17,13 @@
</span><span class="cx">       (children 1
</span><span class="cx">         (GraphicsLayer
</span><span class="cx">           (position 10.00 0.00)
</span><ins>+          (approximate position 10.00 960.75)
</ins><span class="cx">           (bounds 100.00 568.00)
</span><span class="cx">           (usingTiledLayer 1)
</span><span class="cx">           (contentsOpaque 1)
</span><span class="cx">           (drawsContent 1)
</span><del>-          (visible rect 0.00, 0.00 100.00 x 568.00)
-          (coverage rect -10.00, 0.00 320.00 x 568.00)
</del><ins>+          (visible rect 0.00, 39.25 96.67 x 189.33)
+          (coverage rect -10.00, -3.42 192.00 x 274.67)
</ins><span class="cx">           (intersects coverage rect 1)
</span><span class="cx">           (contentsScale 6.00)
</span><span class="cx">         )
</span></span></pre></div>
<a id="trunkLayoutTestsscrollingcoordinatoriossynclayerpositionsafterscrollexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx">       (children 1
</span><span class="cx">         (GraphicsLayer
</span><span class="cx">           (position 12.00 10.00)
</span><ins>+          (approximate position 12.00 166.50)
</ins><span class="cx">           (bounds 100.00 100.00)
</span><span class="cx">           (contentsOpaque 1)
</span><span class="cx">         )
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/ChangeLog        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -1,3 +1,95 @@
</span><ins>+2016-11-19  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] When zoomed in and panning on pages with fixed bars, parts of the bars are sometimes missing
+        https://bugs.webkit.org/show_bug.cgi?id=164855
+
+        Reviewed by Sam Weinig.
+
+        During UI-process panning and zooming, we send visible rect updates to the web process
+        with inStableState=false, and don't update GraphicsLayers until we get into a stable state.
+
+        This causes a problem where the web process has a stale notion of where the GraphicsLayers
+        for position:fixed elements are, but is then told to update tiling coverage with an up-to-date
+        visible rect. The existing &quot;sync layer positions&quot; path isn't useful to fix this, because it
+        breaks the relationship between the GraphicsLayer positions and their FixedPositionViewportConstraints
+        in the scrolling tree.
+
+        To address this, add the notion of an Optional&lt;&gt; approximatePosition on GraphicsLayers. This is used
+        only by the coverageRect computation code path, and is cleared by a setPosition(). ApproximatePositions
+        are pushed onto GraphicsLayers via the syncViewportConstrainedLayerPositions() code path (renamed to
+        reconcileViewportConstrainedLayerPositions).
+
+        This allows us to remmove &quot;viewportIsStable&quot; from GraphicsLayer flushing, and FrameView.
+
+        SetOrSyncScrollingLayerPosition is made into an enum class.
+
+        Tested by scrollingcoordinator/ios/non-stable-viewport-scroll.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::reset):
+        * page/FrameView.h:
+        * page/scrolling/AsyncScrollingCoordinator.cpp:
+        (WebCore::AsyncScrollingCoordinator::requestScrollPositionUpdate):
+        (WebCore::AsyncScrollingCoordinator::scheduleUpdateScrollPositionAfterAsyncScroll):
+        (WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll):
+        (WebCore::AsyncScrollingCoordinator::reconcileScrollingState):
+        (WebCore::AsyncScrollingCoordinator::reconcileViewportConstrainedLayerPositions):
+        (WebCore::AsyncScrollingCoordinator::syncViewportConstrainedLayerPositions): Deleted.
+        * page/scrolling/AsyncScrollingCoordinator.h:
+        (WebCore::AsyncScrollingCoordinator::ScheduledScrollUpdate::ScheduledScrollUpdate):
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::operator&lt;&lt;):
+        * page/scrolling/ScrollingCoordinator.h:
+        (WebCore::ScrollingCoordinator::reconcileScrollingState):
+        (WebCore::ScrollingCoordinator::reconcileViewportConstrainedLayerPositions):
+        (WebCore::ScrollingCoordinator::syncViewportConstrainedLayerPositions): Deleted.
+        * page/scrolling/ScrollingStateFixedNode.cpp:
+        (WebCore::ScrollingStateFixedNode::reconcileLayerPositionForViewportRect):
+        (WebCore::ScrollingStateFixedNode::syncLayerPositionForViewportRect): Deleted.
+        * page/scrolling/ScrollingStateFixedNode.h:
+        * page/scrolling/ScrollingStateNode.h:
+        (WebCore::ScrollingStateNode::reconcileLayerPositionForViewportRect):
+        (WebCore::ScrollingStateNode::syncLayerPositionForViewportRect): Deleted.
+        * page/scrolling/ScrollingStateStickyNode.cpp:
+        (WebCore::ScrollingStateStickyNode::reconcileLayerPositionForViewportRect):
+        (WebCore::ScrollingStateStickyNode::syncLayerPositionForViewportRect): Deleted.
+        * page/scrolling/ScrollingStateStickyNode.h:
+        * page/scrolling/ScrollingTree.cpp:
+        (WebCore::ScrollingTree::scrollPositionChangedViaDelegatedScrolling):
+        * page/scrolling/ScrollingTree.h:
+        * page/scrolling/ThreadedScrollingTree.cpp:
+        (WebCore::ThreadedScrollingTree::scrollingTreeNodeDidScroll):
+        * page/scrolling/ThreadedScrollingTree.h:
+        * page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm:
+        (WebCore::ScrollingTreeFrameScrollingNodeIOS::setScrollPositionWithoutContentEdgeConstraints):
+        * page/scrolling/ios/ScrollingTreeIOS.cpp:
+        (WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
+        * page/scrolling/ios/ScrollingTreeIOS.h:
+        * page/scrolling/mac/ScrollingTreeFixedNode.mm:
+        (WebCore::ScrollingTreeFixedNode::updateLayersAfterAncestorChange):
+        * platform/graphics/GraphicsLayer.cpp:
+        (WebCore::GraphicsLayer::dumpProperties):
+        * platform/graphics/GraphicsLayer.h:
+        (WebCore::GraphicsLayer::setPosition):
+        (WebCore::GraphicsLayer::approximatePosition):
+        (WebCore::GraphicsLayer::setApproximatePosition):
+        (WebCore::GraphicsLayer::flushCompositingState):
+        (WebCore::GraphicsLayer::flushCompositingStateForThisLayerOnly):
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::flushCompositingState):
+        (WebCore::GraphicsLayerCA::flushCompositingStateForThisLayerOnly):
+        (WebCore::GraphicsLayerCA::computeVisibleAndCoverageRect):
+        (WebCore::GraphicsLayerCA::setVisibleAndCoverageRects): No longer bail for viewportConstained layers when the viewport is unstable.
+        (WebCore::GraphicsLayerCA::recursiveCommitChanges):
+        * platform/graphics/ca/GraphicsLayerCA.h:
+        (WebCore::GraphicsLayerCA::CommitState::CommitState): Deleted.
+        * platform/graphics/texmap/GraphicsLayerTextureMapper.cpp:
+        (WebCore::GraphicsLayerTextureMapper::flushCompositingState):
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
+        (WebCore::CoordinatedGraphicsLayer::flushCompositingState):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::flushPendingLayerChanges):
+
</ins><span class="cx"> 2016-11-19  Joanmarie Diggs  &lt;jdiggs@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: [ATK] Expose aria-busy via ATK_STATE_BUSY
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/FrameView.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -360,7 +360,6 @@
</span><span class="cx">     m_visuallyNonEmptyPixelCount = 0;
</span><span class="cx">     m_isVisuallyNonEmpty = false;
</span><span class="cx">     m_firstVisuallyNonEmptyLayoutCallbackPending = true;
</span><del>-    m_viewportIsStable = true;
</del><span class="cx">     m_needsDeferredScrollbarsUpdate = false;
</span><span class="cx">     m_maintainScrollPositionAnchor = nullptr;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/FrameView.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -131,9 +131,6 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool renderedCharactersExceed(unsigned threshold);
</span><span class="cx"> 
</span><del>-    void setViewportIsStable(bool stable) { m_viewportIsStable = stable; }
-    bool viewportIsStable() const { return m_viewportIsStable; }
-
</del><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     bool useCustomFixedPositionLayoutRect() const;
</span><span class="cx">     IntRect customFixedPositionLayoutRect() const { return m_customFixedPositionLayoutRect; }
</span><span class="lines">@@ -807,8 +804,6 @@
</span><span class="cx">     bool m_isVisuallyNonEmpty;
</span><span class="cx">     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
</span><span class="cx"> 
</span><del>-    bool m_viewportIsStable { true };
-
</del><span class="cx">     bool m_needsDeferredScrollbarsUpdate { false };
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;ContainerNode&gt; m_maintainScrollPositionAnchor;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -220,7 +220,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool isProgrammaticScroll = frameView.inProgrammaticScroll();
</span><span class="cx">     if (isProgrammaticScroll || frameView.frame().document()-&gt;pageCacheState() != Document::NotInPageCache)
</span><del>-        updateScrollPositionAfterAsyncScroll(frameView.scrollLayerID(), scrollPosition, Nullopt, isProgrammaticScroll, SetScrollingLayerPosition);
</del><ins>+        updateScrollPositionAfterAsyncScroll(frameView.scrollLayerID(), scrollPosition, Nullopt, isProgrammaticScroll, ScrollingLayerPositionAction::Set);
</ins><span class="cx"> 
</span><span class="cx">     // If this frame view's document is being put into the page cache, we don't want to update our
</span><span class="cx">     // main frame scroll position. Just let the FrameView think that we did.
</span><span class="lines">@@ -235,7 +235,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::scheduleUpdateScrollPositionAfterAsyncScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, bool programmaticScroll, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void AsyncScrollingCoordinator::scheduleUpdateScrollPositionAfterAsyncScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, bool programmaticScroll, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     ScheduledScrollUpdate scrollUpdate(nodeID, scrollPosition, layoutViewportOrigin, programmaticScroll, scrollingLayerPositionAction);
</span><span class="cx">     
</span><span class="lines">@@ -297,7 +297,7 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll(ScrollingNodeID scrollingNodeID, const FloatPoint&amp; scrollPosition, Optional&lt;FloatPoint&gt; layoutViewportOrigin, bool programmaticScroll, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll(ScrollingNodeID scrollingNodeID, const FloatPoint&amp; scrollPosition, Optional&lt;FloatPoint&gt; layoutViewportOrigin, bool programmaticScroll, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="lines">@@ -308,12 +308,12 @@
</span><span class="cx">     if (!frameViewPtr)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll node &quot; &lt;&lt; scrollingNodeID &lt;&lt; &quot; scrollPosition &quot; &lt;&lt; scrollPosition &lt;&lt; (scrollingLayerPositionAction == SetScrollingLayerPosition ? &quot; set&quot; : &quot; sync&quot;) &lt;&lt; &quot; layer positions&quot;);
</del><ins>+    LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll node &quot; &lt;&lt; scrollingNodeID &lt;&lt; &quot; scrollPosition &quot; &lt;&lt; scrollPosition &lt;&lt; &quot; action &quot; &lt;&lt; scrollingLayerPositionAction);
</ins><span class="cx"> 
</span><span class="cx">     FrameView&amp; frameView = *frameViewPtr;
</span><span class="cx"> 
</span><span class="cx">     if (scrollingNodeID == frameView.scrollLayerID()) {
</span><del>-        reconcileScrollingState(frameView, scrollPosition, layoutViewportOrigin, programmaticScroll, scrollingLayerPositionAction);
</del><ins>+        reconcileScrollingState(frameView, scrollPosition, layoutViewportOrigin, programmaticScroll, true, scrollingLayerPositionAction);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">         if (m_page-&gt;expectsWheelEventTriggers()) {
</span><span class="lines">@@ -328,10 +328,10 @@
</span><span class="cx"> 
</span><span class="cx">     // Overflow-scroll area.
</span><span class="cx">     if (ScrollableArea* scrollableArea = frameView.scrollableAreaForScrollLayerID(scrollingNodeID)) {
</span><del>-        scrollableArea-&gt;setIsUserScroll(scrollingLayerPositionAction == SyncScrollingLayerPosition);
</del><ins>+        scrollableArea-&gt;setIsUserScroll(scrollingLayerPositionAction == ScrollingLayerPositionAction::Sync);
</ins><span class="cx">         scrollableArea-&gt;scrollToOffsetWithoutAnimation(scrollPosition);
</span><span class="cx">         scrollableArea-&gt;setIsUserScroll(false);
</span><del>-        if (scrollingLayerPositionAction == SetScrollingLayerPosition)
</del><ins>+        if (scrollingLayerPositionAction == ScrollingLayerPositionAction::Set)
</ins><span class="cx">             m_page-&gt;editorClient().overflowScrollPositionChanged();
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -344,22 +344,27 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::reconcileScrollingState(FrameView&amp; frameView, const FloatPoint&amp; scrollPosition, const LayoutViewportOriginOrOverrideRect&amp; layoutViewportOriginOrOverrideRect, bool programmaticScroll, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void AsyncScrollingCoordinator::reconcileScrollingState(FrameView&amp; frameView, const FloatPoint&amp; scrollPosition, const LayoutViewportOriginOrOverrideRect&amp; layoutViewportOriginOrOverrideRect, bool programmaticScroll, bool inStableState, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     bool oldProgrammaticScroll = frameView.inProgrammaticScroll();
</span><span class="cx">     frameView.setInProgrammaticScroll(programmaticScroll);
</span><span class="cx"> 
</span><ins>+    Optional&lt;FloatRect&gt; layoutViewportRect;
+
</ins><span class="cx">     WTF::switchOn(layoutViewportOriginOrOverrideRect,
</span><span class="cx">         [&amp;frameView](Optional&lt;FloatPoint&gt; origin) {
</span><span class="cx">             if (origin)
</span><span class="cx">                 frameView.setBaseLayoutViewportOrigin(LayoutPoint(origin.value()), FrameView::TriggerLayoutOrNot::No);
</span><del>-        }, [&amp;frameView](Optional&lt;FloatRect&gt; overrideRect) {
</del><ins>+        }, [&amp;frameView, &amp;layoutViewportRect, inStableState, visualViewportEnabled = visualViewportEnabled()](Optional&lt;FloatRect&gt; overrideRect) {
+            layoutViewportRect = overrideRect;
+            if (overrideRect &amp;&amp; inStableState) {
+                if (visualViewportEnabled)
+                    frameView.setLayoutViewportOverrideRect(LayoutRect(overrideRect.value()));
</ins><span class="cx"> #if PLATFORM(IOS)
</span><del>-            if (overrideRect)
-                frameView.setCustomFixedPositionLayoutRect(enclosingIntRect(overrideRect.value()));
-#else
-            UNUSED_PARAM(overrideRect);
</del><ins>+                else
+                    frameView.setCustomFixedPositionLayoutRect(enclosingIntRect(overrideRect.value()));
</ins><span class="cx"> #endif
</span><ins>+            }
</ins><span class="cx">         }
</span><span class="cx">     );
</span><span class="cx"> 
</span><span class="lines">@@ -368,8 +373,12 @@
</span><span class="cx">     frameView.setConstrainsScrollingToContentEdge(true);
</span><span class="cx">     frameView.setInProgrammaticScroll(oldProgrammaticScroll);
</span><span class="cx"> 
</span><del>-    if (!programmaticScroll &amp;&amp; scrollingLayerPositionAction == SyncScrollingLayerPosition)
-        syncViewportConstrainedLayerPositions(frameView.rectForFixedPositionLayout());
</del><ins>+    if (!programmaticScroll &amp;&amp; scrollingLayerPositionAction != ScrollingLayerPositionAction::Set) {
+        if (inStableState)
+            reconcileViewportConstrainedLayerPositions(frameView.rectForFixedPositionLayout(), scrollingLayerPositionAction);
+        else if (layoutViewportRect)
+            reconcileViewportConstrainedLayerPositions(LayoutRect(layoutViewportRect.value()), scrollingLayerPositionAction);
+    }
</ins><span class="cx"> 
</span><span class="cx">     GraphicsLayer* scrollLayer = scrollLayerForFrameView(frameView);
</span><span class="cx">     if (!scrollLayer)
</span><span class="lines">@@ -395,7 +404,7 @@
</span><span class="cx">     FloatPoint positionForFooterLayer = FloatPoint(scrollPositionForFixed.x(),
</span><span class="cx">         FrameView::yPositionForFooterLayer(scrollPosition, topContentInset, frameView.totalContentsSize().height(), frameView.footerHeight()));
</span><span class="cx"> 
</span><del>-    if (programmaticScroll || scrollingLayerPositionAction == SetScrollingLayerPosition) {
</del><ins>+    if (programmaticScroll || scrollingLayerPositionAction == ScrollingLayerPositionAction::Set) {
</ins><span class="cx">         scrollLayer-&gt;setPosition(-frameView.scrollPosition());
</span><span class="cx">         if (counterScrollingLayer)
</span><span class="cx">             counterScrollingLayer-&gt;setPosition(scrollPositionForFixed);
</span><span class="lines">@@ -455,7 +464,7 @@
</span><span class="cx">     m_scrollingStateTree-&gt;clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::syncViewportConstrainedLayerPositions(const LayoutRect&amp; viewportRect)
</del><ins>+void AsyncScrollingCoordinator::reconcileViewportConstrainedLayerPositions(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction action)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_scrollingStateTree-&gt;rootStateNode())
</span><span class="cx">         return;
</span><span class="lines">@@ -464,11 +473,11 @@
</span><span class="cx">     if (!children)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;AsyncScrollingCoordinator::syncChildPositions for viewport rect &quot; &lt;&lt; viewportRect);
</del><ins>+    LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;AsyncScrollingCoordinator::reconcileViewportConstrainedLayerPositions for viewport rect &quot; &lt;&lt; viewportRect);
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: We'll have to traverse deeper into the tree at some point.
</span><span class="cx">     for (auto&amp; child : *children)
</span><del>-        child-&gt;syncLayerPositionForViewportRect(viewportRect);
</del><ins>+        child-&gt;reconcileLayerPositionForViewportRect(viewportRect, action);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AsyncScrollingCoordinator::ensureRootStateNodeForFrameView(FrameView&amp; frameView)
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> 
</span><span class="cx">     void scrollingStateTreePropertiesChanged();
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void scheduleUpdateScrollPositionAfterAsyncScroll(ScrollingNodeID, const FloatPoint&amp;, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, bool programmaticScroll, SetOrSyncScrollingLayerPosition);
</del><ins>+    WEBCORE_EXPORT void scheduleUpdateScrollPositionAfterAsyncScroll(ScrollingNodeID, const FloatPoint&amp;, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, bool programmaticScroll, ScrollingLayerPositionAction);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     WEBCORE_EXPORT void setActiveScrollSnapIndices(ScrollingNodeID, unsigned horizontalIndex, unsigned verticalIndex);
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx"> 
</span><span class="cx">     PassRefPtr&lt;ScrollingTree&gt; releaseScrollingTree() { return WTFMove(m_scrollingTree); }
</span><span class="cx"> 
</span><del>-    void updateScrollPositionAfterAsyncScroll(ScrollingNodeID, const FloatPoint&amp;, Optional&lt;FloatPoint&gt; layoutViewportOrigin, bool programmaticScroll, SetOrSyncScrollingLayerPosition);
</del><ins>+    void updateScrollPositionAfterAsyncScroll(ScrollingNodeID, const FloatPoint&amp;, Optional&lt;FloatPoint&gt; layoutViewportOrigin, bool programmaticScroll, ScrollingLayerPositionAction);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT String scrollingStateTreeAsText() const override;
</span><span class="cx">     WEBCORE_EXPORT void willCommitTree() override;
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">     WEBCORE_EXPORT void updateFrameScrollingNode(ScrollingNodeID, GraphicsLayer* scrollLayer, GraphicsLayer* scrolledContentsLayer, GraphicsLayer* counterScrollingLayer, GraphicsLayer* insetClipLayer, const ScrollingGeometry* = nullptr) override;
</span><span class="cx">     WEBCORE_EXPORT void updateOverflowScrollingNode(ScrollingNodeID, GraphicsLayer* scrollLayer, GraphicsLayer* scrolledContentsLayer, const ScrollingGeometry* = nullptr) override;
</span><span class="cx">     
</span><del>-    WEBCORE_EXPORT void reconcileScrollingState(FrameView&amp;, const FloatPoint&amp;, const LayoutViewportOriginOrOverrideRect&amp;, bool programmaticScroll, SetOrSyncScrollingLayerPosition) override;
</del><ins>+    WEBCORE_EXPORT void reconcileScrollingState(FrameView&amp;, const FloatPoint&amp;, const LayoutViewportOriginOrOverrideRect&amp;, bool programmaticScroll, bool inStableState, ScrollingLayerPositionAction) override;
</ins><span class="cx"> 
</span><span class="cx">     bool isRubberBandInProgress() const override;
</span><span class="cx">     void setScrollPinningBehavior(ScrollPinningBehavior) override;
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx">     bool isScrollSnapInProgress() const override;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void syncViewportConstrainedLayerPositions(const LayoutRect&amp; viewportRect) override;
</del><ins>+    WEBCORE_EXPORT void reconcileViewportConstrainedLayerPositions(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction) override;
</ins><span class="cx">     WEBCORE_EXPORT void scrollableAreaScrollbarLayerDidChange(ScrollableArea&amp;, ScrollbarOrientation) override;
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void setSynchronousScrollingReasons(SynchronousScrollingReasons) override;
</span><span class="lines">@@ -132,7 +132,7 @@
</span><span class="cx"> 
</span><span class="cx">     struct ScheduledScrollUpdate {
</span><span class="cx">         ScheduledScrollUpdate() = default;
</span><del>-        ScheduledScrollUpdate(ScrollingNodeID scrollingNodeID, FloatPoint point, Optional&lt;FloatPoint&gt; viewportOrigin, bool isProgrammatic, SetOrSyncScrollingLayerPosition udpateAction)
</del><ins>+        ScheduledScrollUpdate(ScrollingNodeID scrollingNodeID, FloatPoint point, Optional&lt;FloatPoint&gt; viewportOrigin, bool isProgrammatic, ScrollingLayerPositionAction udpateAction)
</ins><span class="cx">             : nodeID(scrollingNodeID)
</span><span class="cx">             , scrollPosition(point)
</span><span class="cx">             , layoutViewportOrigin(viewportOrigin)
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">         FloatPoint scrollPosition;
</span><span class="cx">         Optional&lt;FloatPoint&gt; layoutViewportOrigin;
</span><span class="cx">         bool isProgrammaticScroll { false };
</span><del>-        SetOrSyncScrollingLayerPosition updateLayerPositionAction { SyncScrollingLayerPosition };
</del><ins>+        ScrollingLayerPositionAction updateLayerPositionAction { ScrollingLayerPositionAction::Sync };
</ins><span class="cx">         
</span><span class="cx">         bool matchesUpdateType(const ScheduledScrollUpdate&amp; other) const
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -436,4 +436,20 @@
</span><span class="cx">     return ts;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TextStream&amp; operator&lt;&lt;(TextStream&amp; ts, ScrollingLayerPositionAction action)
+{
+    switch (action) {
+    case ScrollingLayerPositionAction::Set:
+        ts &lt;&lt; &quot;set&quot;;
+        break;
+    case ScrollingLayerPositionAction::SetApproximate:
+        ts &lt;&lt; &quot;set approximate&quot;;
+        break;
+    case ScrollingLayerPositionAction::Sync:
+        ts &lt;&lt; &quot;sync&quot;;
+        break;
+    }
+    return ts;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -66,9 +66,10 @@
</span><span class="cx"> class ScrollingTree;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-enum SetOrSyncScrollingLayerPosition {
-    SetScrollingLayerPosition,
-    SyncScrollingLayerPosition
</del><ins>+enum class ScrollingLayerPositionAction {
+    Set,
+    SetApproximate,
+    Sync
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct ScrollableAreaParameters {
</span><span class="lines">@@ -119,7 +120,7 @@
</span><span class="cx">     virtual void frameViewLayoutUpdated(FrameView&amp;) { }
</span><span class="cx"> 
</span><span class="cx">     using LayoutViewportOriginOrOverrideRect = WTF::Variant&lt;Optional&lt;FloatPoint&gt;, Optional&lt;FloatRect&gt;&gt;;
</span><del>-    virtual void reconcileScrollingState(FrameView&amp;, const FloatPoint&amp;, const LayoutViewportOriginOrOverrideRect&amp;, bool /* programmaticScroll */, SetOrSyncScrollingLayerPosition) { }
</del><ins>+    virtual void reconcileScrollingState(FrameView&amp;, const FloatPoint&amp;, const LayoutViewportOriginOrOverrideRect&amp;, bool /* programmaticScroll */, bool /* inStableState*/, ScrollingLayerPositionAction) { }
</ins><span class="cx"> 
</span><span class="cx">     // Should be called whenever the slow repaint objects counter changes between zero and one.
</span><span class="cx">     void frameViewHasSlowRepaintObjectsDidChange(FrameView&amp;);
</span><span class="lines">@@ -176,7 +177,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void updateFrameScrollingNode(ScrollingNodeID, GraphicsLayer* /*scrollLayer*/, GraphicsLayer* /*scrolledContentsLayer*/, GraphicsLayer* /*counterScrollingLayer*/, GraphicsLayer* /*insetClipLayer*/, const ScrollingGeometry* = nullptr) { }
</span><span class="cx">     virtual void updateOverflowScrollingNode(ScrollingNodeID, GraphicsLayer* /*scrollLayer*/, GraphicsLayer* /*scrolledContentsLayer*/, const ScrollingGeometry* = nullptr) { }
</span><del>-    virtual void syncViewportConstrainedLayerPositions(const LayoutRect&amp;) { }
</del><ins>+    virtual void reconcileViewportConstrainedLayerPositions(const LayoutRect&amp;, ScrollingLayerPositionAction) { }
</ins><span class="cx">     virtual String scrollingStateTreeAsText() const;
</span><span class="cx">     virtual bool isRubberBandInProgress() const { return false; }
</span><span class="cx">     virtual bool isScrollSnapInProgress() const { return false; }
</span><span class="lines">@@ -235,6 +236,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WEBCORE_EXPORT TextStream&amp; operator&lt;&lt;(TextStream&amp;, ScrollingNodeType);
</span><ins>+WEBCORE_EXPORT TextStream&amp; operator&lt;&lt;(TextStream&amp;, ScrollingLayerPositionAction);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateFixedNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;ScrollingStateFixedNode.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GraphicsLayer.h&quot;
</span><ins>+#include &quot;Logging.h&quot;
</ins><span class="cx"> #include &quot;ScrollingStateTree.h&quot;
</span><span class="cx"> #include &quot;TextStream.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -68,11 +69,28 @@
</span><span class="cx">     setPropertyChanged(ViewportConstraints);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingStateFixedNode::syncLayerPositionForViewportRect(const LayoutRect&amp; viewportRect)
</del><ins>+void ScrollingStateFixedNode::reconcileLayerPositionForViewportRect(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction action)
</ins><span class="cx"> {
</span><span class="cx">     FloatPoint position = m_constraints.layerPositionForViewportRect(viewportRect);
</span><del>-    if (layer().representsGraphicsLayer())
-        static_cast&lt;GraphicsLayer*&gt;(layer())-&gt;syncPosition(position);
</del><ins>+    if (layer().representsGraphicsLayer()) {
+        GraphicsLayer* graphicsLayer = static_cast&lt;GraphicsLayer*&gt;(layer());
+
+        LOG_WITH_STREAM(Compositing, stream &lt;&lt; &quot;ScrollingStateFixedNode::reconcileLayerPositionForViewportRect setting position of layer &quot; &lt;&lt; graphicsLayer-&gt;primaryLayerID() &lt;&lt; &quot; to &quot; &lt;&lt; position);
+        
+        switch (action) {
+        case ScrollingLayerPositionAction::Set:
+            graphicsLayer-&gt;setPosition(position);
+            break;
+
+        case ScrollingLayerPositionAction::SetApproximate:
+            graphicsLayer-&gt;setApproximatePosition(position);
+            break;
+        
+        case ScrollingLayerPositionAction::Sync:
+            graphicsLayer-&gt;syncPosition(position);
+            break;
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingStateFixedNode::dumpProperties(TextStream&amp; ts, int indent, ScrollingStateTreeAsTextBehavior) const
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateFixedNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateFixedNode.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     ScrollingStateFixedNode(ScrollingStateTree&amp;, ScrollingNodeID);
</span><span class="cx">     ScrollingStateFixedNode(const ScrollingStateFixedNode&amp;, ScrollingStateTree&amp;);
</span><span class="cx"> 
</span><del>-    void syncLayerPositionForViewportRect(const LayoutRect&amp; viewportRect) override;
</del><ins>+    void reconcileLayerPositionForViewportRect(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction) override;
</ins><span class="cx"> 
</span><span class="cx">     void dumpProperties(TextStream&amp;, int indent, ScrollingStateTreeAsTextBehavior) const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateNode.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateNode.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateNode.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">     ChangedProperties changedProperties() const { return m_changedProperties; }
</span><span class="cx">     void setChangedProperties(ChangedProperties changedProperties) { m_changedProperties = changedProperties; }
</span><span class="cx">     
</span><del>-    virtual void syncLayerPositionForViewportRect(const LayoutRect&amp; /*viewportRect*/) { }
</del><ins>+    virtual void reconcileLayerPositionForViewportRect(const LayoutRect&amp; /*viewportRect*/, ScrollingLayerPositionAction) { }
</ins><span class="cx"> 
</span><span class="cx">     const LayerRepresentation&amp; layer() const { return m_layer; }
</span><span class="cx">     WEBCORE_EXPORT void setLayer(const LayerRepresentation&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateStickyNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GraphicsLayer.h&quot;
</span><ins>+#include &quot;Logging.h&quot;
</ins><span class="cx"> #include &quot;ScrollingStateTree.h&quot;
</span><span class="cx"> #include &quot;TextStream.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -68,11 +69,28 @@
</span><span class="cx">     setPropertyChanged(ViewportConstraints);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingStateStickyNode::syncLayerPositionForViewportRect(const LayoutRect&amp; viewportRect)
</del><ins>+void ScrollingStateStickyNode::reconcileLayerPositionForViewportRect(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction action)
</ins><span class="cx"> {
</span><span class="cx">     FloatPoint position = m_constraints.layerPositionForConstrainingRect(viewportRect);
</span><del>-    if (layer().representsGraphicsLayer())
-        static_cast&lt;GraphicsLayer*&gt;(layer())-&gt;syncPosition(position);
</del><ins>+    if (layer().representsGraphicsLayer()) {
+        GraphicsLayer* graphicsLayer = static_cast&lt;GraphicsLayer*&gt;(layer());
+
+        LOG_WITH_STREAM(Compositing, stream &lt;&lt; &quot;ScrollingStateStickyNode::reconcileLayerPositionForViewportRect setting position of layer &quot; &lt;&lt; graphicsLayer-&gt;primaryLayerID() &lt;&lt; &quot; to &quot; &lt;&lt; position);
+        
+        switch (action) {
+        case ScrollingLayerPositionAction::Set:
+            graphicsLayer-&gt;setPosition(position);
+            break;
+
+        case ScrollingLayerPositionAction::SetApproximate:
+            graphicsLayer-&gt;setApproximatePosition(position);
+            break;
+        
+        case ScrollingLayerPositionAction::Sync:
+            graphicsLayer-&gt;syncPosition(position);
+            break;
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingStateStickyNode::dumpProperties(TextStream&amp; ts, int indent, ScrollingStateTreeAsTextBehavior) const
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateStickyNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     ScrollingStateStickyNode(ScrollingStateTree&amp;, ScrollingNodeID);
</span><span class="cx">     ScrollingStateStickyNode(const ScrollingStateStickyNode&amp;, ScrollingStateTree&amp;);
</span><span class="cx"> 
</span><del>-    void syncLayerPositionForViewportRect(const LayoutRect&amp; viewportRect) override;
</del><ins>+    void reconcileLayerPositionForViewportRect(const LayoutRect&amp; viewportRect, ScrollingLayerPositionAction) override;
</ins><span class="cx"> 
</span><span class="cx">     void dumpProperties(TextStream&amp;, int indent, ScrollingStateTreeAsTextBehavior) const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingTreecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx">     downcast&lt;ScrollingTreeOverflowScrollingNode&gt;(*node).updateLayersAfterDelegatedScroll(scrollPosition);
</span><span class="cx"> 
</span><span class="cx">     // Update GraphicsLayers and scroll state.
</span><del>-    scrollingTreeNodeDidScroll(nodeID, scrollPosition, Nullopt, inUserInteration ? SyncScrollingLayerPosition : SetScrollingLayerPosition);
</del><ins>+    scrollingTreeNodeDidScroll(nodeID, scrollPosition, Nullopt, inUserInteration ? ScrollingLayerPositionAction::Sync : ScrollingLayerPositionAction::Set);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingTree::commitTreeState(std::unique_ptr&lt;ScrollingStateTree&gt; scrollingStateTree)
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingTreeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingTree.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Called after a scrolling tree node has handled a scroll and updated its layers.
</span><span class="cx">     // Updates FrameView/RenderLayer scrolling state and GraphicsLayers.
</span><del>-    virtual void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition = SyncScrollingLayerPosition) = 0;
</del><ins>+    virtual void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction = ScrollingLayerPositionAction::Sync) = 0;
</ins><span class="cx"> 
</span><span class="cx">     // Called for requested scroll position updates.
</span><span class="cx">     virtual void scrollingTreeNodeRequestsScroll(ScrollingNodeID, const FloatPoint&amp; /*scrollPosition*/, bool /*representsProgrammaticScroll*/) { }
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingThreadedScrollingTreecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">     ScrollingTree::commitTreeState(WTFMove(scrollingStateTree));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ThreadedScrollingTree::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void ThreadedScrollingTree::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_scrollingCoordinator)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingThreadedScrollingTreeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> protected:
</span><span class="cx">     explicit ThreadedScrollingTree(AsyncScrollingCoordinator*);
</span><span class="cx"> 
</span><del>-    void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition = SyncScrollingLayerPosition) override;
</del><ins>+    void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction = ScrollingLayerPositionAction::Sync) override;
</ins><span class="cx">     void currentSnapPointIndicesDidChange(ScrollingNodeID, unsigned horizontal, unsigned vertical) override;
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     void handleWheelEventPhase(PlatformWheelEventPhase) override;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingiosScrollingTreeFrameScrollingNodeIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (shouldUpdateScrollLayerPositionSynchronously()) {
</span><span class="cx">         m_probableMainThreadScrollPosition = scrollPosition;
</span><del>-        scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, Nullopt, SetScrollingLayerPosition);
</del><ins>+        scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, Nullopt, ScrollingLayerPositionAction::Set);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingTreeIOS::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void ScrollingTreeIOS::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_scrollingCoordinator)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingiosScrollingTreeIOSh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> 
</span><span class="cx">     PassRefPtr&lt;ScrollingTreeNode&gt; createScrollingTreeNode(ScrollingNodeType, ScrollingNodeID) override;
</span><span class="cx"> 
</span><del>-    void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition = SyncScrollingLayerPosition) override;
</del><ins>+    void scrollingTreeNodeDidScroll(ScrollingNodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction = ScrollingLayerPositionAction::Sync) override;
</ins><span class="cx"> 
</span><span class="cx">     void currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID, unsigned horizontal, unsigned vertical) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -400,7 +400,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (shouldUpdateScrollLayerPositionSynchronously()) {
</span><span class="cx">         m_probableMainThreadScrollPosition = scrollPosition;
</span><del>-        scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, layoutViewportOrigin, SetScrollingLayerPosition);
</del><ins>+        scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, layoutViewportOrigin, ScrollingLayerPositionAction::Set);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -692,6 +692,11 @@
</span><span class="cx">         ts &lt;&lt; &quot;(position &quot; &lt;&lt; m_position.x() &lt;&lt; &quot; &quot; &lt;&lt; m_position.y() &lt;&lt; &quot;)\n&quot;;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (m_approximatePosition) {
+        writeIndent(ts, indent + 1);
+        ts &lt;&lt; &quot;(approximate position &quot; &lt;&lt; m_approximatePosition.value().x() &lt;&lt; &quot; &quot; &lt;&lt; m_approximatePosition.value().y() &lt;&lt; &quot;)\n&quot;;
+    }
+
</ins><span class="cx">     if (m_boundsOrigin != FloatPoint()) {
</span><span class="cx">         writeIndent(ts, indent + 1);
</span><span class="cx">         ts &lt;&lt; &quot;(bounds origin &quot; &lt;&lt; m_boundsOrigin.x() &lt;&lt; &quot; &quot; &lt;&lt; m_boundsOrigin.y() &lt;&lt; &quot;)\n&quot;;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -307,8 +307,12 @@
</span><span class="cx"> 
</span><span class="cx">     // The position of the layer (the location of its top-left corner in its parent)
</span><span class="cx">     const FloatPoint&amp; position() const { return m_position; }
</span><del>-    virtual void setPosition(const FloatPoint&amp; p) { m_position = p; }
</del><ins>+    virtual void setPosition(const FloatPoint&amp; p) { m_approximatePosition = Nullopt; m_position = p; }
</ins><span class="cx"> 
</span><ins>+    // approximatePosition, if set, overrides position() and is used during coverage rect computation.
+    FloatPoint approximatePosition() const { return m_approximatePosition ? m_approximatePosition.value() : m_position; }
+    void setApproximatePosition(Optional&lt;FloatPoint&gt; p) { m_approximatePosition = p; }
+
</ins><span class="cx">     // For platforms that move underlying platform layers on a different thread for scrolling; just update the GraphicsLayer state.
</span><span class="cx">     virtual void syncPosition(const FloatPoint&amp; p) { m_position = p; }
</span><span class="cx"> 
</span><span class="lines">@@ -513,8 +517,8 @@
</span><span class="cx">     // Some compositing systems may do internal batching to synchronize compositing updates
</span><span class="cx">     // with updates drawn into the window. These methods flush internal batched state on this layer
</span><span class="cx">     // and descendant layers, and this layer only.
</span><del>-    virtual void flushCompositingState(const FloatRect&amp; /* clipRect */, bool /* viewportIsStable */) { }
-    virtual void flushCompositingStateForThisLayerOnly(bool /* viewportIsStable */) { }
</del><ins>+    virtual void flushCompositingState(const FloatRect&amp; /* clipRect */) { }
+    virtual void flushCompositingStateForThisLayerOnly() { }
</ins><span class="cx"> 
</span><span class="cx">     // If the exposed rect of this layer changes, returns true if this or descendant layers need a flush,
</span><span class="cx">     // for example to allocate new tiles.
</span><span class="lines">@@ -596,6 +600,10 @@
</span><span class="cx">     
</span><span class="cx">     // Position is relative to the parent GraphicsLayer
</span><span class="cx">     FloatPoint m_position;
</span><ins>+
+    // If set, overrides m_position. Only used for coverage computation.
+    Optional&lt;FloatPoint&gt; m_approximatePosition;
+
</ins><span class="cx">     FloatPoint3D m_anchorPoint;
</span><span class="cx">     FloatSize m_size;
</span><span class="cx">     FloatPoint m_boundsOrigin;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -1126,20 +1126,20 @@
</span><span class="cx">     return FloatPoint();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GraphicsLayerCA::flushCompositingState(const FloatRect&amp; clipRect, bool viewportIsStable)
</del><ins>+void GraphicsLayerCA::flushCompositingState(const FloatRect&amp; clipRect)
</ins><span class="cx"> {
</span><span class="cx">     TransformState state(TransformState::UnapplyInverseTransformDirection, FloatQuad(clipRect));
</span><span class="cx">     FloatQuad coverageQuad(clipRect);
</span><span class="cx">     state.setSecondaryQuad(&amp;coverageQuad);
</span><del>-    recursiveCommitChanges(CommitState(viewportIsStable), state);
</del><ins>+    recursiveCommitChanges(CommitState(), state);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GraphicsLayerCA::flushCompositingStateForThisLayerOnly(bool viewportIsStable)
</del><ins>+void GraphicsLayerCA::flushCompositingStateForThisLayerOnly()
</ins><span class="cx"> {
</span><span class="cx">     float pageScaleFactor;
</span><span class="cx">     bool hadChanges = m_uncommittedChanges;
</span><span class="cx">     
</span><del>-    CommitState commitState(viewportIsStable);
</del><ins>+    CommitState commitState;
</ins><span class="cx"> 
</span><span class="cx">     FloatPoint offset = computePositionRelativeToBase(pageScaleFactor);
</span><span class="cx">     commitLayerChangesBeforeSublayers(commitState, pageScaleFactor, offset);
</span><span class="lines">@@ -1234,7 +1234,7 @@
</span><span class="cx"> 
</span><span class="cx"> GraphicsLayerCA::VisibleAndCoverageRects GraphicsLayerCA::computeVisibleAndCoverageRect(TransformState&amp; state, bool preserves3D, ComputeVisibleRectFlags flags) const
</span><span class="cx"> {
</span><del>-    FloatPoint position = m_position;
</del><ins>+    FloatPoint position = approximatePosition();
</ins><span class="cx">     client().customPositionForVisibleRectComputation(this, position);
</span><span class="cx"> 
</span><span class="cx">     TransformationMatrix layerTransform;
</span><span class="lines">@@ -1306,7 +1306,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GraphicsLayerCA::setVisibleAndCoverageRects(const VisibleAndCoverageRects&amp; rects, bool isViewportConstrained, bool viewportIsStable)
</del><ins>+void GraphicsLayerCA::setVisibleAndCoverageRects(const VisibleAndCoverageRects&amp; rects, bool isViewportConstrained)
</ins><span class="cx"> {
</span><span class="cx">     bool visibleRectChanged = rects.visibleRect != m_visibleRect;
</span><span class="cx">     bool coverageRectChanged = rects.coverageRect != m_coverageRect;
</span><span class="lines">@@ -1313,9 +1313,6 @@
</span><span class="cx">     if (!visibleRectChanged &amp;&amp; !coverageRectChanged)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (isViewportConstrained &amp;&amp; !viewportIsStable)
-        return;
-
</del><span class="cx">     // FIXME: we need to take reflections into account when determining whether this layer intersects the coverage rect.
</span><span class="cx">     bool intersectsCoverageRect = isViewportConstrained || rects.coverageRect.intersects(FloatRect(m_boundsOrigin, size()));
</span><span class="cx">     if (intersectsCoverageRect != m_intersectsCoverageRect) {
</span><span class="lines">@@ -1366,7 +1363,7 @@
</span><span class="cx">             localState.setLastPlanarSecondaryQuad(&amp;secondaryQuad);
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    setVisibleAndCoverageRects(rects, m_isViewportConstrained || commitState.ancestorIsViewportConstrained, commitState.viewportIsStable);
</del><ins>+    setVisibleAndCoverageRects(rects, m_isViewportConstrained || commitState.ancestorIsViewportConstrained);
</ins><span class="cx"> 
</span><span class="cx"> #ifdef VISIBLE_TILE_WASH
</span><span class="cx">     // Use having a transform as a key to making the tile wash layer. If every layer gets a wash,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -153,17 +153,11 @@
</span><span class="cx">         int treeDepth { 0 };
</span><span class="cx">         bool ancestorHasTransformAnimation { false };
</span><span class="cx">         bool ancestorIsViewportConstrained { false };
</span><del>-        bool viewportIsStable { true };
-        
-        CommitState(bool stableViewport)
-            : viewportIsStable(stableViewport)
-        {
-        }
</del><span class="cx">     };
</span><span class="cx">     void recursiveCommitChanges(const CommitState&amp;, const TransformState&amp;, float pageScaleFactor = 1, const FloatPoint&amp; positionRelativeToBase = FloatPoint(), bool affectedByPageScale = false);
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void flushCompositingState(const FloatRect&amp;, bool viewportIsStable) override;
-    WEBCORE_EXPORT void flushCompositingStateForThisLayerOnly(bool viewportIsStable) override;
</del><ins>+    WEBCORE_EXPORT void flushCompositingState(const FloatRect&amp;) override;
+    WEBCORE_EXPORT void flushCompositingStateForThisLayerOnly() override;
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool visibleRectChangeRequiresFlush(const FloatRect&amp; visibleRect) const override;
</span><span class="cx"> 
</span><span class="lines">@@ -310,7 +304,7 @@
</span><span class="cx">     const FloatRect&amp; visibleRect() const { return m_visibleRect; }
</span><span class="cx">     const FloatRect&amp; coverageRect() const { return m_coverageRect; }
</span><span class="cx"> 
</span><del>-    void setVisibleAndCoverageRects(const VisibleAndCoverageRects&amp;, bool isViewportConstrained, bool viewportIsStable);
</del><ins>+    void setVisibleAndCoverageRects(const VisibleAndCoverageRects&amp;, bool isViewportConstrained);
</ins><span class="cx">     
</span><span class="cx">     static FloatRect adjustTiledLayerVisibleRect(TiledBacking*, const FloatRect&amp; oldVisibleRect, const FloatRect&amp; newVisibleRect, const FloatSize&amp; oldSize, const FloatSize&amp; newSize);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapGraphicsLayerTextureMappercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -364,7 +364,7 @@
</span><span class="cx">     notifyChange(IsScrollableChange);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GraphicsLayerTextureMapper::flushCompositingStateForThisLayerOnly(bool)
</del><ins>+void GraphicsLayerTextureMapper::flushCompositingStateForThisLayerOnly()
</ins><span class="cx"> {
</span><span class="cx">     prepareBackingStoreIfNeeded();
</span><span class="cx">     commitLayerChanges();
</span><span class="lines">@@ -497,19 +497,19 @@
</span><span class="cx">     m_changeMask = NoChanges;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GraphicsLayerTextureMapper::flushCompositingState(const FloatRect&amp; rect, bool viewportIsStable)
</del><ins>+void GraphicsLayerTextureMapper::flushCompositingState(const FloatRect&amp; rect)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_layer.textureMapper())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+    flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     if (maskLayer())
</span><del>-        maskLayer()-&gt;flushCompositingState(rect, viewportIsStable);
</del><ins>+        maskLayer()-&gt;flushCompositingState(rect);
</ins><span class="cx">     if (replicaLayer())
</span><del>-        replicaLayer()-&gt;flushCompositingState(rect, viewportIsStable);
</del><ins>+        replicaLayer()-&gt;flushCompositingState(rect);
</ins><span class="cx">     for (auto* child : children())
</span><del>-        child-&gt;flushCompositingState(rect, viewportIsStable);
</del><ins>+        child-&gt;flushCompositingState(rect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GraphicsLayerTextureMapper::updateBackingStoreIncludingSubLayers()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapGraphicsLayerTextureMapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -83,8 +83,8 @@
</span><span class="cx">     void setDebugBorder(const Color&amp;, float width) override;
</span><span class="cx">     void setShowRepaintCounter(bool) override;
</span><span class="cx"> 
</span><del>-    void flushCompositingState(const FloatRect&amp;, bool) override;
-    void flushCompositingStateForThisLayerOnly(bool) override;
</del><ins>+    void flushCompositingState(const FloatRect&amp;) override;
+    void flushCompositingStateForThisLayerOnly() override;
</ins><span class="cx"> 
</span><span class="cx">     void updateBackingStoreIncludingSubLayers();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -599,18 +599,18 @@
</span><span class="cx">     didChangeLayerState();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CoordinatedGraphicsLayer::flushCompositingState(const FloatRect&amp; rect, bool viewportIsStable)
</del><ins>+void CoordinatedGraphicsLayer::flushCompositingState(const FloatRect&amp; rect)
</ins><span class="cx"> {
</span><span class="cx">     if (CoordinatedGraphicsLayer* mask = downcast&lt;CoordinatedGraphicsLayer&gt;(maskLayer()))
</span><del>-        mask-&gt;flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+        mask-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     if (CoordinatedGraphicsLayer* replica = downcast&lt;CoordinatedGraphicsLayer&gt;(replicaLayer()))
</span><del>-        replica-&gt;flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+        replica-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><del>-    flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+    flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     for (auto&amp; child : children())
</span><del>-        child-&gt;flushCompositingState(rect, viewportIsStable);
</del><ins>+        child-&gt;flushCompositingState(rect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CoordinatedGraphicsLayer::syncChildren()
</span><span class="lines">@@ -784,7 +784,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly(bool)
</del><ins>+void CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly()
</ins><span class="cx"> {
</span><span class="cx">     // When we have a transform animation, we need to update visible rect every frame to adjust the visible rect of a backing store.
</span><span class="cx">     bool hasActiveTransformAnimation = selfOrAncestorHasActiveTransformAnimation();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -103,8 +103,8 @@
</span><span class="cx">     void setNeedsDisplayInRect(const FloatRect&amp;, ShouldClipToLayer = ClipToLayer) override;
</span><span class="cx">     void setContentsNeedsDisplay() override;
</span><span class="cx">     void deviceOrPageScaleFactorChanged() override;
</span><del>-    void flushCompositingState(const FloatRect&amp;, bool) override;
-    void flushCompositingStateForThisLayerOnly(bool) override;
</del><ins>+    void flushCompositingState(const FloatRect&amp;) override;
+    void flushCompositingStateForThisLayerOnly() override;
</ins><span class="cx">     bool setFilters(const FilterOperations&amp;) override;
</span><span class="cx">     bool addAnimation(const KeyframeValueList&amp;, const FloatSize&amp;, const Animation*, const String&amp;, double) override;
</span><span class="cx">     void pauseAnimation(const String&amp;, double) override;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -453,9 +453,8 @@
</span><span class="cx">     if (GraphicsLayer* rootLayer = rootGraphicsLayer()) {
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">         FloatRect exposedRect = frameView.exposedContentRect();
</span><del>-        LOG(Compositing, &quot;RenderLayerCompositor %p flushPendingLayerChanges(%d) %.2f, %.2f, %.2fx%.2f (stable viewport %d)&quot;, this, isFlushRoot,
-            exposedRect.x(), exposedRect.y(), exposedRect.width(), exposedRect.height(), frameView.viewportIsStable());
-        rootLayer-&gt;flushCompositingState(exposedRect, frameView.viewportIsStable());
</del><ins>+        LOG_WITH_STREAM(Compositing, stream &lt;&lt; &quot;RenderLayerCompositor &quot; &lt;&lt; this &lt;&lt; &quot; flushPendingLayerChanges (root &quot; &lt;&lt; isFlushRoot &lt;&lt; &quot;) exposedRect &quot; &lt;&lt; exposedRect);
+        rootLayer-&gt;flushCompositingState(exposedRect);
</ins><span class="cx"> #else
</span><span class="cx">         // Having a m_clipLayer indicates that we're doing scrolling via GraphicsLayers.
</span><span class="cx">         FloatRect visibleRect = m_clipLayer ? FloatRect({ 0, 0 }, frameView.sizeForVisibleContent()) : frameView.visibleContentRect();
</span><span class="lines">@@ -463,8 +462,8 @@
</span><span class="cx">         if (frameView.viewExposedRect())
</span><span class="cx">             visibleRect.intersect(frameView.viewExposedRect().value());
</span><span class="cx"> 
</span><del>-        LOG_WITH_STREAM(Compositing,  stream &lt;&lt; &quot;RenderLayerCompositor &quot; &lt;&lt; this &lt;&lt; &quot; flushPendingLayerChanges(&quot; &lt;&lt; isFlushRoot &lt;&lt; &quot;) &quot; &lt;&lt; visibleRect &lt;&lt; &quot; (stable viewport &quot; &lt;&lt; frameView.viewportIsStable() &lt;&lt; &quot;)&quot;);
-        rootLayer-&gt;flushCompositingState(visibleRect, frameView.viewportIsStable());
</del><ins>+        LOG_WITH_STREAM(Compositing,  stream &lt;&lt; &quot;RenderLayerCompositor &quot; &lt;&lt; this &lt;&lt; &quot; flushPendingLayerChanges(&quot; &lt;&lt; isFlushRoot &lt;&lt; &quot;) &quot; &lt;&lt; visibleRect);
+        rootLayer-&gt;flushCompositingState(visibleRect);
</ins><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit/win/ChangeLog        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-11-19  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] When zoomed in and panning on pages with fixed bars, parts of the bars are sometimes missing
+        https://bugs.webkit.org/show_bug.cgi?id=164855
+
+        Reviewed by Sam Weinig.
+        
+        Remove the &quot;inStableState&quot; parameter from flushCompositingState() etc.
+
+        * WebCoreSupport/AcceleratedCompositingContext.cpp:
+        (AcceleratedCompositingContext::flushPendingLayerChanges):
+        * WebView.cpp:
+        (WebView::flushPendingGraphicsLayerChanges):
+
</ins><span class="cx"> 2016-11-16  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ES6][WebCore] Change ES6_MODULES compile time flag to runtime flag
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebCoreSupportAcceleratedCompositingContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebCoreSupport/AcceleratedCompositingContext.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebCoreSupport/AcceleratedCompositingContext.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit/win/WebCoreSupport/AcceleratedCompositingContext.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -355,8 +355,8 @@
</span><span class="cx"> bool AcceleratedCompositingContext::flushPendingLayerChanges()
</span><span class="cx"> {
</span><span class="cx">     FrameView* frameView = core(&amp;m_webView)-&gt;mainFrame().view();
</span><del>-    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly(frameView-&gt;viewportIsStable());
-    m_nonCompositedContentLayer-&gt;flushCompositingStateForThisLayerOnly(frameView-&gt;viewportIsStable());
</del><ins>+    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly();
+    m_nonCompositedContentLayer-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx">     if (!frameView-&gt;flushCompositingStateIncludingSubframes())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit/win/WebView.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -7352,7 +7352,7 @@
</span><span class="cx"> #if USE(CA)
</span><span class="cx">     // Updating layout might have taken us out of compositing mode.
</span><span class="cx">     if (m_backingLayer)
</span><del>-        m_backingLayer-&gt;flushCompositingStateForThisLayerOnly(view-&gt;viewportIsStable());
</del><ins>+        m_backingLayer-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     view-&gt;flushCompositingStateIncludingSubframes();
</span><span class="cx"> #elif USE(TEXTURE_MAPPER_GL)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/ChangeLog        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -1,3 +1,48 @@
</span><ins>+2016-11-19  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] When zoomed in and panning on pages with fixed bars, parts of the bars are sometimes missing
+        https://bugs.webkit.org/show_bug.cgi?id=164855
+
+        Reviewed by Sam Weinig.
+
+        During UI-process panning and zooming, we send visible rect updates to the web process
+        with inStableState=false, and don't update GraphicsLayers until we get into a stable state.
+
+        This causes a problem where the web process has a stale notion of where the GraphicsLayers
+        for position:fixed elements are, but is then told to update tiling coverage with an up-to-date
+        visible rect. The existing &quot;sync layer positions&quot; path isn't useful to fix this, because it
+        breaks the relationship between the GraphicsLayer positions and their FixedPositionViewportConstraints
+        in the scrolling tree.
+
+        To address this, add the notion of an Optional&lt;&gt; approximatePosition on GraphicsLayers. This is used
+        only by the coverageRect computation code path, and is cleared by a setPosition(). ApproximatePositions
+        are pushed onto GraphicsLayers via the syncViewportConstrainedLayerPositions() code path (renamed to
+        reconcileViewportConstrainedLayerPositions).
+
+        Tested by scrollingcoordinator/ios/non-stable-viewport-scroll.html
+
+        * UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp:
+        (WebKit::RemoteScrollingCoordinatorProxy::scrollingTreeNodeDidScroll):
+        * UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h:
+        * UIProcess/Scrolling/RemoteScrollingTree.cpp:
+        (WebKit::RemoteScrollingTree::scrollingTreeNodeDidScroll):
+        * UIProcess/Scrolling/RemoteScrollingTree.h:
+        * WebProcess/Scrolling/RemoteScrollingCoordinator.mm:
+        (WebKit::RemoteScrollingCoordinator::scrollPositionChangedForNode):
+        * WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp:
+        (WebKit::CompositingCoordinator::flushPendingLayerChanges):
+        * WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp:
+        (WebKit::CoordinatedLayerTreeHost::didFlushRootLayer):
+        * WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp:
+        (WebKit::LayerTreeHostGtk::flushPendingLayerChanges):
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::updateVisibleContentRects): Always push the custom fixed position rect down, but send
+        ScrollingLayerPositionAction::SetApproximate if the state is not stable.
+        * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+        (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::flushLayers):
+
</ins><span class="cx"> 2016-11-18  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make it possible to test non-stable-state scrolling on iOS
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -163,7 +163,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // This comes from the scrolling tree.
</span><del>-void RemoteScrollingCoordinatorProxy::scrollingTreeNodeDidScroll(ScrollingNodeID scrolledNodeID, const FloatPoint&amp; newScrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void RemoteScrollingCoordinatorProxy::scrollingTreeNodeDidScroll(ScrollingNodeID scrolledNodeID, const FloatPoint&amp; newScrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     // Scroll updates for the main frame are sent via WebPageProxy::updateVisibleContentRects()
</span><span class="cx">     // so don't send them here.
</span><span class="lines">@@ -173,7 +173,7 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     m_webPageProxy.overflowScrollViewDidScroll();
</span><span class="cx"> #endif
</span><del>-    m_webPageProxy.send(Messages::RemoteScrollingCoordinator::ScrollPositionChangedForNode(scrolledNodeID, newScrollPosition, scrollingLayerPositionAction));
</del><ins>+    m_webPageProxy.send(Messages::RemoteScrollingCoordinator::ScrollPositionChangedForNode(scrolledNodeID, newScrollPosition, scrollingLayerPositionAction == ScrollingLayerPositionAction::Sync));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteScrollingCoordinatorProxy::scrollingTreeNodeRequestsScroll(ScrollingNodeID scrolledNodeID, const FloatPoint&amp; scrollPosition, bool representsProgrammaticScroll)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     bool visualViewportEnabled() const { return m_scrollingTree &amp;&amp; m_scrollingTree-&gt;visualViewportEnabled(); }
</span><span class="cx"> 
</span><span class="cx">     // Inform the web process that the scroll position changed (called from the scrolling tree)
</span><del>-    void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; newScrollPosition, const Optional&lt;WebCore::FloatPoint&gt;&amp; layoutViewportOrigin, WebCore::SetOrSyncScrollingLayerPosition);
</del><ins>+    void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; newScrollPosition, const Optional&lt;WebCore::FloatPoint&gt;&amp; layoutViewportOrigin, WebCore::ScrollingLayerPositionAction);
</ins><span class="cx">     void scrollingTreeNodeRequestsScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; scrollPosition, bool representsProgrammaticScroll);
</span><span class="cx"> 
</span><span class="cx">     WebCore::TrackingType eventTrackingTypeForPoint(const AtomicString&amp; eventName, WebCore::IntPoint) const;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingTreecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
</del><ins>+void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, const Optional&lt;FloatPoint&gt;&amp; layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
</ins><span class="cx"> {
</span><span class="cx">     m_scrollingCoordinatorProxy.scrollingTreeNodeDidScroll(nodeID, scrollPosition, layoutViewportOrigin, scrollingLayerPositionAction);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingTreeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.h (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.h        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingTree.h        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx"> 
</span><span class="cx">     const RemoteScrollingCoordinatorProxy&amp; scrollingCoordinatorProxy() const { return m_scrollingCoordinatorProxy; }
</span><span class="cx"> 
</span><del>-    void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; scrollPosition, const Optional&lt;WebCore::FloatPoint&gt;&amp; layoutViewportOrigin, WebCore::SetOrSyncScrollingLayerPosition = WebCore::SyncScrollingLayerPosition) override;
</del><ins>+    void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; scrollPosition, const Optional&lt;WebCore::FloatPoint&gt;&amp; layoutViewportOrigin, WebCore::ScrollingLayerPositionAction = WebCore::ScrollingLayerPositionAction::Sync) override;
</ins><span class="cx">     void scrollingTreeNodeRequestsScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; scrollPosition, bool representsProgrammaticScroll) override;
</span><span class="cx"> 
</span><span class="cx">     void currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID, unsigned horizontal, unsigned vertical) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessScrollingRemoteScrollingCoordinatormm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Scrolling/RemoteScrollingCoordinator.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Scrolling/RemoteScrollingCoordinator.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/Scrolling/RemoteScrollingCoordinator.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -97,7 +97,7 @@
</span><span class="cx"> // Notification from the UI process that we scrolled.
</span><span class="cx"> void RemoteScrollingCoordinator::scrollPositionChangedForNode(ScrollingNodeID nodeID, const FloatPoint&amp; scrollPosition, bool syncLayerPosition)
</span><span class="cx"> {
</span><del>-    scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, Nullopt, false /* FIXME */, syncLayerPosition ? SyncScrollingLayerPosition : SetScrollingLayerPosition);
</del><ins>+    scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, Nullopt, false /* FIXME */, syncLayerPosition ? ScrollingLayerPositionAction::Sync : ScrollingLayerPositionAction::Set);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteScrollingCoordinator::currentSnapPointIndicesChangedForNode(ScrollingNodeID nodeID, unsigned horizontal, unsigned vertical)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsCompositingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -103,12 +103,11 @@
</span><span class="cx"> 
</span><span class="cx">     initializeRootCompositingLayerIfNeeded();
</span><span class="cx"> 
</span><del>-    bool viewportIsStable = m_page-&gt;mainFrame().view()-&gt;viewportIsStable();
-    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx">     m_client.didFlushRootLayer(m_visibleContentsRect);
</span><span class="cx"> 
</span><span class="cx">     if (m_overlayCompositingLayer)
</span><del>-        m_overlayCompositingLayer-&gt;flushCompositingState(FloatRect(FloatPoint(), m_rootLayer-&gt;size()), viewportIsStable);
</del><ins>+        m_overlayCompositingLayer-&gt;flushCompositingState(FloatRect(FloatPoint(), m_rootLayer-&gt;size()));
</ins><span class="cx"> 
</span><span class="cx">     bool didSync = m_page-&gt;mainFrame().view()-&gt;flushCompositingStateIncludingSubframes();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsCoordinatedLayerTreeHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedLayerTreeHost.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -154,7 +154,7 @@
</span><span class="cx"> {
</span><span class="cx">     // Because our view-relative overlay root layer is not attached to the FrameView's GraphicsLayer tree, we need to flush it manually.
</span><span class="cx">     if (m_viewOverlayRootLayer)
</span><del>-        m_viewOverlayRootLayer-&gt;flushCompositingState(visibleContentRect,  m_webPage.mainFrame()-&gt;view()-&gt;viewportIsStable());
</del><ins>+        m_viewOverlayRootLayer-&gt;flushCompositingState(visibleContentRect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CoordinatedLayerTreeHost::layerFlushTimerFired()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -307,15 +307,14 @@
</span><span class="cx"> 
</span><span class="cx"> bool LayerTreeHostGtk::flushPendingLayerChanges()
</span><span class="cx"> {
</span><del>-    bool viewportIsStable = m_webPage.corePage()-&gt;mainFrame().view()-&gt;viewportIsStable();
-    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly(viewportIsStable);
-    m_nonCompositedContentLayer-&gt;flushCompositingStateForThisLayerOnly(viewportIsStable);
</del><ins>+    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly();
+    m_nonCompositedContentLayer-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     if (!m_webPage.corePage()-&gt;mainFrame().view()-&gt;flushCompositingStateIncludingSubframes())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (m_viewOverlayRootLayer)
</span><del>-        m_viewOverlayRootLayer-&gt;flushCompositingState(FloatRect(FloatPoint(), m_rootLayer-&gt;size()), viewportIsStable);
</del><ins>+        m_viewOverlayRootLayer-&gt;flushCompositingState(FloatRect(FloatPoint(), m_rootLayer-&gt;size()));
</ins><span class="cx"> 
</span><span class="cx">     downcast&lt;GraphicsLayerTextureMapper&gt;(*m_rootLayer).updateBackingStoreIncludingSubLayers();
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -2998,6 +2998,8 @@
</span><span class="cx">     if (visibleContentRectUpdateInfo.lastLayerTreeTransactionID() &lt; m_mainFrame-&gt;firstLayerTreeTransactionIDAfterDidCommitLoad())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    LOG_WITH_STREAM(VisibleRects, stream &lt;&lt; &quot;\nWebPage::updateVisibleContentRects &quot; &lt;&lt; visibleContentRectUpdateInfo);
+
</ins><span class="cx">     m_hasReceivedVisibleContentRectsAfterDidCommitLoad = true;
</span><span class="cx">     m_isInStableState = visibleContentRectUpdateInfo.inStableState();
</span><span class="cx"> 
</span><span class="lines">@@ -3063,10 +3065,8 @@
</span><span class="cx">     double scaleChangeRate = visibleContentRectUpdateInfo.scaleChangeRate();
</span><span class="cx">     adjustVelocityDataForBoundedScale(horizontalVelocity, verticalVelocity, scaleChangeRate, visibleContentRectUpdateInfo.scale(), m_viewportConfiguration.minimumScale(), m_viewportConfiguration.maximumScale());
</span><span class="cx"> 
</span><del>-    frameView.setViewportIsStable(m_isInStableState);
</del><span class="cx">     frameView.setScrollVelocity(horizontalVelocity, verticalVelocity, scaleChangeRate, visibleContentRectUpdateInfo.timestamp());
</span><span class="cx"> 
</span><del>-    LOG_WITH_STREAM(VisibleRects, stream &lt;&lt; &quot;WebPage::updateVisibleContentRects setting layoutViewportOverrideRect &quot; &lt;&lt; visibleContentRectUpdateInfo.customFixedPositionRect() &lt;&lt; &quot; stable &quot; &lt;&lt; m_isInStableState);
</del><span class="cx">     if (m_isInStableState) {
</span><span class="cx">         if (frameView.frame().settings().visualViewportEnabled())
</span><span class="cx">             frameView.setLayoutViewportOverrideRect(LayoutRect(visibleContentRectUpdateInfo.customFixedPositionRect()));
</span><span class="lines">@@ -3077,12 +3077,8 @@
</span><span class="cx">     if (!visibleContentRectUpdateInfo.isChangingObscuredInsetsInteractively())
</span><span class="cx">         frameView.setCustomSizeForResizeEvent(expandedIntSize(visibleContentRectUpdateInfo.unobscuredRectInScrollViewCoordinates().size()));
</span><span class="cx"> 
</span><del>-    if (ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator()) {
-        Optional&lt;FloatRect&gt; customFixedPositionRect;
-        if (m_isInStableState)
-            customFixedPositionRect = visibleContentRectUpdateInfo.customFixedPositionRect();
-        scrollingCoordinator-&gt;reconcileScrollingState(frameView, scrollPosition, customFixedPositionRect, false, SetOrSyncScrollingLayerPosition::SyncScrollingLayerPosition);
-    }
</del><ins>+    if (ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator())
+        scrollingCoordinator-&gt;reconcileScrollingState(frameView, scrollPosition, visibleContentRectUpdateInfo.customFixedPositionRect(), false, m_isInStableState, m_isInStableState ? ScrollingLayerPositionAction::Sync : ScrollingLayerPositionAction::SetApproximate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::willStartUserTriggeredZooming()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -371,9 +371,9 @@
</span><span class="cx"> 
</span><span class="cx">     // Because our view-relative overlay root layer is not attached to the FrameView's GraphicsLayer tree, we need to flush it manually.
</span><span class="cx">     if (m_viewOverlayRootLayer)
</span><del>-        m_viewOverlayRootLayer-&gt;flushCompositingState(visibleRect, m_webPage.mainFrameView()-&gt;viewportIsStable());
</del><ins>+        m_viewOverlayRootLayer-&gt;flushCompositingState(visibleRect);
</ins><span class="cx"> 
</span><del>-    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly(m_webPage.mainFrameView()-&gt;viewportIsStable());
</del><ins>+    m_rootLayer-&gt;flushCompositingStateForThisLayerOnly();
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: Minimize these transactions if nothing changed.
</span><span class="cx">     RemoteLayerTreeTransaction layerTransaction;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (208926 => 208927)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2016-11-19 19:02:04 UTC (rev 208926)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2016-11-19 19:34:18 UTC (rev 208927)
</span><span class="lines">@@ -425,7 +425,7 @@
</span><span class="cx"> 
</span><span class="cx">         // Because our view-relative overlay root layer is not attached to the main GraphicsLayer tree, we need to flush it manually.
</span><span class="cx">         if (m_viewOverlayRootLayer)
</span><del>-            m_viewOverlayRootLayer-&gt;flushCompositingState(visibleRect, m_webPage.mainFrameView()-&gt;viewportIsStable());
</del><ins>+            m_viewOverlayRootLayer-&gt;flushCompositingState(visibleRect);
</ins><span class="cx"> 
</span><span class="cx">         RefPtr&lt;WebPage&gt; retainedPage = &amp;m_webPage;
</span><span class="cx"> #if TARGET_OS_IPHONE || (PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101100)
</span></span></pre>
</div>
</div>

</body>
</html>