<!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>[165748] 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/165748">165748</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-03-17 13:04:47 -0700 (Mon, 17 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>WKThumbnailView should support snapshots
https://bugs.webkit.org/show_bug.cgi?id=130335
&lt;rdar://problem/16255139&gt;

Reviewed by Simon Fraser.

Add a mode where WKThumbnailView takes a software snapshot of the web content,
replacing the live layer tree with said snapshot once it returns from the
web process. This may improve animation performance in cases where the
layer tree would otherwise be very complex.

* UIProcess/API/Cocoa/WKThumbnailView.h:
Add a property, usesSnapshot, which determines whether the thumbnail view
should use the live layer tree or a snapshot of the content.

* UIProcess/API/Cocoa/WKThumbnailView.mm:
(-[WKThumbnailView initWithFrame:fromWKView:]):
(-[WKThumbnailView _viewWasUnparented]):
Clear the snapshot when unparented.

(-[WKThumbnailView _viewWasParented]):
Take a snapshot of the web content when parented, if needed.

(-[WKThumbnailView _requestSnapshotIfNeeded]):
If we're using snapshots, and haven't already dispatched an async snapshot request,
and don't already have a snapshot, request a snapshot from the web process.

When it returns, use it as the contents of the WKThumbnailView layer, and
unparent the live layer tree.

(-[WKThumbnailView setScale:]):
(-[WKThumbnailView setUsesSnapshot:]):
(-[WKThumbnailView _setThumbnailLayer:]):
(-[WKThumbnailView _thumbnailLayer]):
* UIProcess/API/Cocoa/WKThumbnailViewInternal.h:

* UIProcess/API/mac/WKView.mm:
(-[WKView _setAcceleratedCompositingModeRootLayer:]):
(-[WKView _acceleratedCompositingModeRootLayer]):
WKView should always keep track of the current root layer, instead of totally
handing control over to WKThumbnailView when it is used.

(-[WKView _setThumbnailView:]):
(-[WKView _updateThumbnailViewLayer]):
(-[WKView _reparentLayerTreeInThumbnailView]):
If needed (either we're not using snapshots, or still waiting for the snapshot to be painted),
push the WKView's live layer tree into the thumbnail view.

* UIProcess/API/mac/WKViewInternal.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::internalShowContextMenu):
* UIProcess/WebPageProxy.h:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::takeThumbnailSnapshot):
Add a message that asynchronously returns a snapshot that respects the
current thumbnail scale and position.

(WebKit::WebPage::scaledSnapshotWithOptions):
Use some nullptr.

* WebProcess/WebPage/DrawingArea.cpp:
(WebKit::DrawingArea::transform):
* WebProcess/WebPage/DrawingArea.h:
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
Add a getter for the DrawingArea's transform.
Rename it to rootLayerTransform.

* WebCore.exp.in:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewInternalh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailViewInternal.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPImacWKViewmm">trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPImacWKViewInternalh">trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageDrawingAreacpp">trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebCore/ChangeLog        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-03-17  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        WKThumbnailView should support snapshots
+        https://bugs.webkit.org/show_bug.cgi?id=130335
+        &lt;rdar://problem/16255139&gt;
+
+        Reviewed by Simon Fraser.
+
+        * WebCore.exp.in:
+
</ins><span class="cx"> 2014-01-29  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Grid Layout] getComputedStyle() not using author's order when showing named grid lines
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -1730,6 +1730,8 @@
</span><span class="cx"> __ZNK7WebCore20ResourceResponseBase3urlEv
</span><span class="cx"> __ZNK7WebCore20ResourceResponseBase6isHTTPEv
</span><span class="cx"> __ZNK7WebCore20ResourceResponseBase8mimeTypeEv
</span><ins>+__ZNK7WebCore20TransformationMatrix7inverseEv
+__ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE
</ins><span class="cx"> __ZNK7WebCore20TransformationMatrixcv13CATransform3DEv
</span><span class="cx"> __ZNK7WebCore21BackForwardController12forwardCountEv
</span><span class="cx"> __ZNK7WebCore21BackForwardController18canGoBackOrForwardEi
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/ChangeLog        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -1,3 +1,74 @@
</span><ins>+2014-03-17  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        WKThumbnailView should support snapshots
+        https://bugs.webkit.org/show_bug.cgi?id=130335
+        &lt;rdar://problem/16255139&gt;
+
+        Reviewed by Simon Fraser.
+
+        Add a mode where WKThumbnailView takes a software snapshot of the web content,
+        replacing the live layer tree with said snapshot once it returns from the
+        web process. This may improve animation performance in cases where the
+        layer tree would otherwise be very complex.
+
+        * UIProcess/API/Cocoa/WKThumbnailView.h:
+        Add a property, usesSnapshot, which determines whether the thumbnail view
+        should use the live layer tree or a snapshot of the content.
+
+        * UIProcess/API/Cocoa/WKThumbnailView.mm:
+        (-[WKThumbnailView initWithFrame:fromWKView:]):
+        (-[WKThumbnailView _viewWasUnparented]):
+        Clear the snapshot when unparented.
+
+        (-[WKThumbnailView _viewWasParented]):
+        Take a snapshot of the web content when parented, if needed.
+
+        (-[WKThumbnailView _requestSnapshotIfNeeded]):
+        If we're using snapshots, and haven't already dispatched an async snapshot request,
+        and don't already have a snapshot, request a snapshot from the web process.
+
+        When it returns, use it as the contents of the WKThumbnailView layer, and
+        unparent the live layer tree.
+
+        (-[WKThumbnailView setScale:]):
+        (-[WKThumbnailView setUsesSnapshot:]):
+        (-[WKThumbnailView _setThumbnailLayer:]):
+        (-[WKThumbnailView _thumbnailLayer]):
+        * UIProcess/API/Cocoa/WKThumbnailViewInternal.h:
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _setAcceleratedCompositingModeRootLayer:]):
+        (-[WKView _acceleratedCompositingModeRootLayer]):
+        WKView should always keep track of the current root layer, instead of totally
+        handing control over to WKThumbnailView when it is used.
+
+        (-[WKView _setThumbnailView:]):
+        (-[WKView _updateThumbnailViewLayer]):
+        (-[WKView _reparentLayerTreeInThumbnailView]):
+        If needed (either we're not using snapshots, or still waiting for the snapshot to be painted),
+        push the WKView's live layer tree into the thumbnail view.
+
+        * UIProcess/API/mac/WKViewInternal.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::internalShowContextMenu):
+        * UIProcess/WebPageProxy.h:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::takeThumbnailSnapshot):
+        Add a message that asynchronously returns a snapshot that respects the
+        current thumbnail scale and position.
+
+        (WebKit::WebPage::scaledSnapshotWithOptions):
+        Use some nullptr.
+
+        * WebProcess/WebPage/DrawingArea.cpp:
+        (WebKit::DrawingArea::transform):
+        * WebProcess/WebPage/DrawingArea.h:
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+        Add a getter for the DrawingArea's transform.
+        Rename it to rootLayerTransform.
+
</ins><span class="cx"> 2014-03-17  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Use RunLoop objects through references instead of pointers
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> - (instancetype)initWithFrame:(NSRect)frame fromWKView:(WKView *)wkView;
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic) CGFloat scale;
</span><ins>+@property (nonatomic) BOOL usesSnapshot;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.mm (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.mm        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailView.mm        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -54,6 +54,8 @@
</span><span class="cx">     BOOL _shouldApplyThumbnailScale;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+@synthesize _waitingForSnapshot = _waitingForSnapshot;
+
</ins><span class="cx"> - (instancetype)initWithFrame:(NSRect)frame fromWKView:(WKView *)wkView
</span><span class="cx"> {
</span><span class="cx">     if (!(self = [super initWithFrame:frame]))
</span><span class="lines">@@ -76,6 +78,9 @@
</span><span class="cx">         _webPageProxy-&gt;setThumbnailScale(1);
</span><span class="cx"> 
</span><span class="cx">     [_wkView _setThumbnailView:nil];
</span><ins>+
+    self.layer.contents = nil;
+
</ins><span class="cx">     _webPageProxy-&gt;setMayStartMediaWhenInWindow(_originalMayStartMediaWhenInWindow);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -90,9 +95,32 @@
</span><span class="cx">     if (!_originalSourceViewIsInWindow)
</span><span class="cx">         _webPageProxy-&gt;setMayStartMediaWhenInWindow(false);
</span><span class="cx"> 
</span><ins>+    [self _requestSnapshotIfNeeded];
</ins><span class="cx">     [_wkView _setThumbnailView:self];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_requestSnapshotIfNeeded
+{
+    if (!_usesSnapshot || _waitingForSnapshot || self.layer.contents)
+        return;
+
+    _waitingForSnapshot = YES;
+
+    RetainPtr&lt;WKThumbnailView&gt; thumbnailView = self;
+    _webPageProxy-&gt;takeThumbnailSnapshot([thumbnailView](bool, const ShareableBitmap::Handle&amp; imageHandle) {
+        RefPtr&lt;ShareableBitmap&gt; bitmap = ShareableBitmap::create(imageHandle, SharedMemory::ReadOnly);
+        RetainPtr&lt;CGImageRef&gt; cgImage = bitmap-&gt;makeCGImage();
+        [thumbnailView _didTakeSnapshot:cgImage.get()];
+    });
+}
+
+- (void)_didTakeSnapshot:(CGImageRef)image
+{
+    _waitingForSnapshot = NO;
+    self.layer.sublayers = @[];
+    self.layer.contents = (id)image;
+}
+
</ins><span class="cx"> - (void)viewDidMoveToWindow
</span><span class="cx"> {
</span><span class="cx">     if (self.window)
</span><span class="lines">@@ -103,18 +131,37 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)setScale:(CGFloat)scale
</span><span class="cx"> {
</span><ins>+    if (_scale == scale)
+        return;
+
</ins><span class="cx">     _scale = scale;
</span><span class="cx"> 
</span><span class="cx">     if (self.window &amp;&amp; _shouldApplyThumbnailScale)
</span><span class="cx">         _webPageProxy-&gt;setThumbnailScale(_scale);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)setThumbnailLayer:(CALayer *)layer
</del><ins>+- (void)setUsesSnapshot:(BOOL)usesSnapshot
</ins><span class="cx"> {
</span><ins>+    if (_usesSnapshot == usesSnapshot)
+        return;
+
+    _usesSnapshot = usesSnapshot;
+
+    if (!self.window)
+        return;
+
+    if (usesSnapshot)
+        [self _requestSnapshotIfNeeded];
+    else
+        [_wkView _reparentLayerTreeInThumbnailView];
+}
+
+- (void)_setThumbnailLayer:(CALayer *)layer
+{
</ins><span class="cx">     self.layer.sublayers = layer ? @[ layer ] : @[ ];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (CALayer *)thumbnailLayer
</del><ins>+- (CALayer *)_thumbnailLayer
</ins><span class="cx"> {
</span><span class="cx">     if (!self.layer.sublayers.count)
</span><span class="cx">         return nil;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKThumbnailViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailViewInternal.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailViewInternal.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKThumbnailViewInternal.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -31,7 +31,8 @@
</span><span class="cx"> 
</span><span class="cx"> @interface WKThumbnailView ()
</span><span class="cx"> 
</span><del>-@property (nonatomic, assign) CALayer *thumbnailLayer;
</del><ins>+@property (nonatomic, assign, setter = _setThumbnailLayer:) CALayer *_thumbnailLayer;
+@property (nonatomic, assign, setter = _setWaitingForSnapshot:) BOOL _waitingForSnapshot;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -225,6 +225,8 @@
</span><span class="cx">     BOOL _allowsMagnification;
</span><span class="cx">     BOOL _allowsBackForwardNavigationGestures;
</span><span class="cx"> 
</span><ins>+    RetainPtr&lt;CALayer&gt; _rootLayer;
+
</ins><span class="cx"> #if WK_API_ENABLED
</span><span class="cx">     WKThumbnailView *_thumbnailView;
</span><span class="cx"> #endif
</span><span class="lines">@@ -2498,9 +2500,11 @@
</span><span class="cx"> {
</span><span class="cx">     [rootLayer web_disableAllActions];
</span><span class="cx"> 
</span><ins>+    _data-&gt;_rootLayer = rootLayer;
+
</ins><span class="cx"> #if WK_API_ENABLED
</span><span class="cx">     if (_data-&gt;_thumbnailView) {
</span><del>-        _data-&gt;_thumbnailView.thumbnailLayer = rootLayer;
</del><ins>+        [self _updateThumbnailViewLayer];
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="lines">@@ -2544,15 +2548,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (CALayer *)_acceleratedCompositingModeRootLayer
</span><span class="cx"> {
</span><del>-    NSView *hostView = _data-&gt;_layerHostingView.get();
-
-    if (!hostView)
-        return nullptr;
-
-    if (!hostView.layer.sublayers.count)
-        return nullptr;
-
-    return [hostView.layer.sublayers objectAtIndex:0];
</del><ins>+    return _data-&gt;_rootLayer.get();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (RetainPtr&lt;CGImageRef&gt;)_takeViewSnapshot
</span><span class="lines">@@ -2974,14 +2970,12 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!_data-&gt;_thumbnailView || !thumbnailView);
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;CALayer&gt; thumbnailLayer = _data-&gt;_thumbnailView.thumbnailLayer;
-
</del><span class="cx">     _data-&gt;_thumbnailView = thumbnailView;
</span><span class="cx"> 
</span><span class="cx">     if (thumbnailView)
</span><del>-        thumbnailView.thumbnailLayer = [self _acceleratedCompositingModeRootLayer];
</del><ins>+        [self _updateThumbnailViewLayer];
</ins><span class="cx">     else
</span><del>-        [self _setAcceleratedCompositingModeRootLayer:thumbnailLayer.get()];
</del><ins>+        [self _setAcceleratedCompositingModeRootLayer:_data-&gt;_rootLayer.get()];
</ins><span class="cx"> 
</span><span class="cx">     _data-&gt;_page-&gt;viewStateDidChange(ViewState::WindowIsActive | ViewState::IsInWindow | ViewState::IsVisible);
</span><span class="cx"> }
</span><span class="lines">@@ -2990,6 +2984,20 @@
</span><span class="cx"> {
</span><span class="cx">     return _data-&gt;_thumbnailView;
</span><span class="cx"> }
</span><ins>+
+- (void)_updateThumbnailViewLayer
+{
+    WKThumbnailView *thumbnailView = _data-&gt;_thumbnailView;
+    ASSERT(thumbnailView);
+
+    if (!thumbnailView.usesSnapshot || thumbnailView._waitingForSnapshot)
+        [self _reparentLayerTreeInThumbnailView];
+}
+
+- (void)_reparentLayerTreeInThumbnailView
+{
+    _data-&gt;_thumbnailView._thumbnailLayer = _data-&gt;_rootLayer.get();
+}
</ins><span class="cx"> #endif // WK_API_ENABLED
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -109,6 +109,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if WK_API_ENABLED
</span><span class="cx"> @property (nonatomic, setter=_setThumbnailView:) WKThumbnailView *_thumbnailView;
</span><ins>+- (void)_reparentLayerTreeInThumbnailView;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // FullScreen
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -4567,4 +4567,17 @@
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::AddMIMETypeWithCustomContentProvider(mimeType), m_pageID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::takeThumbnailSnapshot(ImageCallback::CallbackFunction callbackFunction)
+{
+    if (!isValid())
+        return;
+
+    RefPtr&lt;ImageCallback&gt; callback = ImageCallback::create(callbackFunction);
+
+    uint64_t callbackID = callback-&gt;callbackID();
+    m_imageCallbacks.set(callbackID, callback.get());
+
+    m_process-&gt;send(Messages::WebPage::TakeThumbnailSnapshot(callbackID), m_pageID);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -917,6 +917,8 @@
</span><span class="cx"> 
</span><span class="cx">     void setThumbnailScale(double);
</span><span class="cx"> 
</span><ins>+    void takeThumbnailSnapshot(ImageCallback::CallbackFunction);
+
</ins><span class="cx"> private:
</span><span class="cx">     WebPageProxy(PageClient&amp;, WebProcessProxy&amp;, uint64_t pageID, const WebPageConfiguration&amp;);
</span><span class="cx">     void platformInitialize();
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageDrawingAreacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.cpp (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.cpp        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.cpp        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;DrawingArea.h&quot;
</span><ins>+#include &lt;WebCore/TransformationMatrix.h&gt;
</ins><span class="cx"> #include &lt;wtf/Functional.h&gt;
</span><span class="cx"> 
</span><span class="cx"> // Subclasses
</span><span class="lines">@@ -41,6 +42,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebPageCreationParameters.h&quot;
</span><span class="cx"> 
</span><ins>+using namespace WebCore;
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;DrawingArea&gt; DrawingArea::create(WebPage* webPage, const WebPageCreationParameters&amp; parameters)
</span><span class="lines">@@ -83,4 +86,9 @@
</span><span class="cx">     function();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TransformationMatrix DrawingArea::rootLayerTransform() const
+{
+    return TransformationMatrix();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -107,7 +107,8 @@
</span><span class="cx">     virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0;
</span><span class="cx">     virtual void scheduleCompositingLayerFlush() = 0;
</span><span class="cx"> 
</span><del>-    virtual void setTransform(const WebCore::TransformationMatrix&amp;) { }
</del><ins>+    virtual WebCore::TransformationMatrix rootLayerTransform() const;
+    virtual void setRootLayerTransform(const WebCore::TransformationMatrix&amp;) { }
</ins><span class="cx"> 
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS)
</span><span class="cx">     virtual void didReceiveCoordinatedLayerTreeHostMessage(IPC::Connection*, IPC::MessageDecoder&amp;) = 0;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -1513,15 +1513,29 @@
</span><span class="cx"> }
</span><span class="cx"> #endif // !PLATFORM(IOS)
</span><span class="cx"> 
</span><ins>+void WebPage::takeThumbnailSnapshot(uint64_t callbackID)
+{
+    IntRect snapshotRect(IntPoint(), m_viewSize);
+    snapshotRect = m_drawingArea-&gt;rootLayerTransform().inverse().mapRect(snapshotRect);
+
+    RefPtr&lt;WebImage&gt; image = scaledSnapshotWithOptions(snapshotRect, 1, SnapshotOptionsShareable | SnapshotOptionsInViewCoordinates);
+
+    ShareableBitmap::Handle handle;
+    if (image)
+        image-&gt;bitmap()-&gt;createHandle(handle, SharedMemory::ReadOnly);
+
+    send(Messages::WebPageProxy::ImageCallback(handle, callbackID));
+}
+
</ins><span class="cx"> PassRefPtr&lt;WebImage&gt; WebPage::scaledSnapshotWithOptions(const IntRect&amp; rect, double scaleFactor, SnapshotOptions options)
</span><span class="cx"> {
</span><span class="cx">     Frame* coreFrame = m_mainFrame-&gt;coreFrame();
</span><span class="cx">     if (!coreFrame)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     FrameView* frameView = coreFrame-&gt;view();
</span><span class="cx">     if (!frameView)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     IntSize bitmapSize = rect.size();
</span><span class="cx">     float combinedScaleFactor = scaleFactor * corePage()-&gt;deviceScaleFactor();
</span><span class="lines">@@ -1529,7 +1543,7 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WebImage&gt; snapshot = WebImage::create(bitmapSize, snapshotOptionsToImageOptions(options));
</span><span class="cx">     if (!snapshot-&gt;bitmap())
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     auto graphicsContext = snapshot-&gt;bitmap()-&gt;createGraphicsContext();
</span><span class="cx"> 
</span><span class="lines">@@ -4307,7 +4321,7 @@
</span><span class="cx">     transform.translate((newScrollPosition.x() * inverseScale) - m_scrollPositionIgnoringThumbnailScale.x(), (newScrollPosition.y() * inverseScale) - m_scrollPositionIgnoringThumbnailScale.y());
</span><span class="cx">     transform.scale(inverseScale);
</span><span class="cx"> 
</span><del>-    drawingArea()-&gt;setTransform(transform);
</del><ins>+    drawingArea()-&gt;setRootLayerTransform(transform);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::getBytecodeProfile(uint64_t callbackID)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -846,6 +846,7 @@
</span><span class="cx">     void getWebArchiveOfFrame(uint64_t frameID, uint64_t callbackID);
</span><span class="cx">     void runJavaScriptInMainFrame(const String&amp;, uint64_t callbackID);
</span><span class="cx">     void forceRepaint(uint64_t callbackID);
</span><ins>+    void takeThumbnailSnapshot(uint64_t callbackID);
</ins><span class="cx"> 
</span><span class="cx">     void preferencesDidChange(const WebPreferencesStore&amp;);
</span><span class="cx">     void platformPreferencesDidChange(const WebPreferencesStore&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -336,5 +336,7 @@
</span><span class="cx">     SetThumbnailScale(double scale)
</span><span class="cx"> 
</span><span class="cx">     GetBytecodeProfile(uint64_t callbackID)
</span><ins>+    
+    TakeThumbnailSnapshot(uint64_t callbackID)
</ins><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -112,7 +112,8 @@
</span><span class="cx">     virtual void commitTransientZoom(double scale, WebCore::FloatPoint origin) override;
</span><span class="cx">     void applyTransientZoomToPage(double scale, WebCore::FloatPoint origin);
</span><span class="cx"> 
</span><del>-    virtual void setTransform(const WebCore::TransformationMatrix&amp;) override;
</del><ins>+    virtual WebCore::TransformationMatrix rootLayerTransform() const override {  return m_transform; }
+    virtual void setRootLayerTransform(const WebCore::TransformationMatrix&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     void updateLayerHostingContext();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (165747 => 165748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-03-17 19:27:53 UTC (rev 165747)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-03-17 20:04:47 UTC (rev 165748)
</span><span class="lines">@@ -826,7 +826,7 @@
</span><span class="cx">     m_transientZoomScale = 1;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TiledCoreAnimationDrawingArea::setTransform(const TransformationMatrix&amp; transform)
</del><ins>+void TiledCoreAnimationDrawingArea::setRootLayerTransform(const TransformationMatrix&amp; transform)
</ins><span class="cx"> {
</span><span class="cx">     m_transform = transform;
</span><span class="cx">     [m_rootLayer setSublayerTransform:transform];
</span></span></pre>
</div>
</div>

</body>
</html>