<!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>[211683] 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/211683">211683</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2017-02-05 11:18:16 -0800 (Sun, 05 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clean up how GraphicsLayer's &quot;inWindow&quot; state is set, and fix some issues with Page Overlays
https://bugs.webkit.org/show_bug.cgi?id=167850

Reviewed by Tim Horton.
Source/WebCore:

RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants() walked the RenderLayer
tree to set the GraphicsLayer's &quot;inWindow&quot; state. This had the problem of skipping non-primary
GraphicsLayers. We also never did this work for page overlay layers.

Fix by giving GraphicsLayers a recursive function that sets the inWindow state, and call that
from RenderLayerCompositor::setIsInWindow() and PageOverlayController.

PageOverlayController also needs to implement tiledBackingUsageChanged so that tiled backings
created dynamically get the correct in-window state.

Page overlays also had some serious issues in MiniBrowser, in that they disappeared on reload,
and on hide/show web view. This was because the overlay root layers were re-parented, but
addChild() for each overlay's layer wasn't called. Clean up by replacing willAttachRootLayer() followed
by viewOverlayRootLayer()/documentOverlayRootLayer() with single calls that set up the layers,
update the inWindow state, and return the layer.

Make it possible to dump tile caches in page overlay tests.

Make showGraphicsLayers() always dump page overlay layers (source of much confusion).

Test: pageoverlay/overlay-remove-reinsert-view.html

* page/PageOverlayController.cpp:
(WebCore::PageOverlayController::documentOverlayRootLayer):
(WebCore::PageOverlayController::viewOverlayRootLayer):
(WebCore::PageOverlayController::layerWithDocumentOverlays):
(WebCore::PageOverlayController::layerWithViewOverlays):
(WebCore::PageOverlayController::tiledBackingUsageChanged):
(WebCore::PageOverlayController::willAttachRootLayer): Deleted.
* page/PageOverlayController.h:
* platform/graphics/GraphicsLayer.cpp:
(WebCore::GraphicsLayer::setIsInWindowIncludingDescendants):
(WebCore::dumpChildren):
* platform/graphics/GraphicsLayer.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::appendDocumentOverlayLayers):
(WebCore::RenderLayerCompositor::setIsInWindow):
(WebCore::RenderLayerCompositor::attachRootLayer):
(WebCore::RenderLayerCompositor::rootLayerAttachmentChanged):
(WebCore::RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants): Deleted.
* rendering/RenderLayerCompositor.h:
* testing/Internals.cpp:
(WebCore::toLayerTreeFlags):
(WebCore::Internals::layerTreeAsText):
(WebCore::Internals::pageOverlayLayerTreeAsText):
* testing/Internals.h:
* testing/Internals.idl:
* testing/MockPageOverlayClient.cpp:
(WebCore::MockPageOverlayClient::layerTreeAsText):
* testing/MockPageOverlayClient.h:

Tools:

* DumpRenderTree/TestRunner.cpp:
(TestRunner::uiScriptDidComplete): Fix an assertion that fires for non-16-bit strings.

LayoutTests:

* pageoverlay/overlay-large-document-expected.txt:
* pageoverlay/overlay-large-document-scrolled-expected.txt:
* pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
* pageoverlay/overlay-remove-reinsert-view.html: Added.
* platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
* platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
* tiled-drawing/tiled-backing-in-window-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestspageoverlayoverlaylargedocumentexpectedtxt">trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt</a></li>
<li><a href="#trunkLayoutTestspageoverlayoverlaylargedocumentscrolledexpectedtxt">trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1TestExpectations">trunk/LayoutTests/platform/mac-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTeststileddrawingtiledbackinginwindowexpectedtxt">trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepagePageOverlayControllercpp">trunk/Source/WebCore/page/PageOverlayController.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageOverlayControllerh">trunk/Source/WebCore/page/PageOverlayController.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayercpp">trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayerh">trunk/Source/WebCore/platform/graphics/GraphicsLayer.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorh">trunk/Source/WebCore/rendering/RenderLayerCompositor.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalscpp">trunk/Source/WebCore/testing/Internals.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsh">trunk/Source/WebCore/testing/Internals.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsidl">trunk/Source/WebCore/testing/Internals.idl</a></li>
<li><a href="#trunkSourceWebCoretestingMockPageOverlayClientcpp">trunk/Source/WebCore/testing/MockPageOverlayClient.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingMockPageOverlayClienth">trunk/Source/WebCore/testing/MockPageOverlayClient.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreeTestRunnercpp">trunk/Tools/DumpRenderTree/TestRunner.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestspageoverlayoverlayremovereinsertviewexpectedtxt">trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt</a></li>
<li><a href="#trunkLayoutTestspageoverlayoverlayremovereinsertviewhtml">trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html</a></li>
<li>trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/</li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk2pageoverlayoverlayremovereinsertviewexpectedtxt">trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1pageoverlayoverlayremovereinsertviewexpectedtxt">trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/ChangeLog        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2017-02-04  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Clean up how GraphicsLayer's &quot;inWindow&quot; state is set, and fix some issues with Page Overlays
+        https://bugs.webkit.org/show_bug.cgi?id=167850
+
+        Reviewed by Tim Horton.
+
+        * pageoverlay/overlay-large-document-expected.txt:
+        * pageoverlay/overlay-large-document-scrolled-expected.txt:
+        * pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+        * pageoverlay/overlay-remove-reinsert-view.html: Added.
+        * platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+        * platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+        * tiled-drawing/tiled-backing-in-window-expected.txt:
+
</ins><span class="cx"> 2017-02-05  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Simple line layout: Use RenderText::canUseSimpleFontCodePath() only as a hint.
</span></span></pre></div>
<a id="trunkLayoutTestspageoverlayoverlaylargedocumentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -8,7 +8,7 @@
</span><span class="cx">   (children 1
</span><span class="cx">     (GraphicsLayer
</span><span class="cx">       (anchor 0.00 0.00)
</span><del>-      (bounds 785.00 585.00)
</del><ins>+      (bounds 800.00 600.00)
</ins><span class="cx">       (drawsContent 1)
</span><span class="cx">       (backgroundColor #00000000)
</span><span class="cx">     )
</span></span></pre></div>
<a id="trunkLayoutTestspageoverlayoverlaylargedocumentscrolledexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -8,7 +8,7 @@
</span><span class="cx">   (children 1
</span><span class="cx">     (GraphicsLayer
</span><span class="cx">       (anchor 0.00 0.00)
</span><del>-      (bounds 785.00 585.00)
</del><ins>+      (bounds 800.00 600.00)
</ins><span class="cx">       (drawsContent 1)
</span><span class="cx">       (backgroundColor #00000000)
</span><span class="cx">     )
</span></span></pre></div>
<a id="trunkLayoutTestspageoverlayoverlayremovereinsertviewexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt                                (rev 0)
+++ trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 785, 585)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 785, 585)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+Layers after removal
+
+View-relative:
+(no view-relative overlay root)
+
+Document-relative:
+(no document-relative overlay root)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 785.00 585.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestspageoverlayoverlayremovereinsertviewhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html (0 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html                                (rev 0)
+++ trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+&lt;html&gt;
+&lt;style&gt;
+body {
+    height: 5000px;
+    width: 5000px;
+}
+&lt;/style&gt;
+&lt;script&gt;
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    function getWaitForPresentationUpdateUIScript()
+    {
+        return `
+        (function() {
+            uiController.doAfterPresentationUpdate(function() {
+                uiController.uiScriptComplete('');
+            });
+        })();`
+    }
+
+    function getUnparentUIScript()
+    {
+        return `
+        (function() {
+            uiController.removeViewFromWindow(function() {
+                uiController.uiScriptComplete('');
+            });
+        })();`
+    }
+
+    function getReinsertUIScript()
+    {
+        return `
+        (function() {
+            uiController.addViewToWindow(function() {
+                uiController.uiScriptComplete('');
+            });
+        })();`
+    }
+
+    function dumpLayers(outputId)
+    {
+        if (window.internals) {
+            document.getElementById(outputId).innerText = window.internals.pageOverlayLayerTreeAsText(internals.LAYER_TREE_INCLUDES_TILE_CACHES);
+        }
+    }
+
+    function doTest()
+    {
+        if (!window.testRunner || !testRunner.runUIScript)
+            return;
+
+        internals.installMockPageOverlay(&quot;document&quot;);
+        internals.installMockPageOverlay(&quot;view&quot;);
+
+        // Waiting for a presentation update is needed to get the document overlay to become tiled.
+        testRunner.runUIScript(getWaitForPresentationUpdateUIScript(), function(result) {
+            dumpLayers('before-layers');
+
+            testRunner.runUIScript(getUnparentUIScript(), function(result) {
+                dumpLayers('view-removed-layers');
+
+                testRunner.runUIScript(getReinsertUIScript(), function(result) {
+                    dumpLayers('view-reinsertion-layers');
+                    if (window.testRunner)
+                        testRunner.notifyDone();
+                });
+            });
+        });
+    }
+
+    window.addEventListener('load', doTest, false);
+&lt;/script&gt;
+&lt;body&gt;
+    &lt;h2&gt;Initial layers&lt;/h2&gt;
+    &lt;pre id=&quot;before-layers&quot;&gt;Layer tree goes here&lt;/pre&gt;
+
+    &lt;h2&gt;Layers after removal&lt;/h2&gt;
+    &lt;pre id=&quot;view-removed-layers&quot;&gt;Layer tree goes here&lt;/pre&gt;
+
+    &lt;h2&gt;Layers after re-insertion&lt;/h2&gt;
+    &lt;pre id=&quot;view-reinsertion-layers&quot;&gt;Layer tree goes here&lt;/pre&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk2pageoverlayoverlayremovereinsertviewexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt                                (rev 0)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 800, 600)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 800, 600)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+Layers after removal
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -305,3 +305,5 @@
</span><span class="cx"> webkit.org/b/163598 media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-buttons-styles.html [ Pass Timeout ]
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/167127 pointer-lock/locked-element-removed-from-dom.html
</span><ins>+
+webkit.org/b/167857 pageoverlay/overlay-remove-reinsert-view.html [ Skip ]
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1pageoverlayoverlayremovereinsertviewexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt                                (rev 0)
+++ trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -0,0 +1,74 @@
</span><ins>+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+Layers after removal
+
+View-relative:
+(no view-relative overlay root)
+
+Document-relative:
+(no document-relative overlay root)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 800.00 600.00)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+    )
+  )
+)
+
+
+Document-relative:
+(GraphicsLayer
+  (children 1
+    (GraphicsLayer
+      (anchor 0.00 0.00)
+      (bounds 5008.00 5016.00)
+      (usingTiledLayer 1)
+      (drawsContent 1)
+      (backgroundColor #00000000)
+      (tile cache coverage 0, 0 1024 x 1024)
+      (tile size 512 x 512)
+      (top left tile 0, 0 tiles grid 2 x 2)
+      (in window 1)
+    )
+  )
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTeststileddrawingtiledbackinginwindowexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">       (tile cache coverage 0, 0 1024 x 1016)
</span><span class="cx">       (tile size 512 x 512)
</span><span class="cx">       (top left tile 0, 0 tiles grid 2 x 2)
</span><del>-      (in window 0)
</del><ins>+      (in window 1)
</ins><span class="cx">       (children 1
</span><span class="cx">         (GraphicsLayer
</span><span class="cx">           (position 8.00 8.00)
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/ChangeLog        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -1,3 +1,61 @@
</span><ins>+2017-02-04  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Clean up how GraphicsLayer's &quot;inWindow&quot; state is set, and fix some issues with Page Overlays
+        https://bugs.webkit.org/show_bug.cgi?id=167850
+
+        Reviewed by Tim Horton.
+        
+        RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants() walked the RenderLayer
+        tree to set the GraphicsLayer's &quot;inWindow&quot; state. This had the problem of skipping non-primary
+        GraphicsLayers. We also never did this work for page overlay layers.
+
+        Fix by giving GraphicsLayers a recursive function that sets the inWindow state, and call that
+        from RenderLayerCompositor::setIsInWindow() and PageOverlayController.
+
+        PageOverlayController also needs to implement tiledBackingUsageChanged so that tiled backings
+        created dynamically get the correct in-window state.
+
+        Page overlays also had some serious issues in MiniBrowser, in that they disappeared on reload,
+        and on hide/show web view. This was because the overlay root layers were re-parented, but
+        addChild() for each overlay's layer wasn't called. Clean up by replacing willAttachRootLayer() followed
+        by viewOverlayRootLayer()/documentOverlayRootLayer() with single calls that set up the layers,
+        update the inWindow state, and return the layer.
+
+        Make it possible to dump tile caches in page overlay tests.
+
+        Make showGraphicsLayers() always dump page overlay layers (source of much confusion).
+
+        Test: pageoverlay/overlay-remove-reinsert-view.html
+
+        * page/PageOverlayController.cpp:
+        (WebCore::PageOverlayController::documentOverlayRootLayer):
+        (WebCore::PageOverlayController::viewOverlayRootLayer):
+        (WebCore::PageOverlayController::layerWithDocumentOverlays):
+        (WebCore::PageOverlayController::layerWithViewOverlays):
+        (WebCore::PageOverlayController::tiledBackingUsageChanged):
+        (WebCore::PageOverlayController::willAttachRootLayer): Deleted.
+        * page/PageOverlayController.h:
+        * platform/graphics/GraphicsLayer.cpp:
+        (WebCore::GraphicsLayer::setIsInWindowIncludingDescendants):
+        (WebCore::dumpChildren):
+        * platform/graphics/GraphicsLayer.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::appendDocumentOverlayLayers):
+        (WebCore::RenderLayerCompositor::setIsInWindow):
+        (WebCore::RenderLayerCompositor::attachRootLayer):
+        (WebCore::RenderLayerCompositor::rootLayerAttachmentChanged):
+        (WebCore::RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants): Deleted.
+        * rendering/RenderLayerCompositor.h:
+        * testing/Internals.cpp:
+        (WebCore::toLayerTreeFlags):
+        (WebCore::Internals::layerTreeAsText):
+        (WebCore::Internals::pageOverlayLayerTreeAsText):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+        * testing/MockPageOverlayClient.cpp:
+        (WebCore::MockPageOverlayClient::layerTreeAsText):
+        * testing/MockPageOverlayClient.h:
+
</ins><span class="cx"> 2017-02-05  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Simple line layout: Use RenderText::canUseSimpleFontCodePath() only as a hint.
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageOverlayControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageOverlayController.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageOverlayController.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/page/PageOverlayController.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -72,16 +72,14 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GraphicsLayer&amp; PageOverlayController::documentOverlayRootLayer()
</del><ins>+GraphicsLayer* PageOverlayController::documentOverlayRootLayer() const
</ins><span class="cx"> {
</span><del>-    createRootLayersIfNeeded();
-    return *m_documentOverlayRootLayer;
</del><ins>+    return m_documentOverlayRootLayer.get();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GraphicsLayer&amp; PageOverlayController::viewOverlayRootLayer()
</del><ins>+GraphicsLayer* PageOverlayController::viewOverlayRootLayer() const
</ins><span class="cx"> {
</span><del>-    createRootLayersIfNeeded();
-    return *m_viewOverlayRootLayer;
</del><ins>+    return m_viewOverlayRootLayer.get();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void updateOverlayGeometry(PageOverlay&amp; overlay, GraphicsLayer&amp; graphicsLayer)
</span><span class="lines">@@ -95,6 +93,50 @@
</span><span class="cx">     graphicsLayer.setSize(overlayFrame.size());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GraphicsLayer&amp; PageOverlayController::layerWithDocumentOverlays()
+{
+    createRootLayersIfNeeded();
+
+    bool inWindow = m_mainFrame.page() ? m_mainFrame.page()-&gt;isInWindow() : false;
+
+    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers) {
+        PageOverlay&amp; overlay = *overlayAndLayer.key;
+        if (overlay.overlayType() != PageOverlay::OverlayType::Document)
+            continue;
+
+        GraphicsLayer&amp; layer = *overlayAndLayer.value;
+        layer.setIsInWindowIncludingDescendants(inWindow);
+        updateOverlayGeometry(overlay, layer);
+        
+        if (!layer.parent())
+            m_documentOverlayRootLayer-&gt;addChild(&amp;layer);
+    }
+
+    return *m_documentOverlayRootLayer;
+}
+
+GraphicsLayer&amp; PageOverlayController::layerWithViewOverlays()
+{
+    createRootLayersIfNeeded();
+
+    bool inWindow = m_mainFrame.page() ? m_mainFrame.page()-&gt;isInWindow() : false;
+
+    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers) {
+        PageOverlay&amp; overlay = *overlayAndLayer.key;
+        if (overlay.overlayType() != PageOverlay::OverlayType::View)
+            continue;
+
+        GraphicsLayer&amp; layer = *overlayAndLayer.value;
+        layer.setIsInWindowIncludingDescendants(inWindow);
+        updateOverlayGeometry(overlay, layer);
+        
+        if (!layer.parent())
+            m_viewOverlayRootLayer-&gt;addChild(&amp;layer);
+    }
+
+    return *m_viewOverlayRootLayer;
+}
+
</ins><span class="cx"> void PageOverlayController::installPageOverlay(PageOverlay&amp; overlay, PageOverlay::FadeMode fadeMode)
</span><span class="cx"> {
</span><span class="cx">     createRootLayersIfNeeded();
</span><span class="lines">@@ -201,12 +243,6 @@
</span><span class="cx">     return *m_overlayGraphicsLayers.get(&amp;overlay);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageOverlayController::willAttachRootLayer()
-{
-    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers)
-        updateOverlayGeometry(*overlayAndLayer.key, *overlayAndLayer.value);
-}
-
</del><span class="cx"> void PageOverlayController::willDetachRootLayer()
</span><span class="cx"> {
</span><span class="cx">     m_documentOverlayRootLayer = nullptr;
</span><span class="lines">@@ -367,4 +403,10 @@
</span><span class="cx">     return !(behavior &amp; LayerTreeAsTextIncludePageOverlayLayers);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PageOverlayController::tiledBackingUsageChanged(const GraphicsLayer* graphicsLayer, bool usingTiledBacking)
+{
+    if (usingTiledBacking)
+        graphicsLayer-&gt;tiledBacking()-&gt;setIsInWindow(m_mainFrame.page()-&gt;isInWindow());
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageOverlayControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageOverlayController.h (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageOverlayController.h        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/page/PageOverlayController.h        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -44,9 +44,12 @@
</span><span class="cx">     PageOverlayController(MainFrame&amp;);
</span><span class="cx">     virtual ~PageOverlayController();
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT GraphicsLayer&amp; documentOverlayRootLayer();
-    WEBCORE_EXPORT GraphicsLayer&amp; viewOverlayRootLayer();
</del><ins>+    GraphicsLayer&amp; layerWithDocumentOverlays();
+    GraphicsLayer&amp; layerWithViewOverlays();
</ins><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT GraphicsLayer* documentOverlayRootLayer() const;
+    WEBCORE_EXPORT GraphicsLayer* viewOverlayRootLayer() const;
+
</ins><span class="cx">     const Vector&lt;RefPtr&lt;PageOverlay&gt;&gt;&amp; pageOverlays() const { return m_pageOverlays; }
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void installPageOverlay(PageOverlay&amp;, PageOverlay::FadeMode);
</span><span class="lines">@@ -57,7 +60,6 @@
</span><span class="cx">     void clearPageOverlay(PageOverlay&amp;);
</span><span class="cx">     GraphicsLayer&amp; layerForOverlay(PageOverlay&amp;) const;
</span><span class="cx"> 
</span><del>-    void willAttachRootLayer();
</del><span class="cx">     void willDetachRootLayer();
</span><span class="cx"> 
</span><span class="cx">     void didChangeViewSize();
</span><span class="lines">@@ -89,6 +91,7 @@
</span><span class="cx">     void paintContents(const GraphicsLayer*, GraphicsContext&amp;, GraphicsLayerPaintingPhase, const FloatRect&amp; clipRect) override;
</span><span class="cx">     float deviceScaleFactor() const override;
</span><span class="cx">     bool shouldSkipLayerInDump(const GraphicsLayer*, LayerTreeAsTextBehavior) const override;
</span><ins>+    void tiledBackingUsageChanged(const GraphicsLayer*, bool) override;
</ins><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;GraphicsLayer&gt; m_documentOverlayRootLayer;
</span><span class="cx">     std::unique_ptr&lt;GraphicsLayer&gt; m_viewOverlayRootLayer;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -364,6 +364,15 @@
</span><span class="cx">         childLayers[i]-&gt;noteDeviceOrPageScaleFactorChangedIncludingDescendants();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GraphicsLayer::setIsInWindowIncludingDescendants(bool inWindow)
+{
+    if (usingTiledBacking())
+        tiledBacking()-&gt;setIsInWindow(inWindow);
+
+    for (auto* childLayer : children())
+        childLayer-&gt;setIsInWindowIncludingDescendants(inWindow);
+}
+
</ins><span class="cx"> void GraphicsLayer::setReplicatedByLayer(GraphicsLayer* layer)
</span><span class="cx"> {
</span><span class="cx">     if (m_replicaLayer == layer)
</span><span class="lines">@@ -680,7 +689,7 @@
</span><span class="cx"> {
</span><span class="cx">     totalChildCount += children.size();
</span><span class="cx">     for (auto* child : children) {
</span><del>-        if (!child-&gt;client().shouldSkipLayerInDump(child, behavior)) {
</del><ins>+        if ((behavior &amp; LayerTreeAsTextDebug) || !child-&gt;client().shouldSkipLayerInDump(child, behavior)) {
</ins><span class="cx">             child-&gt;dumpLayer(ts, indent + 2, behavior);
</span><span class="cx">             continue;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.h (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -517,6 +517,8 @@
</span><span class="cx">     virtual void deviceOrPageScaleFactorChanged() { }
</span><span class="cx">     WEBCORE_EXPORT void noteDeviceOrPageScaleFactorChangedIncludingDescendants();
</span><span class="cx"> 
</span><ins>+    void setIsInWindowIncludingDescendants(bool);
+
</ins><span class="cx">     // Some compositing systems may do internal batching to synchronize compositing updates
</span><span class="cx">     // with updates drawn into the window. These methods flush internal batched state on this layer
</span><span class="cx">     // and descendant layers, and this layer only.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -777,9 +777,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     Frame&amp; frame = m_renderView.frameView().frame();
</span><del>-    PageOverlayController&amp; pageOverlayController = frame.mainFrame().pageOverlayController();
-    pageOverlayController.willAttachRootLayer();
-    childList.append(&amp;pageOverlayController.documentOverlayRootLayer());
</del><ins>+    childList.append(&amp;frame.mainFrame().pageOverlayController().layerWithDocumentOverlays());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderLayerCompositor::layerBecameNonComposited(const RenderLayer&amp; layer)
</span><span class="lines">@@ -2027,28 +2025,14 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants(RenderLayer&amp; layer, bool isInWindow)
-{
-    if (layer.isComposited()) {
-        if (auto* backing = layer.backing()-&gt;tiledBacking())
-            backing-&gt;setIsInWindow(isInWindow);
-    }
-
-    // No need to recurse if we don't have any other tiled layers.
-    if (!hasNonMainLayersWithTiledBacking())
-        return;
-
-    for (RenderLayer* childLayer = layer.firstChild(); childLayer; childLayer = childLayer-&gt;nextSibling())
-        setIsInWindowForLayerIncludingDescendants(*childLayer, isInWindow);
-}
-
</del><span class="cx"> void RenderLayerCompositor::setIsInWindow(bool isInWindow)
</span><span class="cx"> {
</span><del>-    setIsInWindowForLayerIncludingDescendants(*m_renderView.layer(), isInWindow);
-    
</del><span class="cx">     if (!inCompositingMode())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (GraphicsLayer* rootLayer = rootGraphicsLayer())
+        rootLayer-&gt;setIsInWindowIncludingDescendants(isInWindow);
+
</ins><span class="cx">     if (isInWindow) {
</span><span class="cx">         if (m_rootLayerAttachment != RootLayerUnattached)
</span><span class="cx">             return;
</span><span class="lines">@@ -3468,11 +3452,8 @@
</span><span class="cx">         case RootLayerAttachedViaChromeClient: {
</span><span class="cx">             Frame&amp; frame = m_renderView.frameView().frame();
</span><span class="cx">             page().chrome().client().attachRootGraphicsLayer(frame, rootGraphicsLayer());
</span><del>-            if (frame.isMainFrame()) {
-                PageOverlayController&amp; pageOverlayController = frame.mainFrame().pageOverlayController();
-                pageOverlayController.willAttachRootLayer();
-                page().chrome().client().attachViewOverlayGraphicsLayer(frame, &amp;pageOverlayController.viewOverlayRootLayer());
-            }
</del><ins>+            if (frame.isMainFrame())
+                page().chrome().client().attachViewOverlayGraphicsLayer(frame, &amp;frame.mainFrame().pageOverlayController().layerWithViewOverlays());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case RootLayerAttachedViaEnclosingFrame: {
</span><span class="lines">@@ -3551,9 +3532,7 @@
</span><span class="cx">     if (!frame.isMainFrame())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    PageOverlayController&amp; pageOverlayController = frame.mainFrame().pageOverlayController();
-    pageOverlayController.willAttachRootLayer();
-    m_rootContentLayer-&gt;addChild(&amp;pageOverlayController.documentOverlayRootLayer());
</del><ins>+    m_rootContentLayer-&gt;addChild(&amp;frame.mainFrame().pageOverlayController().layerWithDocumentOverlays());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderLayerCompositor::notifyIFramesOfCompositingChange()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -350,7 +350,6 @@
</span><span class="cx">     bool updateBacking(RenderLayer&amp;, CompositingChangeRepaint shouldRepaint, BackingRequired = BackingRequired::Unknown);
</span><span class="cx"> 
</span><span class="cx">     void clearBackingForLayerIncludingDescendants(RenderLayer&amp;);
</span><del>-    void setIsInWindowForLayerIncludingDescendants(RenderLayer&amp;, bool isInWindow);
</del><span class="cx"> 
</span><span class="cx">     // Repaint this and its child layers.
</span><span class="cx">     void recursiveRepaintLayer(RenderLayer&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -2016,6 +2016,23 @@
</span><span class="cx">     return document-&gt;isPageBoxVisible(pageNumber);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static LayerTreeFlags toLayerTreeFlags(unsigned short flags)
+{
+    LayerTreeFlags layerTreeFlags = 0;
+    if (flags &amp; Internals::LAYER_TREE_INCLUDES_VISIBLE_RECTS)
+        layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects;
+    if (flags &amp; Internals::LAYER_TREE_INCLUDES_TILE_CACHES)
+        layerTreeFlags |= LayerTreeFlagsIncludeTileCaches;
+    if (flags &amp; Internals::LAYER_TREE_INCLUDES_REPAINT_RECTS)
+        layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects;
+    if (flags &amp; Internals::LAYER_TREE_INCLUDES_PAINTING_PHASES)
+        layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases;
+    if (flags &amp; Internals::LAYER_TREE_INCLUDES_CONTENT_LAYERS)
+        layerTreeFlags |= LayerTreeFlagsIncludeContentLayers;
+
+    return layerTreeFlags;
+}
+
</ins><span class="cx"> // FIXME: Remove the document argument. It is almost always the same as
</span><span class="cx"> // contextDocument(), with the exception of a few tests that pass a
</span><span class="cx"> // different document, and could just make the call through another Internals
</span><span class="lines">@@ -2025,19 +2042,7 @@
</span><span class="cx">     if (!document.frame())
</span><span class="cx">         return Exception { INVALID_ACCESS_ERR };
</span><span class="cx"> 
</span><del>-    LayerTreeFlags layerTreeFlags = 0;
-    if (flags &amp; LAYER_TREE_INCLUDES_VISIBLE_RECTS)
-        layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects;
-    if (flags &amp; LAYER_TREE_INCLUDES_TILE_CACHES)
-        layerTreeFlags |= LayerTreeFlagsIncludeTileCaches;
-    if (flags &amp; LAYER_TREE_INCLUDES_REPAINT_RECTS)
-        layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects;
-    if (flags &amp; LAYER_TREE_INCLUDES_PAINTING_PHASES)
-        layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases;
-    if (flags &amp; LAYER_TREE_INCLUDES_CONTENT_LAYERS)
-        layerTreeFlags |= LayerTreeFlagsIncludeContentLayers;
-
-    return document.frame()-&gt;layerTreeAsText(layerTreeFlags);
</del><ins>+    return document.frame()-&gt;layerTreeAsText(toLayerTreeFlags(flags));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ExceptionOr&lt;String&gt; Internals::repaintRectsAsText() const
</span><span class="lines">@@ -3250,7 +3255,7 @@
</span><span class="cx">     return MockPageOverlayClient::singleton().installOverlay(document-&gt;frame()-&gt;mainFrame(), type == PageOverlayType::View ? PageOverlay::OverlayType::View : PageOverlay::OverlayType::Document);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ExceptionOr&lt;String&gt; Internals::pageOverlayLayerTreeAsText() const
</del><ins>+ExceptionOr&lt;String&gt; Internals::pageOverlayLayerTreeAsText(unsigned short flags) const
</ins><span class="cx"> {
</span><span class="cx">     Document* document = contextDocument();
</span><span class="cx">     if (!document || !document-&gt;frame())
</span><span class="lines">@@ -3258,7 +3263,7 @@
</span><span class="cx"> 
</span><span class="cx">     document-&gt;updateLayout();
</span><span class="cx"> 
</span><del>-    return MockPageOverlayClient::singleton().layerTreeAsText(document-&gt;frame()-&gt;mainFrame());
</del><ins>+    return MockPageOverlayClient::singleton().layerTreeAsText(document-&gt;frame()-&gt;mainFrame(), toLayerTreeFlags(flags));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Internals::setPageMuted(const String&amp; states)
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.h (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.h        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.h        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -465,7 +465,7 @@
</span><span class="cx"> 
</span><span class="cx">     enum class PageOverlayType { View, Document };
</span><span class="cx">     ExceptionOr&lt;Ref&lt;MockPageOverlay&gt;&gt; installMockPageOverlay(PageOverlayType);
</span><del>-    ExceptionOr&lt;String&gt; pageOverlayLayerTreeAsText() const;
</del><ins>+    ExceptionOr&lt;String&gt; pageOverlayLayerTreeAsText(unsigned short flags) const;
</ins><span class="cx"> 
</span><span class="cx">     void setPageMuted(const String&amp;);
</span><span class="cx">     String pageMediaState();
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.idl (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.idl        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.idl        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -445,7 +445,7 @@
</span><span class="cx">     [Conditional=VIDEO] boolean elementIsBlockingDisplaySleep(HTMLMediaElement element);
</span><span class="cx"> 
</span><span class="cx">     [MayThrowException] MockPageOverlay installMockPageOverlay(PageOverlayType type);
</span><del>-    [MayThrowException] DOMString pageOverlayLayerTreeAsText();
</del><ins>+    [MayThrowException] DOMString pageOverlayLayerTreeAsText(optional unsigned short flags = 0);
</ins><span class="cx"> 
</span><span class="cx">     void setPageMuted(DOMString mutedState);
</span><span class="cx">     DOMString pageMediaState();
</span></span></pre></div>
<a id="trunkSourceWebCoretestingMockPageOverlayClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/MockPageOverlayClient.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/MockPageOverlayClient.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/MockPageOverlayClient.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -69,9 +69,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String MockPageOverlayClient::layerTreeAsText(MainFrame&amp; mainFrame)
</del><ins>+String MockPageOverlayClient::layerTreeAsText(MainFrame&amp; mainFrame, LayerTreeFlags flags)
</ins><span class="cx"> {
</span><del>-    return &quot;View-relative:\n&quot; + mainFrame.pageOverlayController().viewOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers) + &quot;\n\nDocument-relative:\n&quot; + mainFrame.pageOverlayController().documentOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers);
</del><ins>+    GraphicsLayer* viewOverlayRoot = mainFrame.pageOverlayController().viewOverlayRootLayer();
+    GraphicsLayer* documentOverlayRoot = mainFrame.pageOverlayController().documentOverlayRootLayer();
+    
+    return &quot;View-relative:\n&quot; + (viewOverlayRoot ? viewOverlayRoot-&gt;layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : &quot;(no view-relative overlay root)&quot;)
+        + &quot;\n\nDocument-relative:\n&quot; + (documentOverlayRoot ? documentOverlayRoot-&gt;layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : &quot;(no document-relative overlay root)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MockPageOverlayClient::willMoveToPage(PageOverlay&amp;, Page*)
</span></span></pre></div>
<a id="trunkSourceWebCoretestingMockPageOverlayClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/MockPageOverlayClient.h (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/MockPageOverlayClient.h        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/MockPageOverlayClient.h        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include &quot;Frame.h&quot;
</ins><span class="cx"> #include &quot;MockPageOverlay.h&quot;
</span><span class="cx"> #include &quot;PageOverlay.h&quot;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="lines">@@ -43,7 +44,7 @@
</span><span class="cx">     Ref&lt;MockPageOverlay&gt; installOverlay(MainFrame&amp;, PageOverlay::OverlayType);
</span><span class="cx">     void uninstallAllOverlays();
</span><span class="cx"> 
</span><del>-    String layerTreeAsText(MainFrame&amp;);
</del><ins>+    String layerTreeAsText(MainFrame&amp;, LayerTreeFlags);
</ins><span class="cx"> 
</span><span class="cx">     virtual ~MockPageOverlayClient() { }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Tools/ChangeLog        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2017-02-04  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Clean up how GraphicsLayer's &quot;inWindow&quot; state is set, and fix some issues with Page Overlays
+        https://bugs.webkit.org/show_bug.cgi?id=167850
+
+        Reviewed by Tim Horton.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::uiScriptDidComplete): Fix an assertion that fires for non-16-bit strings.
+
</ins><span class="cx"> 2017-02-04  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Plug some leaks in TestController and UIScriptContext.
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeTestRunnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/TestRunner.cpp (211682 => 211683)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/TestRunner.cpp        2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Tools/DumpRenderTree/TestRunner.cpp        2017-02-05 19:18:16 UTC (rev 211683)
</span><span class="lines">@@ -2431,7 +2431,7 @@
</span><span class="cx"> 
</span><span class="cx"> void TestRunner::uiScriptDidComplete(const String&amp; result, unsigned callbackID)
</span><span class="cx"> {
</span><del>-    JSRetainPtr&lt;JSStringRef&gt; stringRef(Adopt, JSStringCreateWithCharacters(result.characters16(), result.length()));
</del><ins>+    JSRetainPtr&lt;JSStringRef&gt; stringRef(Adopt, JSStringCreateWithUTF8CString(result.utf8().data()));
</ins><span class="cx">     callUIScriptCallback(callbackID, stringRef.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>