<!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>[167409] trunk/Source/WebKit2</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/167409">167409</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-04-16 18:26:07 -0700 (Wed, 16 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS][WK2] Improve the approximation of the scroll position of the dynamic viewport size updates
https://bugs.webkit.org/show_bug.cgi?id=131720

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2014-04-16
Reviewed by Tim Horton.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _scrollToContentOffset:]):
The scrolling tree was forcing scroll at the wrong scale during the transition. 

(-[WKWebView _setMinimumLayoutSizeOverride:]):
This was left out by accident. The WebProcess was getting the new layout size twice, making
WebPage::dynamicViewportSizeUpdate() very confused when the content size changes.

* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::dynamicViewportSizeUpdate):
Add scrolling adjustment for the dynamic relayout case:
-Sticky top and bottom like the UIProcess.
-Keep the same relative position of the unobscured rect's center.

Also fix a bug in the horizontal and vertical adjustments: the code was using the exposed rect
instead of the unobscured rect, which made the adjustments off by the size of the obscured insets.

The type is changed from double to float since ARMv7 has a grudge against double.</pre>

<h3>Modified Paths</h3>
<ul>
<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="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (167408 => 167409)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-04-17 01:23:44 UTC (rev 167408)
+++ trunk/Source/WebKit2/ChangeLog        2014-04-17 01:26:07 UTC (rev 167409)
</span><span class="lines">@@ -1,5 +1,31 @@
</span><span class="cx"> 2014-04-16  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        [iOS][WK2] Improve the approximation of the scroll position of the dynamic viewport size updates
+        https://bugs.webkit.org/show_bug.cgi?id=131720
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _scrollToContentOffset:]):
+        The scrolling tree was forcing scroll at the wrong scale during the transition. 
+
+        (-[WKWebView _setMinimumLayoutSizeOverride:]):
+        This was left out by accident. The WebProcess was getting the new layout size twice, making
+        WebPage::dynamicViewportSizeUpdate() very confused when the content size changes.
+
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::dynamicViewportSizeUpdate):
+        Add scrolling adjustment for the dynamic relayout case:
+        -Sticky top and bottom like the UIProcess.
+        -Keep the same relative position of the unobscured rect's center.
+
+        Also fix a bug in the horizontal and vertical adjustments: the code was using the exposed rect
+        instead of the unobscured rect, which made the adjustments off by the size of the obscured insets.
+
+        The type is changed from double to float since ARMv7 has a grudge against double.
+
+2014-04-16  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
</ins><span class="cx">         [iOS][WK2] Do not update the visible content rects when setting the same obscured insets multiple times
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131633
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (167408 => 167409)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-04-17 01:23:44 UTC (rev 167408)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-04-17 01:26:07 UTC (rev 167409)
</span><span class="lines">@@ -549,10 +549,14 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffset
</span><span class="cx"> {
</span><ins>+    if (_isAnimatingResize)
+        return;
+
</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 class="cx"> 
</span><ins>+    // FIXME: the offset is relative to the unobscured rect top, not the content insets!
</ins><span class="cx">     UIEdgeInsets inset = [_scrollView contentInset];
</span><span class="cx">     scaledOffset += WebCore::FloatSize(-inset.left, -inset.top);
</span><span class="cx"> 
</span><span class="lines">@@ -1257,7 +1261,8 @@
</span><span class="cx"> {
</span><span class="cx">     _hasStaticMinimumLayoutSize = YES;
</span><span class="cx">     _minimumLayoutSizeOverride = minimumLayoutSizeOverride;
</span><del>-    setViewportConfigurationMinimumLayoutSize(*_page, minimumLayoutSizeOverride);
</del><ins>+    if (!_isAnimatingResize)
+        setViewportConfigurationMinimumLayoutSize(*_page, minimumLayoutSizeOverride);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (UIEdgeInsets)_obscuredInsets
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (167408 => 167409)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2014-04-17 01:23:44 UTC (rev 167408)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2014-04-17 01:26:07 UTC (rev 167409)
</span><span class="lines">@@ -1803,19 +1803,43 @@
</span><span class="cx">         newUnobscuredContentRect.setWidth(std::min(static_cast&lt;float&gt;(newContentSize.width()), newExposedContentRect.width()));
</span><span class="cx">         newUnobscuredContentRect.setHeight(std::min(static_cast&lt;float&gt;(newContentSize.height()), newExposedContentRect.height()));
</span><span class="cx"> 
</span><del>-        double horizontalAdjustment = 0;
</del><ins>+        if (oldContentSize != newContentSize) {
+            // If the content size has changed, keep the same relative position.
+            FloatPoint oldContentCenter = targetUnobscuredRect.center();
+            float relativeHorizontalPosition = oldContentCenter.x() / oldContentSize.width();
+            float relativeVerticalPosition =  oldContentCenter.y() / oldContentSize.height();
+            FloatPoint newRelativeContentCenter(relativeHorizontalPosition * newContentSize.width(), relativeVerticalPosition * newContentSize.height());
+            FloatPoint newUnobscuredContentRectCenter = newUnobscuredContentRect.center();
+            FloatPoint positionDelta(newRelativeContentCenter.x() - newUnobscuredContentRectCenter.x(), newRelativeContentCenter.y() - newUnobscuredContentRectCenter.y());
+            newUnobscuredContentRect.moveBy(positionDelta);
+            newExposedContentRect.moveBy(positionDelta);
+        }
+
+        // Make the top/bottom edges &quot;sticky&quot; within 1 pixel.
+        if (targetUnobscuredRect.maxY() &gt; oldContentSize.height() - 1) {
+            float bottomVerticalPosition = newContentSize.height() - newUnobscuredContentRect.height();
+            newUnobscuredContentRect.setY(bottomVerticalPosition);
+            newExposedContentRect.setY(bottomVerticalPosition);
+        }
+        if (targetUnobscuredRect.y() &lt; 1) {
+            newUnobscuredContentRect.setY(0);
+            newExposedContentRect.setY(0);
+        }
+
+        float horizontalAdjustment = 0;
</ins><span class="cx">         if (newExposedContentRect.maxX() &gt; newContentSize.width())
</span><del>-            horizontalAdjustment -= newExposedContentRect.maxX() - newContentSize.width();
-        double verticalAdjustment = 0;
</del><ins>+            horizontalAdjustment -= newUnobscuredContentRect.maxX() - newContentSize.width();
+        float verticalAdjustment = 0;
</ins><span class="cx">         if (newExposedContentRect.maxY() &gt; newContentSize.height())
</span><del>-            verticalAdjustment -= newExposedContentRect.maxY() - newContentSize.height();
</del><ins>+            verticalAdjustment -= newUnobscuredContentRect.maxY() - newContentSize.height();
</ins><span class="cx">         if (newExposedContentRect.x() &lt; 0)
</span><del>-            horizontalAdjustment += - newExposedContentRect.x();
</del><ins>+            horizontalAdjustment += - newUnobscuredContentRect.x();
</ins><span class="cx">         if (newExposedContentRect.y() &lt; 0)
</span><del>-            verticalAdjustment += - newExposedContentRect.y();
</del><ins>+            verticalAdjustment += - newUnobscuredContentRect.y();
</ins><span class="cx"> 
</span><del>-        newUnobscuredContentRect.move(horizontalAdjustment, verticalAdjustment);
-        newExposedContentRect.move(horizontalAdjustment, verticalAdjustment);
</del><ins>+        FloatPoint adjustmentDelta(horizontalAdjustment, verticalAdjustment);
+        newUnobscuredContentRect.moveBy(adjustmentDelta);
+        newExposedContentRect.moveBy(adjustmentDelta);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     frameView.setScrollVelocity(0, 0, 0, monotonicallyIncreasingTime());
</span></span></pre>
</div>
</div>

</body>
</html>