<!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>[167662] 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/167662">167662</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-04-22 08:51:33 -0700 (Tue, 22 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>WKThumbnailView doesn't quite work with topContentInset
https://bugs.webkit.org/show_bug.cgi?id=131976
&lt;rdar://problem/16642127&gt;

Reviewed by Darin Adler.

* UIProcess/API/Cocoa/_WKThumbnailView.mm:
(-[_WKThumbnailView initWithFrame:fromWKView:]):
_WKThumbnailView always needs a layer.
We don't want to use snapshots by default, this was debugging accidentally landed in the last change.

(-[_WKThumbnailView _requestSnapshotIfNeeded]):
Don't request a new snapshot if the scale is the same as the existing one.
Reduce the height of the snapshot by the topContentInset.
Having the origin at (0, 0) is still correct, as the inset content is in negative Y space,
and (0, 0) is the true origin of the content.

(-[_WKThumbnailView setScale:]):
When not snapshotting, we've decided that WKThumbnailView should apply the scale to the WKView layer tree,
instead of depending on clients to do so.

(-[_WKThumbnailView setUsesSnapshot:]):
We *do* need to apply thumbnail scale in the web process even when snapshotting,
because we use the live layer tree temporarily while waiting for the asynchronous
snapshot to return. This was a misstep in the last thumbnail view patch.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKThumbnailViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (167661 => 167662)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-04-22 15:39:26 UTC (rev 167661)
+++ trunk/Source/WebKit2/ChangeLog        2014-04-22 15:51:33 UTC (rev 167662)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-04-22  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        WKThumbnailView doesn't quite work with topContentInset
+        https://bugs.webkit.org/show_bug.cgi?id=131976
+        &lt;rdar://problem/16642127&gt;
+
+        Reviewed by Darin Adler.
+
+        * UIProcess/API/Cocoa/_WKThumbnailView.mm:
+        (-[_WKThumbnailView initWithFrame:fromWKView:]):
+        _WKThumbnailView always needs a layer.
+        We don't want to use snapshots by default, this was debugging accidentally landed in the last change.
+
+        (-[_WKThumbnailView _requestSnapshotIfNeeded]):
+        Don't request a new snapshot if the scale is the same as the existing one.
+        Reduce the height of the snapshot by the topContentInset.
+        Having the origin at (0, 0) is still correct, as the inset content is in negative Y space,
+        and (0, 0) is the true origin of the content.
+
+        (-[_WKThumbnailView setScale:]):
+        When not snapshotting, we've decided that WKThumbnailView should apply the scale to the WKView layer tree,
+        instead of depending on clients to do so.
+
+        (-[_WKThumbnailView setUsesSnapshot:]):
+        We *do* need to apply thumbnail scale in the web process even when snapshotting,
+        because we use the live layer tree temporarily while waiting for the asynchronous
+        snapshot to return. This was a misstep in the last thumbnail view patch.
+
</ins><span class="cx"> 2014-04-22  Shivakumar JM  &lt;shiva.jm@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebKit2] Cleanup the build from unused parameter in WebProcess Module 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKThumbnailViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm (167661 => 167662)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm        2014-04-22 15:39:26 UTC (rev 167661)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm        2014-04-22 15:51:33 UTC (rev 167662)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">     BOOL _shouldApplyThumbnailScale;
</span><span class="cx"> 
</span><span class="cx">     BOOL _snapshotWasDeferred;
</span><ins>+    double _lastSnapshotScale;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @synthesize _waitingForSnapshot = _waitingForSnapshot;
</span><span class="lines">@@ -64,17 +65,18 @@
</span><span class="cx">     if (!(self = [super initWithFrame:frame]))
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><ins>+    self.wantsLayer = YES;
+
</ins><span class="cx">     _wkView = wkView;
</span><span class="cx">     _webPageProxy = toImpl([_wkView pageRef]);
</span><span class="cx">     _scale = 1;
</span><ins>+    _lastSnapshotScale = NAN;
</ins><span class="cx"> 
</span><span class="cx">     _originalMayStartMediaWhenInWindow = _webPageProxy-&gt;mayStartMediaWhenInWindow();
</span><span class="cx">     _originalSourceViewIsInWindow = !![_wkView window];
</span><span class="cx"> 
</span><span class="cx">     _shouldApplyThumbnailScale = !_originalSourceViewIsInWindow;
</span><span class="cx"> 
</span><del>-    self.usesSnapshot = YES;
-
</del><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -86,6 +88,7 @@
</span><span class="cx">     [_wkView _setThumbnailView:nil];
</span><span class="cx"> 
</span><span class="cx">     self.layer.contents = nil;
</span><ins>+    _lastSnapshotScale = NAN;
</ins><span class="cx"> 
</span><span class="cx">     _webPageProxy-&gt;setMayStartMediaWhenInWindow(_originalMayStartMediaWhenInWindow);
</span><span class="cx"> }
</span><span class="lines">@@ -110,6 +113,9 @@
</span><span class="cx">     if (!_usesSnapshot)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (self.layer.contents &amp;&amp; _lastSnapshotScale == _scale)
+        return;
+
</ins><span class="cx">     if (_waitingForSnapshot) {
</span><span class="cx">         _snapshotWasDeferred = YES;
</span><span class="cx">         return;
</span><span class="lines">@@ -118,10 +124,11 @@
</span><span class="cx">     _waitingForSnapshot = YES;
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;_WKThumbnailView&gt; thumbnailView = self;
</span><del>-    IntRect snapshotRect(IntPoint(), _webPageProxy-&gt;viewSize());
</del><ins>+    IntRect snapshotRect(IntPoint(), _webPageProxy-&gt;viewSize() - IntSize(0, _webPageProxy-&gt;topContentInset()));
</ins><span class="cx">     SnapshotOptions options = SnapshotOptionsRespectDrawingAreaTransform | SnapshotOptionsInViewCoordinates;
</span><span class="cx">     IntSize bitmapSize = snapshotRect.size();
</span><span class="cx">     bitmapSize.scale(_scale * _webPageProxy-&gt;deviceScaleFactor());
</span><ins>+    _lastSnapshotScale = _scale;
</ins><span class="cx">     _webPageProxy-&gt;takeSnapshot(snapshotRect, bitmapSize, options, [thumbnailView](bool, const ShareableBitmap::Handle&amp; imageHandle) {
</span><span class="cx">         RefPtr&lt;ShareableBitmap&gt; bitmap = ShareableBitmap::create(imageHandle, SharedMemory::ReadOnly);
</span><span class="cx">         RetainPtr&lt;CGImageRef&gt; cgImage = bitmap-&gt;makeCGImage();
</span><span class="lines">@@ -163,6 +170,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (_usesSnapshot)
</span><span class="cx">         [self _requestSnapshotIfNeeded];
</span><ins>+
+    self.layer.sublayerTransform = CATransform3DMakeScale(_scale, _scale, 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setUsesSnapshot:(BOOL)usesSnapshot
</span><span class="lines">@@ -171,7 +180,6 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     _usesSnapshot = usesSnapshot;
</span><del>-    _shouldApplyThumbnailScale = _usesSnapshot ? false : !_originalSourceViewIsInWindow;
</del><span class="cx"> 
</span><span class="cx">     if (!self.window)
</span><span class="cx">         return;
</span></span></pre>
</div>
</div>

</body>
</html>