<!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>[184022] 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/184022">184022</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-05-08 16:04:29 -0700 (Fri, 08 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Periodically repaint during resize while using the DynamicSizeWithMinimumViewSize layout strategy
https://bugs.webkit.org/show_bug.cgi?id=144816

Reviewed by Simon Fraser.

* UIProcess/mac/WKViewLayoutStrategy.mm:
(-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy initWithPage:view:mode:]):
(-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy _updateTransientScale:]):
(-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy updateLayout]):
Factor out _updateTransientScale from updateLayout.
Keep track of the last viewScaleFactor that we know is being displayed
(_lastCommittedViewScale) and use that for computing the transient scale,
so that we can recompute the transient scale while the UI process's notion
of the actual view scale might have moved ahead of what the Web process has
painted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWKViewLayoutStrategymm">trunk/Source/WebKit2/UIProcess/mac/WKViewLayoutStrategy.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (184021 => 184022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-05-08 22:59:18 UTC (rev 184021)
+++ trunk/Source/WebKit2/ChangeLog        2015-05-08 23:04:29 UTC (rev 184022)
</span><span class="lines">@@ -1,5 +1,23 @@
</span><span class="cx"> 2015-05-08  Timothy Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Periodically repaint during resize while using the DynamicSizeWithMinimumViewSize layout strategy
+        https://bugs.webkit.org/show_bug.cgi?id=144816
+
+        Reviewed by Simon Fraser.
+
+        * UIProcess/mac/WKViewLayoutStrategy.mm:
+        (-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy initWithPage:view:mode:]):
+        (-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy _updateTransientScale:]):
+        (-[WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy updateLayout]):
+        Factor out _updateTransientScale from updateLayout.
+        Keep track of the last viewScaleFactor that we know is being displayed
+        (_lastCommittedViewScale) and use that for computing the transient scale,
+        so that we can recompute the transient scale while the UI process's notion
+        of the actual view scale might have moved ahead of what the Web process has
+        painted.
+
+2015-05-08  Timothy Horton  &lt;timothy_horton@apple.com&gt;
+
</ins><span class="cx">         Fix the build.
</span><span class="cx"> 
</span><span class="cx">         * UIProcess/WebPageProxy.cpp:
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWKViewLayoutStrategymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WKViewLayoutStrategy.mm (184021 => 184022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/WKViewLayoutStrategy.mm        2015-05-08 22:59:18 UTC (rev 184021)
+++ trunk/Source/WebKit2/UIProcess/mac/WKViewLayoutStrategy.mm        2015-05-08 23:04:29 UTC (rev 184022)
</span><span class="lines">@@ -45,7 +45,11 @@
</span><span class="cx"> @interface WKViewDynamicSizeComputedFromViewScaleLayoutStrategy : WKViewLayoutStrategy
</span><span class="cx"> @end
</span><span class="cx"> 
</span><del>-@interface WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy : WKViewLayoutStrategy
</del><ins>+@interface WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy : WKViewLayoutStrategy {
+    BOOL _isWaitingForCommit;
+    BOOL _hasPendingLayout;
+    CGFloat _lastCommittedViewScale;
+}
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @implementation WKViewLayoutStrategy
</span><span class="lines">@@ -244,12 +248,27 @@
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     page.setUseFixedLayout(true);
</span><ins>+    _lastCommittedViewScale = _page-&gt;viewScaleFactor();
</ins><span class="cx"> 
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_updateTransientScale:(CGFloat)scale
+{
+    float topContentInset = _page-&gt;topContentInset();
+
+    CGFloat relativeScale = scale / _lastCommittedViewScale;
+
+    CATransform3D transform = CATransform3DMakeTranslation(0, topContentInset - (topContentInset * relativeScale), 0);
+    transform = CATransform3DScale(transform, relativeScale, relativeScale, 1);
+
+    _wkView._rootLayer.transform = transform;
+}
+
</ins><span class="cx"> - (void)updateLayout
</span><span class="cx"> {
</span><ins>+    _hasPendingLayout = NO;
+
</ins><span class="cx">     CGFloat scale = 1;
</span><span class="cx"> 
</span><span class="cx">     CGFloat minimumViewWidth = _wkView._minimumViewSize.width;
</span><span class="lines">@@ -271,40 +290,51 @@
</span><span class="cx">         fixedLayoutWidth = minimumViewHeight;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Send frame size updates if we're the only ones disabling them,
-    // if we're not scaling down. That way, everything will behave like a normal
-    // resize except in the critical section.
-    if ([_wkView inLiveResize] &amp;&amp; scale == 1 &amp;&amp; _frameSizeUpdatesDisabledCount == 1) {
</del><ins>+    _page-&gt;setFixedLayoutSize(IntSize(fixedLayoutWidth, fixedLayoutHeight));
+
+    [self _updateTransientScale:scale];
+
+    if (_isWaitingForCommit) {
+        _hasPendingLayout = YES;
+        return;
+    }
+
+    if ([_wkView inLiveResize] &amp;&amp; _lastCommittedViewScale == 1 &amp;&amp; scale == 1 &amp;&amp; _frameSizeUpdatesDisabledCount == 1) {
+        // Send frame size updates if we're the only ones disabling them,
+        // if we're not scaling down. That way, everything will behave like a normal
+        // resize except in the critical section.
</ins><span class="cx">         if (_wkView.shouldClipToVisibleRect)
</span><span class="cx">             [_wkView _updateViewExposedRect];
</span><span class="cx">         [_wkView _setDrawingAreaSize:[_wkView frame].size];
</span><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _page-&gt;setFixedLayoutSize(IntSize(fixedLayoutWidth, fixedLayoutHeight));
</del><ins>+    if (_lastCommittedViewScale == scale)
+        return;
</ins><span class="cx"> 
</span><del>-    if ([_wkView inLiveResize]) {
-        float topContentInset = _page-&gt;topContentInset();
</del><ins>+    _isWaitingForCommit = YES;
</ins><span class="cx"> 
</span><del>-        CGFloat relativeScale = scale / _page-&gt;viewScaleFactor();
</del><ins>+#if PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
+    RetainPtr&lt;CAContext&gt; context = [_wkView.layer context];
+    RetainPtr&lt;WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy&gt; retainedSelf = self;
+    _page-&gt;scaleViewAndUpdateGeometryFenced(scale, IntSize(_wkView.frame.size), [retainedSelf, context, scale] (const WebCore::MachSendRight&amp; fencePort, CallbackBase::Error error) {
+        if (error != CallbackBase::Error::None)
+            return;
</ins><span class="cx"> 
</span><del>-        CATransform3D transform = CATransform3DMakeTranslation(0, topContentInset - (topContentInset * relativeScale), 0);
-        transform = CATransform3DScale(transform, relativeScale, relativeScale, 1);
</del><ins>+        [context setFencePort:fencePort.sendRight() commitHandler:[retainedSelf, scale] {
+            WKViewDynamicSizeWithMinimumViewSizeLayoutStrategy *layoutStrategy = retainedSelf.get();
+            layoutStrategy-&gt;_lastCommittedViewScale = scale;
+            [layoutStrategy _updateTransientScale:scale];
+            layoutStrategy-&gt;_isWaitingForCommit = NO;
</ins><span class="cx"> 
</span><del>-        _wkView._rootLayer.transform = transform;
-    } else if (scale != _page-&gt;viewScaleFactor()) {
-#if PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
-        RetainPtr&lt;CAContext&gt; context = [_wkView.layer context];
-        RetainPtr&lt;WKView&gt; retainedWKView = _wkView;
-        _page-&gt;scaleViewAndUpdateGeometryFenced(scale, IntSize(_wkView.frame.size), [retainedWKView, context] (const WebCore::MachSendRight&amp; fencePort, CallbackBase::Error) {
-            [context setFencePort:fencePort.sendRight() commitHandler:^{
-                [retainedWKView _rootLayer].transform = CATransform3DIdentity;
-            }];
-        });
</del><ins>+            if (layoutStrategy-&gt;_hasPendingLayout)
+                [layoutStrategy updateLayout];
+        }];
+    });
</ins><span class="cx"> #else
</span><del>-        _page-&gt;scaleView(scale);
-        _wkView._rootLayer.transform = CATransform3DIdentity;
</del><ins>+    _page-&gt;scaleView(scale);
+    _wkView._rootLayer.transform = CATransform3DIdentity;
</ins><span class="cx"> #endif
</span><del>-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)didChangeMinimumViewSize
</span></span></pre>
</div>
</div>

</body>
</html>