<!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>[168447] trunk/Source</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/168447">168447</a></dd>
<dt>Author</dt> <dd>enrica@apple.com</dd>
<dt>Date</dt> <dd>2014-05-07 15:42:46 -0700 (Wed, 07 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>WK2: Programatic scroll requests during scroll or zoom animation to reveal focused element are ignored.
https://bugs.webkit.org/show_bug.cgi?id=132657
&lt;rdar://problem/16468462&gt;

Reviewed by Benjamin Poulain.

With the scrolling model we use on iOS, a programatic scroll
request can be received while we are still animating to reveal

Source/WebCore: 
the focused input element. The WebProcess is unaware that the
scroll position is being changed in the UIProcess, and does not
honor the scroll request from JavaScript.
This is patch changes the behavior for clients using scroll delegates
to always send the scroll request to the UIProcess without checking
the current scroll position.

* page/FrameView.h:
* platform/ScrollView.cpp:
(WebCore::ScrollView::setScrollPosition):
* platform/ScrollView.h:
(WebCore::ScrollView::inProgrammaticScroll):

Source/WebKit2: 
the focused input element. Changing the scroll offset while animating
leads to unpredictable results. We now cancel the animation if
a programatic scroll request is received.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _scrollToContentOffset:WebCore::]):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::getAssistedNodeInformation):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewh">trunk/Source/WebCore/page/FrameView.h</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollViewcpp">trunk/Source/WebCore/platform/ScrollView.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollViewh">trunk/Source/WebCore/platform/ScrollView.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebCore/ChangeLog        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-05-07  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        WK2: Programatic scroll requests during scroll or zoom animation to reveal focused element are ignored.
+        https://bugs.webkit.org/show_bug.cgi?id=132657
+        &lt;rdar://problem/16468462&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        With the scrolling model we use on iOS, a programatic scroll
+        request can be received while we are still animating to reveal
+        the focused input element. The WebProcess is unaware that the
+        scroll position is being changed in the UIProcess, and does not
+        honor the scroll request from JavaScript.
+        This is patch changes the behavior for clients using scroll delegates
+        to always send the scroll request to the UIProcess without checking
+        the current scroll position.
+
+        * page/FrameView.h:
+        * platform/ScrollView.cpp:
+        (WebCore::ScrollView::setScrollPosition):
+        * platform/ScrollView.h:
+        (WebCore::ScrollView::inProgrammaticScroll):
+
</ins><span class="cx"> 2014-05-07  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac, iOS] REGRESSION: WK2 YouTube support
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.h (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.h        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebCore/page/FrameView.h        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -442,7 +442,7 @@
</span><span class="cx">     const Pagination&amp; pagination() const;
</span><span class="cx">     void setPagination(const Pagination&amp;);
</span><span class="cx">     
</span><del>-    bool inProgrammaticScroll() const { return m_inProgrammaticScroll; }
</del><ins>+    bool inProgrammaticScroll() const override { return m_inProgrammaticScroll; }
</ins><span class="cx">     void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_DEVICE_ADAPTATION)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.cpp (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.cpp        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebCore/platform/ScrollView.cpp        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -506,7 +506,7 @@
</span><span class="cx"> 
</span><span class="cx">     IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
</span><span class="cx"> 
</span><del>-    if (newScrollPosition == scrollPosition())
</del><ins>+    if ((!delegatesScrolling() || !inProgrammaticScroll()) &amp;&amp; newScrollPosition == scrollPosition())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (requestScrollPositionUpdate(newScrollPosition))
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.h (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.h        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebCore/platform/ScrollView.h        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -192,6 +192,8 @@
</span><span class="cx">     LegacyTileCache* legacyTileCache();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    virtual bool inProgrammaticScroll() const { return false; }
+
</ins><span class="cx">     // visibleContentRect().size() is computed from unscaledUnobscuredVisibleContentSize() divided by the value of visibleContentScaleFactor.
</span><span class="cx">     // visibleContentScaleFactor is usually 1, except when the setting delegatesPageScaling is true and the
</span><span class="cx">     // ScrollView is the main frame; in that case, visibleContentScaleFactor is equal to the page's pageScaleFactor.
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebKit2/ChangeLog        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-05-07  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        WK2: Programatic scroll requests during scroll or zoom animation to reveal focused element are ignored.
+        https://bugs.webkit.org/show_bug.cgi?id=132657
+        &lt;rdar://problem/16468462&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        With the scrolling model we use on iOS, a programatic scroll
+        request can be received while we are still animating to reveal
+        the focused input element. Changing the scroll offset while animating
+        leads to unpredictable results. We now cancel the animation if
+        a programatic scroll request is received.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _scrollToContentOffset:WebCore::]):
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::getAssistedNodeInformation):
+
</ins><span class="cx"> 2014-05-07  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS WK2] Speculative fix for crash in PlatformCALayerRemote::recursiveBuildTransaction
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -561,6 +561,8 @@
</span><span class="cx">     if (_isAnimatingResize)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    [_scrollView _stopScrollingAndZoomingAnimations];
+
</ins><span class="cx">     WebCore::FloatPoint scaledOffset = contentOffset;
</span><span class="cx">     CGFloat zoomScale = contentZoomScale(self);
</span><span class="cx">     scaledOffset.scale(zoomScale, zoomScale);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (168446 => 168447)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2014-05-07 22:15:30 UTC (rev 168446)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2014-05-07 22:42:46 UTC (rev 168447)
</span><span class="lines">@@ -1738,6 +1738,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::getAssistedNodeInformation(AssistedNodeInformation&amp; information)
</span><span class="cx"> {
</span><ins>+    layoutIfNeeded();
+
</ins><span class="cx">     if (RenderObject* renderer = m_assistedNode-&gt;renderer())
</span><span class="cx">         information.elementRect = m_page-&gt;focusController().focusedOrMainFrame().view()-&gt;contentsToRootView(renderer-&gt;absoluteBoundingBoxRect());
</span><span class="cx">     else
</span></span></pre>
</div>
</div>

</body>
</html>