<!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>[207100] releases/WebKitGTK/webkit-2.14</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/207100">207100</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-10-11 05:05:57 -0700 (Tue, 11 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/206343">r206343</a> - ASSERTION FAILED: !newRelayoutRoot.container() || is&lt;RenderView&gt;(newRelayoutRoot.container()) || !newRelayoutRoot.container()-&gt;needsLayout() while loading sohu.com
https://bugs.webkit.org/show_bug.cgi?id=162466

Reviewed by Simon Fraser.

Source/WebCore:

When we come across a out-of-flow positioned renderer during layout, we add it to a tracker map with
its containing block (calling RenderBlock::insertPositionedObject).
It ensures that a containing block can easily access to the out-of-flow positioned descendants during layout/painting/hittesting.
We do it even when the containing block - positioned renderer pair is already in this tracker map.
RenderBlock::insertPositionedObject() eagerly sets the positioned-child-needs-layout flag on the containing block
assuming it needs to layout this descendant later in the layout phase.
This patch ensure that we only flag the containing block dirty when the descendant needs layout.

Test: fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::insertPositionedObject):

LayoutTests:

* fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt: Added.
* fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.14/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorerenderingRenderBlockcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/rendering/RenderBlock.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214LayoutTestsfastblockpositioningsubtreeassertwhenpositionedelementdirtiescontainingblockexpectedtxt">releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit214LayoutTestsfastblockpositioningsubtreeassertwhenpositionedelementdirtiescontainingblockhtml">releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/LayoutTests/ChangeLog (207099 => 207100)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/LayoutTests/ChangeLog        2016-10-11 12:01:54 UTC (rev 207099)
+++ releases/WebKitGTK/webkit-2.14/LayoutTests/ChangeLog        2016-10-11 12:05:57 UTC (rev 207100)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-09-23  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        ASSERTION FAILED: !newRelayoutRoot.container() || is&lt;RenderView&gt;(newRelayoutRoot.container()) || !newRelayoutRoot.container()-&gt;needsLayout() while loading sohu.com
+        https://bugs.webkit.org/show_bug.cgi?id=162466
+
+        Reviewed by Simon Fraser.
+
+        * fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt: Added.
+        * fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html: Added.
+
</ins><span class="cx"> 2016-09-23  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r194387): Crash on github.com in IntlDateTimeFormat::resolvedOptions in C locale
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214LayoutTestsfastblockpositioningsubtreeassertwhenpositionedelementdirtiescontainingblockexpectedtxt"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt (0 => 207100)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block-expected.txt        2016-10-11 12:05:57 UTC (rev 207100)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS if no assert in debug.
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214LayoutTestsfastblockpositioningsubtreeassertwhenpositionedelementdirtiescontainingblockhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html (0 => 207100)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/LayoutTests/fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html        2016-10-11 12:05:57 UTC (rev 207100)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that subtree layout works fine with positioned elements.&lt;/title&gt;
+&lt;style&gt;
+div {
+    width: 100px;
+    height: 100px;
+    background-color: green;
+}
+  
+.positionedParent {
+    position: absolute;
+}
+  
+.boundaryParent {
+    overflow: hidden;
+}
+  
+.positionedChild {
+    background-color: blue;
+    position: absolute;
+}
+  
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div&gt;
+  &lt;div class=positionedParent&gt;
+    &lt;div class=boundaryParent&gt;
+          &lt;div id=sibling&gt;&lt;/div&gt;
+          &lt;div class=positionedChild&gt;PASS if no assert in debug.&lt;/div&gt;
+    &lt;/div&gt;
+  &lt;/div&gt;
+&lt;/div&gt;
+&lt;script&gt;
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.waitUntilDone();
+}
+setTimeout(function() {
+    document.getElementById(&quot;sibling&quot;).style.width = &quot;10px&quot;;
+    setTimeout(function() {
+        document.getElementById(&quot;sibling&quot;).style.width = &quot;20px&quot;;
+        if (window.testRunner)
+            testRunner.notifyDone();
+    }, 0);
+}, 0);
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (207099 => 207100)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-10-11 12:01:54 UTC (rev 207099)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-10-11 12:05:57 UTC (rev 207100)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-09-23  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        ASSERTION FAILED: !newRelayoutRoot.container() || is&lt;RenderView&gt;(newRelayoutRoot.container()) || !newRelayoutRoot.container()-&gt;needsLayout() while loading sohu.com
+        https://bugs.webkit.org/show_bug.cgi?id=162466
+
+        Reviewed by Simon Fraser.
+
+        When we come across a out-of-flow positioned renderer during layout, we add it to a tracker map with
+        its containing block (calling RenderBlock::insertPositionedObject).
+        It ensures that a containing block can easily access to the out-of-flow positioned descendants during layout/painting/hittesting.
+        We do it even when the containing block - positioned renderer pair is already in this tracker map.
+        RenderBlock::insertPositionedObject() eagerly sets the positioned-child-needs-layout flag on the containing block
+        assuming it needs to layout this descendant later in the layout phase.
+        This patch ensure that we only flag the containing block dirty when the descendant needs layout.
+
+        Test: fast/block/positioning/subtree-assert-when-positioned-element-dirties-containing-block.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::insertPositionedObject):
+
</ins><span class="cx"> 2016-09-22  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         IDBIndex.openCursor() matches indices on multiple object stores.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/rendering/RenderBlock.cpp (207099 => 207100)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/rendering/RenderBlock.cpp        2016-10-11 12:01:54 UTC (rev 207099)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/rendering/RenderBlock.cpp        2016-10-11 12:05:57 UTC (rev 207100)
</span><span class="lines">@@ -2250,12 +2250,14 @@
</span><span class="cx"> void RenderBlock::insertPositionedObject(RenderBox&amp; positioned)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!isAnonymousBlock());
</span><del>-
</del><span class="cx">     if (positioned.isRenderFlowThread())
</span><span class="cx">         return;
</span><del>-    // We should turn this bit on only while in layout.
-    ASSERT(posChildNeedsLayout() || view().frameView().isInLayout());
-    setPosChildNeedsLayoutBit(true);
</del><ins>+    // FIXME: Find out if we can do this as part of positioned.setChildNeedsLayout(MarkOnlyThis)
+    if (positioned.needsLayout()) {
+        // We should turn this bit on only while in layout.
+        ASSERT(posChildNeedsLayout() || view().frameView().isInLayout());
+        setPosChildNeedsLayoutBit(true);
+    }
</ins><span class="cx">     positionedDescendantsMap().addDescendant(*this, positioned, isRenderView() ? PositionedDescendantsMap::MoveDescendantToEnd::Yes
</span><span class="cx">         : PositionedDescendantsMap::MoveDescendantToEnd::No);
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>