<!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>[185461] trunk/Source/WebCore</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/185461">185461</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2015-06-11 11:01:44 -0700 (Thu, 11 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Missing content in UIWebView snapshots sometimes
https://bugs.webkit.org/show_bug.cgi?id=145779
rdar://problem/20744708

Reviewed by Darin Adler.

When expanding collapsed parts of quoted text on iOS, sometimes the &quot;concertina&quot;
images would be blank. This happened because we'd fail to create tiles for regions
outside the LegacyTileCache's visibleRect.

Fix by giving LegacyTileCache an optional override visibleRect, which is set
and cleared during -renderInContext: using the context clip rect.

* platform/ios/LegacyTileCache.h:
* platform/ios/LegacyTileCache.mm:
(WebCore::LegacyTileCache::visibleRectInLayer):
(WebCore::LegacyTileCache::setOverrideVisibleRect):
* platform/ios/LegacyTileLayer.mm:
(-[LegacyTileHostLayer renderInContext:]):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformiosLegacyTileCacheh">trunk/Source/WebCore/platform/ios/LegacyTileCache.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosLegacyTileCachemm">trunk/Source/WebCore/platform/ios/LegacyTileCache.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformiosLegacyTileLayermm">trunk/Source/WebCore/platform/ios/LegacyTileLayer.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (185460 => 185461)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-06-11 17:45:35 UTC (rev 185460)
+++ trunk/Source/WebCore/ChangeLog        2015-06-11 18:01:44 UTC (rev 185461)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-06-08  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Missing content in UIWebView snapshots sometimes
+        https://bugs.webkit.org/show_bug.cgi?id=145779
+        rdar://problem/20744708
+
+        Reviewed by Darin Adler.
+        
+        When expanding collapsed parts of quoted text on iOS, sometimes the &quot;concertina&quot;
+        images would be blank. This happened because we'd fail to create tiles for regions
+        outside the LegacyTileCache's visibleRect.
+        
+        Fix by giving LegacyTileCache an optional override visibleRect, which is set
+        and cleared during -renderInContext: using the context clip rect.
+
+        * platform/ios/LegacyTileCache.h:
+        * platform/ios/LegacyTileCache.mm:
+        (WebCore::LegacyTileCache::visibleRectInLayer):
+        (WebCore::LegacyTileCache::setOverrideVisibleRect):
+        * platform/ios/LegacyTileLayer.mm:
+        (-[LegacyTileHostLayer renderInContext:]):
+
</ins><span class="cx"> 2015-06-11  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Simplify event handling logic for search cancel button
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosLegacyTileCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/LegacyTileCache.h (185460 => 185461)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/LegacyTileCache.h        2015-06-11 17:45:35 UTC (rev 185460)
+++ trunk/Source/WebCore/platform/ios/LegacyTileCache.h        2015-06-11 18:01:44 UTC (rev 185461)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;IntSize.h&quot;
</span><span class="cx"> #include &quot;Timer.h&quot;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/Optional.h&gt;
</ins><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="lines">@@ -139,6 +140,7 @@
</span><span class="cx">     CALayer* hostLayer() const;
</span><span class="cx">     unsigned tileCapacityForGrid(LegacyTileGrid*);
</span><span class="cx">     Color colorForGridTileBorder(LegacyTileGrid*) const;
</span><ins>+    void setOverrideVisibleRect(Optional&lt;FloatRect&gt;);
</ins><span class="cx"> 
</span><span class="cx">     void doPendingRepaints();
</span><span class="cx"> 
</span><span class="lines">@@ -183,6 +185,8 @@
</span><span class="cx">     // Ensure there are no async calls on a dead tile cache.
</span><span class="cx">     RetainPtr&lt;LegacyTileCacheTombstone&gt; m_tombstone;
</span><span class="cx"> 
</span><ins>+    Optional&lt;FloatRect&gt; m_overrideVisibleRect;
+
</ins><span class="cx">     TilingMode m_tilingMode;
</span><span class="cx">     TilingDirection m_tilingDirection;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosLegacyTileCachemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/LegacyTileCache.mm (185460 => 185461)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/LegacyTileCache.mm        2015-06-11 17:45:35 UTC (rev 185460)
+++ trunk/Source/WebCore/platform/ios/LegacyTileCache.mm        2015-06-11 18:01:44 UTC (rev 185461)
</span><span class="lines">@@ -110,9 +110,17 @@
</span><span class="cx"> 
</span><span class="cx"> FloatRect LegacyTileCache::visibleRectInLayer(CALayer *layer) const
</span><span class="cx"> {
</span><ins>+    if (m_overrideVisibleRect)
+        return [layer convertRect:m_overrideVisibleRect.value() fromLayer:hostLayer()];
+
</ins><span class="cx">     return [layer convertRect:[m_window extendedVisibleRect] fromLayer:hostLayer()];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void LegacyTileCache::setOverrideVisibleRect(Optional&lt;FloatRect&gt; rect)
+{
+    m_overrideVisibleRect = rect;
+}
+
</ins><span class="cx"> bool LegacyTileCache::tilesOpaque() const
</span><span class="cx"> {
</span><span class="cx">     return m_tilesOpaque;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosLegacyTileLayermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/LegacyTileLayer.mm (185460 => 185461)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/LegacyTileLayer.mm        2015-06-11 17:45:35 UTC (rev 185460)
+++ trunk/Source/WebCore/platform/ios/LegacyTileLayer.mm        2015-06-11 18:01:44 UTC (rev 185461)
</span><span class="lines">@@ -32,7 +32,10 @@
</span><span class="cx"> #include &quot;LegacyTileGrid.h&quot;
</span><span class="cx"> #include &quot;WebCoreThread.h&quot;
</span><span class="cx"> 
</span><ins>+using namespace WebCore;
+
</ins><span class="cx"> @implementation LegacyTileHostLayer
</span><ins>+
</ins><span class="cx"> - (id)initWithTileGrid:(WebCore::LegacyTileGrid*)tileGrid
</span><span class="cx"> {
</span><span class="cx">     self = [super init];
</span><span class="lines">@@ -54,8 +57,14 @@
</span><span class="cx"> {
</span><span class="cx">     if (pthread_main_np())
</span><span class="cx">         WebThreadLock();
</span><ins>+
+    CGRect dirtyRect = CGContextGetClipBoundingBox(context);
+    _tileGrid-&gt;tileCache().setOverrideVisibleRect(FloatRect(dirtyRect));
</ins><span class="cx">     _tileGrid-&gt;tileCache().doLayoutTiles();
</span><ins>+
</ins><span class="cx">     [super renderInContext:context];
</span><ins>+
+    _tileGrid-&gt;tileCache().setOverrideVisibleRect(Nullopt);
</ins><span class="cx"> }
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>