<!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>[179531] branches/safari-600.5-branch/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/179531">179531</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2015-02-02 17:47:11 -0800 (Mon, 02 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/178661">r178661</a>. rdar://problem/19617731 

    2015-01-19  Brent Fulgham  &lt;bfulgham@apple.com&gt; 

    Layers need to be already updated before we call adjustViewSize 
    https://bugs.webkit.org/show_bug.cgi?id=135514 

    Reviewed by Simon Fraser. 

    Tested by 'fast/dynamic/layer-no-longer-paginated.html' 

    Defer painting operations until we have finished layout. This 
    has a couple of benefits: 
    (1) We do not attempt to modify render layers during layout. 
    (2) In WK1 we do not attempt to paint during layout. 

    Add a new virtual predicate to ScrollView indicating when we are in 
    layout so that calls to setContentsSize do not attempt 
    to adjust scrollbars. 

    Modify FrameView to set its ScrollView state to block paint 
    operations during layout. Also add a post-layout handler to 
    complete the scrollbar updates after layout is finished. 

    * WebCore.exp.in: Move linker symbol to ScrollView (from FrameView). 
    * page/FrameView.cpp: 
    (WebCore::FrameView::layout): 
    (WebCore::FrameView::shouldDeferScrollUpdateAfterContentSizeChange): Added. 
    (WebCore::FrameView::scrollPositionChangedViaPlatformWidget): Removed (Renamed). 
    (WebCore::FrameView::scrollPositionChangedViaPlatformWidgetImpl): Added (Renamed) 
    (WebCore::FrameView::paintContents): Do not paint if we are inside view size adjustment. 
    * page/FrameView.h: 
    * platform/ScrollView.cpp: 
    (WebCore::ScrollView::scrollPositionChangedViaPlatformWidget): Added. Checks whether we need to defer 
    painting, and calls virtual scrollPositionChangedViaPlatformWidgetImpl if we do not. 
    (WebCore::FrameView::scrollPositionChangedViaPlatformWidgetImpl): Added. 
    (WebCore::ScrollView::handleDeferredScrollUpdateAfterContentSizeChange): Added. 
    (WebCore::ScrollView::scrollTo): If we should defer painting, cache the 
    the scroll delta and apply it after the layout is complete. 
    (WebCore::ScrollView::completeUpdatesAfterScrollTo): Split off part of 'scrollTo' into its own method 
    so we can reuse it in handleDeferredScrollUpdateAfterContentSizeChange. 
    * platform/ScrollView.h: 
    (WebCore::ScrollView::shouldDeferScrollUpdateAfterContentSizeChange): Added. </pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari6005branchSourceWebCoreChangeLog">branches/safari-600.5-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari6005branchSourceWebCoreWebCoreexpin">branches/safari-600.5-branch/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#branchessafari6005branchSourceWebCorepageFrameViewcpp">branches/safari-600.5-branch/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#branchessafari6005branchSourceWebCorepageFrameViewh">branches/safari-600.5-branch/Source/WebCore/page/FrameView.h</a></li>
<li><a href="#branchessafari6005branchSourceWebCoreplatformScrollViewcpp">branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.cpp</a></li>
<li><a href="#branchessafari6005branchSourceWebCoreplatformScrollViewh">branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari6005branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/ChangeLog (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/ChangeLog        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/ChangeLog        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -1,3 +1,49 @@
</span><ins>+2015-02-02  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Merge r178661. rdar://problem/19617731 
+
+    2015-01-19  Brent Fulgham  &lt;bfulgham@apple.com&gt; 
+
+            Layers need to be already updated before we call adjustViewSize 
+            https://bugs.webkit.org/show_bug.cgi?id=135514 
+
+            Reviewed by Simon Fraser. 
+
+            Tested by 'fast/dynamic/layer-no-longer-paginated.html' 
+
+            Defer painting operations until we have finished layout. This 
+            has a couple of benefits: 
+            (1) We do not attempt to modify render layers during layout. 
+            (2) In WK1 we do not attempt to paint during layout. 
+
+            Add a new virtual predicate to ScrollView indicating when we are in 
+            layout so that calls to setContentsSize do not attempt 
+            to adjust scrollbars. 
+
+            Modify FrameView to set its ScrollView state to block paint 
+            operations during layout. Also add a post-layout handler to 
+            complete the scrollbar updates after layout is finished. 
+
+            * WebCore.exp.in: Move linker symbol to ScrollView (from FrameView). 
+            * page/FrameView.cpp: 
+            (WebCore::FrameView::layout): 
+            (WebCore::FrameView::shouldDeferScrollUpdateAfterContentSizeChange): Added. 
+            (WebCore::FrameView::scrollPositionChangedViaPlatformWidget): Removed (Renamed). 
+            (WebCore::FrameView::scrollPositionChangedViaPlatformWidgetImpl): Added (Renamed) 
+            (WebCore::FrameView::paintContents): Do not paint if we are inside view size adjustment. 
+            * page/FrameView.h: 
+            * platform/ScrollView.cpp: 
+            (WebCore::ScrollView::scrollPositionChangedViaPlatformWidget): Added. Checks whether we need to defer 
+            painting, and calls virtual scrollPositionChangedViaPlatformWidgetImpl if we do not. 
+            (WebCore::FrameView::scrollPositionChangedViaPlatformWidgetImpl): Added. 
+            (WebCore::ScrollView::handleDeferredScrollUpdateAfterContentSizeChange): Added. 
+            (WebCore::ScrollView::scrollTo): If we should defer painting, cache the 
+            the scroll delta and apply it after the layout is complete. 
+            (WebCore::ScrollView::completeUpdatesAfterScrollTo): Split off part of 'scrollTo' into its own method 
+            so we can reuse it in handleDeferredScrollUpdateAfterContentSizeChange. 
+            * platform/ScrollView.h: 
+            (WebCore::ScrollView::shouldDeferScrollUpdateAfterContentSizeChange): Added. 
+
</ins><span class="cx"> 2015-01-21  Babak Shafiei  &lt;bshafiei@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Merge r177000.
</span></span></pre></div>
<a id="branchessafari6005branchSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/WebCore.exp.in (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/WebCore.exp.in        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/WebCore.exp.in        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -93,6 +93,7 @@
</span><span class="cx"> __ZN7WebCore10ScrollView23setPaintsEntireContentsEb
</span><span class="cx"> __ZN7WebCore10ScrollView23setScrollbarsSuppressedEbb
</span><span class="cx"> __ZN7WebCore10ScrollView24windowResizerRectChangedEv
</span><ins>+__ZN7WebCore10ScrollView38scrollPositionChangedViaPlatformWidgetERKNS_8IntPointES3_
</ins><span class="cx"> __ZN7WebCore10ScrollView4hideEv
</span><span class="cx"> __ZN7WebCore10ScrollView4showEv
</span><span class="cx"> __ZN7WebCore10ScrollView5paintEPNS_15GraphicsContextERKNS_7IntRectE
</span><span class="lines">@@ -1462,7 +1463,6 @@
</span><span class="cx"> __ZN7WebCore9FrameView34setViewportSizeForCSSViewportUnitsENS_7IntSizeE
</span><span class="cx"> __ZN7WebCore9FrameView37setScrollingPerformanceLoggingEnabledEb
</span><span class="cx"> __ZN7WebCore9FrameView37updateLayoutAndStyleIfNeededRecursiveEv
</span><del>-__ZN7WebCore9FrameView38scrollPositionChangedViaPlatformWidgetERKNS_8IntPointES3_
</del><span class="cx"> __ZN7WebCore9FrameView39flushCompositingStateIncludingSubframesEv
</span><span class="cx"> __ZN7WebCore9FrameView52disableLayerFlushThrottlingTemporarilyForInteractionEv
</span><span class="cx"> __ZN7WebCore9FrameView6createERNS_5FrameE
</span></span></pre></div>
<a id="branchessafari6005branchSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/page/FrameView.cpp (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/page/FrameView.cpp        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/page/FrameView.cpp        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -3,7 +3,7 @@
</span><span class="cx">  *                     1999 Lars Knoll &lt;knoll@kde.org&gt;
</span><span class="cx">  *                     1999 Antti Koivisto &lt;koivisto@kde.org&gt;
</span><span class="cx">  *                     2000 Dirk Mueller &lt;mueller@kde.org&gt;
</span><del>- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2004-2008, 2013, 2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
</span><span class="cx">  *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
</span><span class="cx">  * Copyright (C) 2009 Google Inc. All rights reserved.
</span><span class="lines">@@ -1127,7 +1127,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!allowSubtree &amp;&amp; m_layoutRoot) {
</span><span class="cx">         m_layoutRoot-&gt;markContainingBlocksForLayout(false);
</span><del>-        m_layoutRoot = 0;
</del><ins>+        m_layoutRoot = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(frame().view() == this);
</span><span class="lines">@@ -1325,7 +1325,9 @@
</span><span class="cx">     layer-&gt;updateLayerPositionsAfterLayout(renderView()-&gt;layer(), updateLayerPositionFlags(layer, subtree, m_needsFullRepaint));
</span><span class="cx"> 
</span><span class="cx">     updateCompositingLayersAfterLayout();
</span><del>-    
</del><ins>+
+    m_layoutPhase = InPostLayerPositionsUpdatedAfterLayout;
+
</ins><span class="cx">     m_layoutCount++;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA) || PLATFORM(WIN) || PLATFORM(GTK) || PLATFORM(EFL)
</span><span class="lines">@@ -1345,6 +1347,8 @@
</span><span class="cx"> 
</span><span class="cx">     updateCanBlitOnScrollRecursively();
</span><span class="cx"> 
</span><ins>+    handleDeferredScrollUpdateAfterContentSizeChange();
+
</ins><span class="cx">     if (document.hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
</span><span class="cx">         updateOverflowStatus(layoutWidth() &lt; contentsWidth(), layoutHeight() &lt; contentsHeight());
</span><span class="cx"> 
</span><span class="lines">@@ -1374,6 +1378,11 @@
</span><span class="cx">     --m_nestedLayoutCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool FrameView::shouldDeferScrollUpdateAfterContentSizeChange()
+{
+    return (m_layoutPhase &lt; InPostLayout) &amp;&amp; (m_layoutPhase != OutsideLayout);
+}
+
</ins><span class="cx"> RenderBox* FrameView::embeddedContentBox() const
</span><span class="cx"> {
</span><span class="cx">     RenderView* renderView = this-&gt;renderView();
</span><span class="lines">@@ -2051,7 +2060,7 @@
</span><span class="cx">     frame().loader().client().didChangeScrollOffset();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FrameView::scrollPositionChangedViaPlatformWidget(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition)
</del><ins>+void FrameView::scrollPositionChangedViaPlatformWidgetImpl(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition)
</ins><span class="cx"> {
</span><span class="cx">     updateLayerPositionsAfterScrolling();
</span><span class="cx">     updateCompositingLayersAfterScrolling();
</span><span class="lines">@@ -2135,6 +2144,8 @@
</span><span class="cx"> 
</span><span class="cx"> void FrameView::updateCompositingLayersAfterScrolling()
</span><span class="cx"> {
</span><ins>+    ASSERT(m_layoutPhase &gt;= InPostLayout || m_layoutPhase == OutsideLayout);
+
</ins><span class="cx">     if (!shouldUpdateCompositingLayersAfterScrolling())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -3671,6 +3682,11 @@
</span><span class="cx"> 
</span><span class="cx"> void FrameView::paintContents(GraphicsContext* context, const IntRect&amp; dirtyRect)
</span><span class="cx"> {
</span><ins>+    if (m_layoutPhase == InViewSizeAdjust)
+        return;
+
+    ASSERT(m_layoutPhase == InPostLayerPositionsUpdatedAfterLayout || m_layoutPhase == OutsideLayout);
+
</ins><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     bool fillWithRed;
</span><span class="cx">     if (frame().document()-&gt;printing())
</span></span></pre></div>
<a id="branchessafari6005branchSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/page/FrameView.h (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/page/FrameView.h        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/page/FrameView.h        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx">              (C) 1998, 1999 Torben Weis (weis@kde.org)
</span><span class="cx">              (C) 1999 Lars Knoll (knoll@kde.org)
</span><span class="cx">              (C) 1999 Antti Koivisto (koivisto@kde.org)
</span><del>-   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
</del><ins>+   Copyright (C) 2004-2009, 2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">    This library is free software; you can redistribute it and/or
</span><span class="cx">    modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -232,7 +232,6 @@
</span><span class="cx">     virtual void setFixedVisibleContentRect(const IntRect&amp;) override;
</span><span class="cx"> #endif
</span><span class="cx">     virtual void setScrollPosition(const IntPoint&amp;) override;
</span><del>-    void scrollPositionChangedViaPlatformWidget(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition);
</del><span class="cx">     virtual void updateLayerPositionsAfterScrolling() override;
</span><span class="cx">     virtual void updateCompositingLayersAfterScrolling() override;
</span><span class="cx">     virtual bool requestScrollPositionUpdate(const IntPoint&amp;) override;
</span><span class="lines">@@ -520,6 +519,7 @@
</span><span class="cx">         InLayout,
</span><span class="cx">         InViewSizeAdjust,
</span><span class="cx">         InPostLayout,
</span><ins>+        InPostLayerPositionsUpdatedAfterLayout,
</ins><span class="cx">     };
</span><span class="cx">     LayoutPhase layoutPhase() const { return m_layoutPhase; }
</span><span class="cx"> 
</span><span class="lines">@@ -536,6 +536,10 @@
</span><span class="cx"> 
</span><span class="cx">     bool shouldUpdateCompositingLayersAfterScrolling() const;
</span><span class="cx"> 
</span><ins>+    virtual bool shouldDeferScrollUpdateAfterContentSizeChange() override;
+
+    virtual void scrollPositionChangedViaPlatformWidgetImpl(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition) override;
+
</ins><span class="cx">     void applyOverflowToViewport(RenderElement*, ScrollbarMode&amp; hMode, ScrollbarMode&amp; vMode);
</span><span class="cx">     void applyPaginationToViewport();
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari6005branchSourceWebCoreplatformScrollViewcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.cpp (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.cpp        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.cpp        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -457,10 +457,41 @@
</span><span class="cx">     scrollTo(newOffset);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ScrollView::scrollPositionChangedViaPlatformWidget(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition)
+{
+    // We should not attempt to actually modify (paint) platform widgets if the layout phase
+    // is not complete. Instead, defer the scroll event until the layout finishes.
+    if (shouldDeferScrollUpdateAfterContentSizeChange()) {
+        // We only care about the most recent scroll position change request
+        m_deferredScrollPositions = std::make_unique&lt;std::pair&lt;IntPoint, IntPoint&gt;&gt;(std::make_pair(oldPosition, newPosition));
+        return;
+    }
+
+    scrollPositionChangedViaPlatformWidgetImpl(oldPosition, newPosition);
+}
+
+void ScrollView::handleDeferredScrollUpdateAfterContentSizeChange()
+{
+    ASSERT(!shouldDeferScrollUpdateAfterContentSizeChange());
+
+    if (!m_deferredScrollDelta &amp;&amp; !m_deferredScrollPositions)
+        return;
+
+    ASSERT(static_cast&lt;bool&gt;(m_deferredScrollDelta) != static_cast&lt;bool&gt;(m_deferredScrollPositions));
+
+    if (m_deferredScrollDelta)
+        completeUpdatesAfterScrollTo(*m_deferredScrollDelta);
+    else if (m_deferredScrollPositions)
+        scrollPositionChangedViaPlatformWidgetImpl(m_deferredScrollPositions-&gt;first, m_deferredScrollPositions-&gt;second);
+    
+    m_deferredScrollDelta = nullptr;
+    m_deferredScrollPositions = nullptr;
+}
+
</ins><span class="cx"> void ScrollView::scrollTo(const IntSize&amp; newOffset)
</span><span class="cx"> {
</span><span class="cx">     IntSize scrollDelta = newOffset - m_scrollOffset;
</span><del>-    if (scrollDelta == IntSize())
</del><ins>+    if (scrollDelta.isZero())
</ins><span class="cx">         return;
</span><span class="cx">     m_scrollOffset = newOffset;
</span><span class="cx"> 
</span><span class="lines">@@ -473,6 +504,19 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><ins>+    // We should not attempt to actually modify layer contents if the layout phase
+    // is not complete. Instead, defer the scroll event until the layout finishes.
+    if (shouldDeferScrollUpdateAfterContentSizeChange()) {
+        ASSERT(!m_deferredScrollDelta);
+        m_deferredScrollDelta = std::make_unique&lt;IntSize&gt;(scrollDelta);
+        return;
+    }
+
+    completeUpdatesAfterScrollTo(scrollDelta);
+}
+
+void ScrollView::completeUpdatesAfterScrollTo(const IntSize&amp; scrollDelta)
+{
</ins><span class="cx">     updateLayerPositionsAfterScrolling();
</span><span class="cx">     scrollContents(scrollDelta);
</span><span class="cx">     updateCompositingLayersAfterScrolling();
</span></span></pre></div>
<a id="branchessafari6005branchSourceWebCoreplatformScrollViewh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.h (179530 => 179531)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.h        2015-02-03 01:33:49 UTC (rev 179530)
+++ branches/safari-600.5-branch/Source/WebCore/platform/ScrollView.h        2015-02-03 01:47:11 UTC (rev 179531)
</span><span class="lines">@@ -379,6 +379,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool isScrollView() const override { return true; }
</span><span class="cx"> 
</span><ins>+    void scrollPositionChangedViaPlatformWidget(const IntPoint&amp; oldPosition, const IntPoint&amp; newPosition);
+
</ins><span class="cx"> protected:
</span><span class="cx">     ScrollView();
</span><span class="cx"> 
</span><span class="lines">@@ -417,10 +419,18 @@
</span><span class="cx">     float platformTopContentInset() const;
</span><span class="cx">     void platformSetTopContentInset(float);
</span><span class="cx"> 
</span><ins>+    virtual void handleDeferredScrollUpdateAfterContentSizeChange();
+
+    virtual bool shouldDeferScrollUpdateAfterContentSizeChange() { return false; }
+
+    virtual void scrollPositionChangedViaPlatformWidgetImpl(const IntPoint&amp;, const IntPoint&amp;) { }
+
</ins><span class="cx"> private:
</span><span class="cx">     virtual IntRect visibleContentRectInternal(VisibleContentRectIncludesScrollbars, VisibleContentRectBehavior) const override;
</span><span class="cx">     IntRect unobscuredContentRectInternal(VisibleContentRectIncludesScrollbars = ExcludeScrollbars) const;
</span><span class="cx"> 
</span><ins>+    void completeUpdatesAfterScrollTo(const IntSize&amp; scrollDelta);
+
</ins><span class="cx">     RefPtr&lt;Scrollbar&gt; m_horizontalScrollbar;
</span><span class="cx">     RefPtr&lt;Scrollbar&gt; m_verticalScrollbar;
</span><span class="cx">     ScrollbarMode m_horizontalScrollbarMode;
</span><span class="lines">@@ -450,6 +460,10 @@
</span><span class="cx">     IntSize m_fixedLayoutSize;
</span><span class="cx">     IntSize m_contentsSize;
</span><span class="cx"> 
</span><ins>+    std::unique_ptr&lt;IntSize&gt; m_deferredScrollDelta; // Needed for WebKit scrolling
+    std::unique_ptr&lt;std::pair&lt;IntPoint, IntPoint&gt;&gt; m_deferredScrollPositions; // Needed for platform widget scrolling
+
+
</ins><span class="cx">     int m_scrollbarsAvoidingResizer;
</span><span class="cx">     bool m_scrollbarsSuppressed;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>