<!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>[168907] 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/168907">168907</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-05-15 13:03:27 -0700 (Thu, 15 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS][WK2] WKWebView sends invalid content offsets at the end of animated resize
https://bugs.webkit.org/show_bug.cgi?id=132941
&lt;rdar://problem/16921557&gt;

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

Since we cannot change the scale and content inset simultaneously while accounting for the obscured insets,
we end up with invalid contentOffsets.

To work around the problem, change the content scale outside of UIScrollView to ensure none of the side effect
happens.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _endAnimatedResize]):</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (168906 => 168907)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-05-15 19:45:05 UTC (rev 168906)
+++ trunk/Source/WebKit2/ChangeLog        2014-05-15 20:03:27 UTC (rev 168907)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-05-15  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        [iOS][WK2] WKWebView sends invalid content offsets at the end of animated resize
+        https://bugs.webkit.org/show_bug.cgi?id=132941
+        &lt;rdar://problem/16921557&gt;
+
+        Reviewed by Tim Horton.
+
+        Since we cannot change the scale and content inset simultaneously while accounting for the obscured insets,
+        we end up with invalid contentOffsets.
+
+        To work around the problem, change the content scale outside of UIScrollView to ensure none of the side effect
+        happens.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _endAnimatedResize]):
+
</ins><span class="cx"> 2014-05-15  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebKit2 View Gestures (Zoom): Document size changes during zoom gesture cause erratic scrolling
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (168906 => 168907)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-15 19:45:05 UTC (rev 168906)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-15 20:03:27 UTC (rev 168907)
</span><span class="lines">@@ -1605,10 +1605,20 @@
</span><span class="cx">         contentViewLayer.sublayerTransform = CATransform3DIdentity;
</span><span class="cx"> 
</span><span class="cx">         CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
</span><del>-        CGFloat currentScale = [[_resizeAnimationView layer] transform].m11 * [[_contentView layer] transform].m11;
</del><ins>+        CALayer *contentLayer = [_contentView layer];
+        CATransform3D contentLayerTransform = contentLayer.transform;
+        CGFloat currentScale = [[_resizeAnimationView layer] transform].m11 * contentLayerTransform.m11;
+
+        // We cannot use [UIScrollView setZoomScale:] directly because the UIScrollView delegate would get a callback with
+        // an invalid contentOffset. The real content offset is only set below.
+        // Since there is no public API for setting both the zoomScale and the contentOffset, we set the zoomScale manually
+        // on the zoom layer and then only change the contentOffset.
+        CGFloat adjustedScale = adjustmentScale * currentScale;
+        contentLayerTransform.m11 = adjustedScale;
+        contentLayerTransform.m22 = adjustedScale;
+        contentLayer.transform = contentLayerTransform;
+
</ins><span class="cx">         CGPoint currentScrollOffset = [_scrollView contentOffset];
</span><del>-        [_scrollView setZoomScale:adjustmentScale * currentScale];
-
</del><span class="cx">         double horizontalScrollAdjustement = _resizeAnimationTransformAdjustments.m41 * animatingScaleTarget;
</span><span class="cx">         double verticalScrollAdjustment = _resizeAnimationTransformAdjustments.m42 * animatingScaleTarget;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>