<!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>[194607] trunk</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/194607">194607</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2016-01-05 14:09:20 -0800 (Tue, 05 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Adjust tile coverage with margin tiles, and tidy up the indicator
https://bugs.webkit.org/show_bug.cgi?id=152742

Reviewed by Beth Dakin.

Source/WebCore:

The tile coverage rect was unfeasibly large when margin tiles are present, and
could be bigger than the layer itself, making the indicator look odd.

Fix by improving the logic in TileController::adjustTileCoverageRect(): this
now first extends the visible rect for scrolling, and then constrains it
within the bounds with margin padding. It also unites with the passed-in
coverageRect, ensuring that we don't lose information about overhang for
margin tile coverage.

Second, update the tiled scrolling indicator when the visible rect changes,
and coalesce the map updates on a timer.

* platform/graphics/TiledBacking.h:
* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::adjustCoverageRect):
* platform/graphics/ca/TileController.cpp:
(WebCore::TileController::setVisibleRect):
(WebCore::TileController::setTiledScrollingIndicatorPosition):
(WebCore::expandRectWithinRect):
(WebCore::TileController::adjustTileCoverageRect):
(WebCore::TileController::updateTileCoverageMap):
(WebCore::TileController::computeTileCoverageRect): Deleted.
* platform/graphics/ca/TileController.h:
* platform/graphics/ca/TileCoverageMap.cpp:
(WebCore::TileCoverageMap::TileCoverageMap):
(WebCore::TileCoverageMap::setNeedsUpdate):
(WebCore::TileCoverageMap::updateTimerFired):
* platform/graphics/ca/TileCoverageMap.h:

LayoutTests:

New baselines. simple-document-with-margin-tiles.html needs to wait for over 0.5s
for the FrameView::enableSpeculativeTilingIfNeeded() timer to fire before
dumping coverage (ouch).

* tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt:
* tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt:
* tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt:
* tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt:
* tiled-drawing/simple-document-with-margin-tiles.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingfastscrolliframelatchediframeexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingfastscrolliframelatchediframewithhandlerexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingfastscrolliframelatchedmainframeexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingfastscrolliframelatchedmainframewithhandlerexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingsimpledocumentwithmargintilesexpectedtxt">trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingsimpledocumentwithmargintileshtml">trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsTiledBackingh">trunk/Source/WebCore/platform/graphics/TiledBacking.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaTileControllercpp">trunk/Source/WebCore/platform/graphics/ca/TileController.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaTileControllerh">trunk/Source/WebCore/platform/graphics/ca/TileController.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaTileCoverageMapcpp">trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaTileCoverageMaph">trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/ChangeLog        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-01-05  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Adjust tile coverage with margin tiles, and tidy up the indicator
+        https://bugs.webkit.org/show_bug.cgi?id=152742
+
+        Reviewed by Beth Dakin.
+
+        New baselines. simple-document-with-margin-tiles.html needs to wait for over 0.5s
+        for the FrameView::enableSpeculativeTilingIfNeeded() timer to fire before
+        dumping coverage (ouch).
+
+        * tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt:
+        * tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt:
+        * tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt:
+        * tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt:
+        * tiled-drawing/simple-document-with-margin-tiles.html:
+
</ins><span class="cx"> 2016-01-05  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         IDB test gardening.
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingfastscrolliframelatchediframeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-expected.txt        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx">       (bounds 785.00 2266.00)
</span><span class="cx">       (contentsOpaque 1)
</span><span class="cx">       (visible rect 0.00, 0.00 785.00 x 600.00)
</span><del>-      (coverage rect 0.00, 0.00 1570.00 x 1800.00)
</del><ins>+      (coverage rect 0.00, 0.00 785.00 x 1800.00)
</ins><span class="cx">       (intersects coverage rect 1)
</span><span class="cx">       (contentsScale 1.00)
</span><span class="cx">       (tile cache coverage 0, 0 785 x 2048)
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingfastscrolliframelatchediframewithhandlerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-iframe-with-handler-expected.txt        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx">       (bounds 785.00 2266.00)
</span><span class="cx">       (contentsOpaque 1)
</span><span class="cx">       (visible rect 0.00, 0.00 785.00 x 600.00)
</span><del>-      (coverage rect 0.00, 0.00 1570.00 x 1800.00)
</del><ins>+      (coverage rect 0.00, 0.00 785.00 x 1800.00)
</ins><span class="cx">       (intersects coverage rect 1)
</span><span class="cx">       (contentsScale 1.00)
</span><span class="cx">       (tile cache coverage 0, 0 785 x 2048)
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingfastscrolliframelatchedmainframeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-expected.txt        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx">       (bounds 785.00 2266.00)
</span><span class="cx">       (contentsOpaque 1)
</span><span class="cx">       (visible rect 0.00, 70.00 785.00 x 600.00)
</span><del>-      (coverage rect 0.00, 0.00 1570.00 x 1800.00)
</del><ins>+      (coverage rect 0.00, 0.00 785.00 x 1800.00)
</ins><span class="cx">       (intersects coverage rect 1)
</span><span class="cx">       (contentsScale 1.00)
</span><span class="cx">       (tile cache coverage 0, 0 785 x 2048)
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingfastscrolliframelatchedmainframewithhandlerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/scrolling/fast-scroll-iframe-latched-mainframe-with-handler-expected.txt        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx">       (bounds 785.00 2266.00)
</span><span class="cx">       (contentsOpaque 1)
</span><span class="cx">       (visible rect 0.00, 70.00 785.00 x 600.00)
</span><del>-      (coverage rect 0.00, 0.00 1570.00 x 1800.00)
</del><ins>+      (coverage rect 0.00, 0.00 785.00 x 1800.00)
</ins><span class="cx">       (intersects coverage rect 1)
</span><span class="cx">       (contentsScale 1.00)
</span><span class="cx">       (tile cache coverage 0, 0 785 x 2048)
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingsimpledocumentwithmargintilesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles-expected.txt (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles-expected.txt        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles-expected.txt        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -10,7 +10,7 @@
</span><span class="cx">       (bounds 1208.00 2021.00)
</span><span class="cx">       (contentsOpaque 1)
</span><span class="cx">       (visible rect 0.00, 0.00 785.00 x 585.00)
</span><del>-      (coverage rect -512.00, -512.00 1809.00 x 1609.00)
</del><ins>+      (coverage rect -392.50, -512.00 1570.00 x 1755.00)
</ins><span class="cx">       (intersects coverage rect 1)
</span><span class="cx">       (contentsScale 1.00)
</span><span class="cx">       (tile cache coverage -512, -512 2048 x 2048)
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingsimpledocumentwithmargintileshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles.html (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles.html        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/LayoutTests/tiled-drawing/simple-document-with-margin-tiles.html        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -13,16 +13,26 @@
</span><span class="cx">         }
</span><span class="cx">     &lt;/style&gt;
</span><span class="cx">     &lt;script&gt;
</span><del>-        if (window.testRunner)
</del><ins>+        if (window.testRunner) {
</ins><span class="cx">             testRunner.dumpAsText();
</span><ins>+            testRunner.waitUntilDone();
+        }
</ins><span class="cx"> 
</span><span class="cx">         function doTest()
</span><span class="cx">         {
</span><del>-            if (window.internals) {
</del><ins>+            if (window.internals)
</ins><span class="cx">                 window.internals.settings.setBackgroundShouldExtendBeyondPage(true);
</span><del>-                document.getElementById('layers').innerText = internals.layerTreeAsText(document,
-                    internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS | internals.LAYER_TREE_INCLUDES_TILE_CACHES);
-            }
</del><ins>+
+            // FrameView::enableSpeculativeTilingIfNeeded() uses a 0.5s timer to enable speculative tiling.
+            window.setTimeout(function() {
+                if (window.internals) {
+                    document.getElementById('layers').innerText = internals.layerTreeAsText(document,
+                        internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS | internals.LAYER_TREE_INCLUDES_TILE_CACHES);
+                }
+                
+                if (window.testRunner)
+                    testRunner.notifyDone();
+            }, 550);
</ins><span class="cx">         }
</span><span class="cx">         window.addEventListener('load', doTest, false);
</span><span class="cx">     &lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/ChangeLog        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2016-01-05  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Adjust tile coverage with margin tiles, and tidy up the indicator
+        https://bugs.webkit.org/show_bug.cgi?id=152742
+
+        Reviewed by Beth Dakin.
+
+        The tile coverage rect was unfeasibly large when margin tiles are present, and
+        could be bigger than the layer itself, making the indicator look odd.
+
+        Fix by improving the logic in TileController::adjustTileCoverageRect(): this
+        now first extends the visible rect for scrolling, and then constrains it
+        within the bounds with margin padding. It also unites with the passed-in
+        coverageRect, ensuring that we don't lose information about overhang for
+        margin tile coverage.
+
+        Second, update the tiled scrolling indicator when the visible rect changes,
+        and coalesce the map updates on a timer.
+
+        * platform/graphics/TiledBacking.h:
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::adjustCoverageRect):
+        * platform/graphics/ca/TileController.cpp:
+        (WebCore::TileController::setVisibleRect):
+        (WebCore::TileController::setTiledScrollingIndicatorPosition):
+        (WebCore::expandRectWithinRect):
+        (WebCore::TileController::adjustTileCoverageRect):
+        (WebCore::TileController::updateTileCoverageMap):
+        (WebCore::TileController::computeTileCoverageRect): Deleted.
+        * platform/graphics/ca/TileController.h:
+        * platform/graphics/ca/TileCoverageMap.cpp:
+        (WebCore::TileCoverageMap::TileCoverageMap):
+        (WebCore::TileCoverageMap::setNeedsUpdate):
+        (WebCore::TileCoverageMap::updateTimerFired):
+        * platform/graphics/ca/TileCoverageMap.h:
+
</ins><span class="cx"> 2016-01-05  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove selector filter update calls from Element child parsing callbacks
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsTiledBackingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/TiledBacking.h (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/TiledBacking.h        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/TiledBacking.h        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx">     virtual void setTileCoverage(TileCoverage) = 0;
</span><span class="cx">     virtual TileCoverage tileCoverage() const = 0;
</span><span class="cx"> 
</span><del>-    virtual FloatRect computeTileCoverageRect(const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; currentVisibleRect, float contentsScale) const = 0;
</del><ins>+    virtual void adjustTileCoverageRect(FloatRect&amp; coverageRect, const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; currentVisibleRect, float contentsScale) const = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual IntSize tileSize() const = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;FloatRect.h&quot;
</span><span class="cx"> #include &quot;GraphicsLayerFactory.h&quot;
</span><span class="cx"> #include &quot;Image.h&quot;
</span><ins>+#include &quot;Logging.h&quot;
</ins><span class="cx"> #include &quot;PlatformCAFilters.h&quot;
</span><span class="cx"> #include &quot;PlatformCALayer.h&quot;
</span><span class="cx"> #include &quot;RotateTransformOperation.h&quot;
</span><span class="lines">@@ -1243,7 +1244,7 @@
</span><span class="cx">     // ways of computing coverage.
</span><span class="cx">     switch (type()) {
</span><span class="cx">     case Type::PageTiledBacking:
</span><del>-        coverageRect = tiledBacking()-&gt;computeTileCoverageRect(size(), oldVisibleRect, rects.visibleRect, pageScaleFactor() * deviceScaleFactor());
</del><ins>+        tiledBacking()-&gt;adjustTileCoverageRect(coverageRect, size(), oldVisibleRect, rects.visibleRect, pageScaleFactor() * deviceScaleFactor());
</ins><span class="cx">         break;
</span><span class="cx">     case Type::Normal:
</span><span class="cx">         if (m_layer-&gt;layerType() == PlatformCALayer::LayerTypeTiledBackingLayer)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaTileControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/TileController.cpp (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/TileController.cpp        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/ca/TileController.cpp        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -27,8 +27,10 @@
</span><span class="cx"> #include &quot;TileController.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IntRect.h&quot;
</span><ins>+#include &quot;Logging.h&quot;
</ins><span class="cx"> #include &quot;PlatformCALayer.h&quot;
</span><span class="cx"> #include &quot;Region.h&quot;
</span><ins>+#include &quot;TextStream.h&quot;
</ins><span class="cx"> #include &quot;TileCoverageMap.h&quot;
</span><span class="cx"> #include &quot;TileGrid.h&quot;
</span><span class="cx"> #include &lt;utility&gt;
</span><span class="lines">@@ -185,7 +187,11 @@
</span><span class="cx"> 
</span><span class="cx"> void TileController::setVisibleRect(const FloatRect&amp; rect)
</span><span class="cx"> {
</span><ins>+    if (rect == m_visibleRect)
+        return;
+
</ins><span class="cx">     m_visibleRect = rect;
</span><ins>+    updateTileCoverageMap();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TileController::setCoverageRect(const FloatRect&amp; rect)
</span><span class="lines">@@ -225,8 +231,9 @@
</span><span class="cx"> {
</span><span class="cx">     if (!m_coverageMap)
</span><span class="cx">         return;
</span><ins>+
</ins><span class="cx">     m_coverageMap-&gt;setPosition(position);
</span><del>-    m_coverageMap-&gt;update();
</del><ins>+    updateTileCoverageMap();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TileController::prepopulateRect(const FloatRect&amp; rect)
</span><span class="lines">@@ -314,18 +321,48 @@
</span><span class="cx">     return boundsWithoutMargin;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FloatRect TileController::computeTileCoverageRect(const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; visibleRect, float contentsScale) const
</del><ins>+#if !PLATFORM(IOS)
+// Return 'rect' padded evenly on all sides to achieve 'newSize', but make the padding uneven to contain within constrainingRect.
+static FloatRect expandRectWithinRect(const FloatRect&amp; rect, const FloatSize&amp; newSize, const FloatRect&amp; constrainingRect)
</ins><span class="cx"> {
</span><ins>+    ASSERT(newSize.width() &gt;= rect.width() &amp;&amp; newSize.height() &gt;= rect.height());
+
+    FloatSize extraSize = newSize - rect.size();
+    
+    FloatRect expandedRect = rect;
+    expandedRect.inflateX(extraSize.width() / 2);
+    expandedRect.inflateY(extraSize.height() / 2);
+
+    if (expandedRect.x() &lt; constrainingRect.x())
+        expandedRect.setX(constrainingRect.x());
+    else if (expandedRect.maxX() &gt; constrainingRect.maxX())
+        expandedRect.setX(constrainingRect.maxX() - expandedRect.width());
+    
+    if (expandedRect.y() &lt; constrainingRect.y())
+        expandedRect.setY(constrainingRect.y());
+    else if (expandedRect.maxY() &gt; constrainingRect.maxY())
+        expandedRect.setY(constrainingRect.maxY() - expandedRect.height());
+    
+    return intersection(expandedRect, constrainingRect);
+}
+#endif
+
+void TileController::adjustTileCoverageRect(FloatRect&amp; coverageRect, const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; visibleRect, float contentsScale) const
+{
</ins><span class="cx">     // If the page is not in a window (for example if it's in a background tab), we limit the tile coverage rect to the visible rect.
</span><del>-    if (!m_isInWindow)
-        return visibleRect;
</del><ins>+    if (!m_isInWindow) {
+        coverageRect = visibleRect;
+        return;
+    }
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     // FIXME: unify the iOS and Mac code.
</span><span class="cx">     UNUSED_PARAM(previousVisibleRect);
</span><span class="cx">     
</span><del>-    if (m_tileCoverage == CoverageForVisibleArea || MemoryPressureHandler::singleton().isUnderMemoryPressure())
-        return visibleRect;
</del><ins>+    if (m_tileCoverage == CoverageForVisibleArea || MemoryPressureHandler::singleton().isUnderMemoryPressure()) {
+        coverageRect = visibleRect;
+        return;
+    }
</ins><span class="cx"> 
</span><span class="cx">     double horizontalMargin = tileSize().width() / contentsScale;
</span><span class="cx">     double verticalMargin = tileSize().height() / contentsScale;
</span><span class="lines">@@ -351,8 +388,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!m_velocity.horizontalVelocity &amp;&amp; !m_velocity.verticalVelocity) {
</span><del>-        if (m_velocity.scaleChangeRate &gt; 0)
-            return visibleRect;
</del><ins>+        if (m_velocity.scaleChangeRate &gt; 0) {
+            coverageRect = visibleRect;
+            return;
+        }
</ins><span class="cx">         futureRect.setWidth(futureRect.width() + horizontalMargin);
</span><span class="cx">         futureRect.setHeight(futureRect.height() + verticalMargin);
</span><span class="cx">         futureRect.setX(futureRect.x() - horizontalMargin / 2);
</span><span class="lines">@@ -371,41 +410,35 @@
</span><span class="cx">     if (futureRect.y() &lt; 0)
</span><span class="cx">         futureRect.setY(0);
</span><span class="cx"> 
</span><del>-    return futureRect;
</del><ins>+    coverageRect.unite(futureRect);
+    return;
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(contentsScale);
</span><span class="cx"> 
</span><span class="cx">     // FIXME: look at how far the document can scroll in each dimension.
</span><del>-    float coverageHorizontalSize = visibleRect.width();
-    float coverageVerticalSize = visibleRect.height();
</del><ins>+    FloatSize coverageSize = visibleRect.size();
</ins><span class="cx"> 
</span><span class="cx">     bool largeVisibleRectChange = !previousVisibleRect.isEmpty() &amp;&amp; !visibleRect.intersects(previousVisibleRect);
</span><span class="cx"> 
</span><span class="cx">     // Inflate the coverage rect so that it covers 2x of the visible width and 3x of the visible height.
</span><span class="cx">     // These values were chosen because it's more common to have tall pages and to scroll vertically,
</span><span class="cx">     // so we keep more tiles above and below the current area.
</span><ins>+    float widthScale = 1;
+    float heightScale = 1;
</ins><span class="cx"> 
</span><span class="cx">     if (m_tileCoverage &amp; CoverageForHorizontalScrolling &amp;&amp; !largeVisibleRectChange)
</span><del>-        coverageHorizontalSize *= 2;
</del><ins>+        widthScale = 2;
</ins><span class="cx"> 
</span><span class="cx">     if (m_tileCoverage &amp; CoverageForVerticalScrolling &amp;&amp; !largeVisibleRectChange)
</span><del>-        coverageVerticalSize *= 3;
</del><ins>+        heightScale = 3;
+    
+    coverageSize.scale(widthScale, heightScale);
</ins><span class="cx"> 
</span><del>-    coverageVerticalSize += topMarginHeight() + bottomMarginHeight();
-    coverageHorizontalSize += leftMarginWidth() + rightMarginWidth();
-
-    // Can't use m_tileCacheLayer-&gt;bounds() here, because the size of the underlying platform layer
-    // hasn't been updated for the current commit.
</del><span class="cx">     FloatRect coverageBounds = boundsForSize(newSize);
</span><del>-    float coverageLeft = visibleRect.x() - (coverageHorizontalSize - visibleRect.width()) / 2;
-    coverageLeft = std::min(coverageLeft, coverageBounds.maxX() - coverageHorizontalSize);
-    coverageLeft = std::max(coverageLeft, coverageBounds.x());
-
-    float coverageTop = visibleRect.y() - (coverageVerticalSize - visibleRect.height()) / 2;
-    coverageTop = std::min(coverageTop, coverageBounds.maxY() - coverageVerticalSize);
-    coverageTop = std::max(coverageTop, coverageBounds.y());
-
-    return FloatRect(coverageLeft, coverageTop, coverageHorizontalSize, coverageVerticalSize);
</del><ins>+    
+    FloatRect coverage = expandRectWithinRect(visibleRect, coverageSize, coverageBounds);
+    LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;TileController::computeTileCoverageRect newSize=&quot; &lt;&lt; newSize &lt;&lt; &quot; mode &quot; &lt;&lt; m_tileCoverage &lt;&lt; &quot; expanded to &quot; &lt;&lt; coverageSize &lt;&lt; &quot; bounds with margin &quot; &lt;&lt; coverageBounds &lt;&lt; &quot; coverage &quot; &lt;&lt; coverage);
+    coverageRect.unite(coverage);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -500,7 +533,7 @@
</span><span class="cx"> void TileController::updateTileCoverageMap()
</span><span class="cx"> {
</span><span class="cx">     if (m_coverageMap)
</span><del>-        m_coverageMap-&gt;update();
</del><ins>+        m_coverageMap-&gt;setNeedsUpdate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntRect TileController::tileGridExtent() const
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaTileControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/TileController.h (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/TileController.h        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/ca/TileController.h        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -106,7 +106,7 @@
</span><span class="cx">     virtual int leftMarginWidth() const override;
</span><span class="cx">     virtual int rightMarginWidth() const override;
</span><span class="cx">     virtual TileCoverage tileCoverage() const override { return m_tileCoverage; }
</span><del>-    virtual FloatRect computeTileCoverageRect(const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; currentVisibleRect, float contentsScale) const override;
</del><ins>+    virtual void adjustTileCoverageRect(FloatRect&amp; coverageRect, const FloatSize&amp; newSize, const FloatRect&amp; previousVisibleRect, const FloatRect&amp; currentVisibleRect, float contentsScale) const override;
</ins><span class="cx">     virtual bool unparentsOffscreenTiles() const override { return m_unparentsOffscreenTiles; }
</span><span class="cx">     virtual bool scrollingPerformanceLoggingEnabled() const override { return m_scrollingPerformanceLoggingEnabled; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaTileCoverageMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.cpp (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.cpp        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.cpp        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> TileCoverageMap::TileCoverageMap(const TileController&amp; controller)
</span><span class="cx">     : m_controller(controller)
</span><ins>+    , m_updateTimer(*this, &amp;TileCoverageMap::updateTimerFired)
</ins><span class="cx">     , m_layer(*controller.rootLayer().createCompatibleLayer(PlatformCALayer::LayerTypeSimpleLayer, this))
</span><span class="cx">     , m_visibleRectIndicatorLayer(*controller.rootLayer().createCompatibleLayer(PlatformCALayer::LayerTypeLayer, nullptr))
</span><span class="cx">     , m_coverageRectIndicatorLayer(*controller.rootLayer().createCompatibleLayer(PlatformCALayer::LayerTypeLayer, nullptr))
</span><span class="lines">@@ -46,10 +47,12 @@
</span><span class="cx">     m_layer.get().setPosition(FloatPoint(2, 2));
</span><span class="cx">     m_layer.get().setContentsScale(m_controller.deviceScaleFactor());
</span><span class="cx"> 
</span><ins>+    m_visibleRectIndicatorLayer.get().setName(&quot;visible rect indicator&quot;);
</ins><span class="cx">     m_visibleRectIndicatorLayer.get().setBorderWidth(2);
</span><span class="cx">     m_visibleRectIndicatorLayer.get().setAnchorPoint(FloatPoint3D());
</span><span class="cx">     m_visibleRectIndicatorLayer.get().setBorderColor(Color(255, 0, 0));
</span><span class="cx">     
</span><ins>+    m_coverageRectIndicatorLayer.get().setName(&quot;coverage indicator&quot;);
</ins><span class="cx">     m_coverageRectIndicatorLayer.get().setBorderWidth(2);
</span><span class="cx">     m_coverageRectIndicatorLayer.get().setAnchorPoint(FloatPoint3D());
</span><span class="cx">     m_coverageRectIndicatorLayer.get().setBorderColor(Color(0, 0, 128));
</span><span class="lines">@@ -65,6 +68,17 @@
</span><span class="cx">     m_layer.get().setOwner(nullptr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TileCoverageMap::setNeedsUpdate()
+{
+    if (!m_updateTimer.isActive())
+        m_updateTimer.startOneShot(0);
+}
+
+void TileCoverageMap::updateTimerFired()
+{
+    update();
+}
+
</ins><span class="cx"> void TileCoverageMap::update()
</span><span class="cx"> {
</span><span class="cx">     FloatRect containerBounds = m_controller.bounds();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaTileCoverageMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.h (194606 => 194607)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.h        2016-01-05 22:04:59 UTC (rev 194606)
+++ trunk/Source/WebCore/platform/graphics/ca/TileCoverageMap.h        2016-01-05 22:09:20 UTC (rev 194607)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;IntRect.h&quot;
</span><span class="cx"> #include &quot;PlatformCALayer.h&quot;
</span><span class="cx"> #include &quot;PlatformCALayerClient.h&quot;
</span><ins>+#include &quot;Timer.h&quot;
</ins><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -53,6 +54,8 @@
</span><span class="cx"> 
</span><span class="cx">     void setDeviceScaleFactor(float);
</span><span class="cx"> 
</span><ins>+    void setNeedsUpdate();
+
</ins><span class="cx"> private:
</span><span class="cx">     // PlatformCALayerClient
</span><span class="cx">     virtual GraphicsLayer::CompositingCoordinatesOrientation platformCALayerContentsOrientation() const override { return GraphicsLayer::CompositingCoordinatesTopDown; }
</span><span class="lines">@@ -61,7 +64,11 @@
</span><span class="cx">     virtual void platformCALayerPaintContents(PlatformCALayer*, GraphicsContext&amp;, const FloatRect&amp;) override;
</span><span class="cx">     virtual float platformCALayerDeviceScaleFactor() const override;
</span><span class="cx"> 
</span><ins>+    void updateTimerFired();
+    
</ins><span class="cx">     const TileController&amp; m_controller;
</span><ins>+    
+    Timer m_updateTimer;
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;PlatformCALayer&gt; m_layer;
</span><span class="cx">     Ref&lt;PlatformCALayer&gt; m_visibleRectIndicatorLayer;
</span></span></pre>
</div>
</div>

</body>
</html>