<!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>[175641] 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/175641">175641</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2014-11-05 13:26:28 -0800 (Wed, 05 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Descendant ends up in wrong flow thread with nested columns and spans.
https://bugs.webkit.org/show_bug.cgi?id=137273

Reviewed by Simon Fraser.

Unskipped the two problematic span tests.

Source/WebCore:

* rendering/RenderMultiColumnFlowThread.cpp:
(WebCore::isValidColumnSpanner):
Remove the guard and comment and added the assertion back in.

(WebCore::RenderMultiColumnFlowThread::flowThreadDescendantInserted):
Changed to no longer use handleSpannerRemoval. Because the spanner was removed from the flow thread's map,
handleSpannerRemoval was a no-op. So instead I just removed the placeholder by hand.

The second fix was to stop destroying the placeholder. Since the placeholder can just have been inserted, you
can't delete it, since otherwise code further up the stack will access the deleted object. For now, we just
leak the placeholder.

The third fix is to make sure the subtreeRoot is properly updated to be the new placeholder.

LayoutTests:

* TestExpectations:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderMultiColumnFlowThreadcpp">trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (175640 => 175641)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-11-05 21:22:53 UTC (rev 175640)
+++ trunk/LayoutTests/ChangeLog        2014-11-05 21:26:28 UTC (rev 175641)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2014-11-04  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        Descendant ends up in wrong flow thread with nested columns and spans.
+        https://bugs.webkit.org/show_bug.cgi?id=137273
+
+        Reviewed by Simon Fraser.
+
+        Unskipped the two problematic span tests.
+
+        * TestExpectations:
+
</ins><span class="cx"> 2014-11-05  Bem Jones-Bey  &lt;bjonesbe@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Shapes] Positioned polygon reftests failing again
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (175640 => 175641)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2014-11-05 21:22:53 UTC (rev 175640)
+++ trunk/LayoutTests/TestExpectations        2014-11-05 21:26:28 UTC (rev 175641)
</span><span class="lines">@@ -104,8 +104,6 @@
</span><span class="cx"> # Expando properties on attribute nodes disappear
</span><span class="cx"> webkit.org/b/88045 fast/dom/gc-attribute-node.html [ Failure Pass ]
</span><span class="cx"> 
</span><del>-webkit.org/b/137316 fast/multicol/newmulticol/spanner-crash.html [ Crash Pass ]
-
</del><span class="cx"> # These tests are incorrect in the CSS test suite and should be fixed there first.
</span><span class="cx"> css2.1/20110323/replaced-intrinsic-001.htm [ Failure ]
</span><span class="cx"> css2.1/20110323/replaced-intrinsic-002.htm [ Failure ]
</span><span class="lines">@@ -232,7 +230,5 @@
</span><span class="cx"> webkit.org/b/137883 transitions/color-transition-rounding.html [ Failure Pass ]
</span><span class="cx"> webkit.org/b/137883 transitions/created-while-suspended.html [ Failure Pass ]
</span><span class="cx"> 
</span><del>-webkit.org/b/138145 fast/multicol/multicol-crazy-nesting.html [ Skip ]
-
</del><span class="cx"> # Temporarily turn this off. Back on soon.
</span><span class="cx"> webkit.org/b/138358 http/tests/multipart/stop-crash.html [ Skip ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175640 => 175641)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-05 21:22:53 UTC (rev 175640)
+++ trunk/Source/WebCore/ChangeLog        2014-11-05 21:26:28 UTC (rev 175641)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-11-04  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        Descendant ends up in wrong flow thread with nested columns and spans.
+        https://bugs.webkit.org/show_bug.cgi?id=137273
+
+        Reviewed by Simon Fraser.
+
+        Unskipped the two problematic span tests.
+
+        * rendering/RenderMultiColumnFlowThread.cpp:
+        (WebCore::isValidColumnSpanner):
+        Remove the guard and comment and added the assertion back in.
+
+        (WebCore::RenderMultiColumnFlowThread::flowThreadDescendantInserted):
+        Changed to no longer use handleSpannerRemoval. Because the spanner was removed from the flow thread's map,
+        handleSpannerRemoval was a no-op. So instead I just removed the placeholder by hand.
+
+        The second fix was to stop destroying the placeholder. Since the placeholder can just have been inserted, you
+        can't delete it, since otherwise code further up the stack will access the deleted object. For now, we just
+        leak the placeholder.
+
+        The third fix is to make sure the subtreeRoot is properly updated to be the new placeholder.
+
</ins><span class="cx"> 2014-11-05  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         RenderBlock shouldn't need a pre-destructor hook.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderMultiColumnFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp (175640 => 175641)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp        2014-11-05 21:22:53 UTC (rev 175640)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp        2014-11-05 21:26:28 UTC (rev 175641)
</span><span class="lines">@@ -242,12 +242,8 @@
</span><span class="cx"> static bool isValidColumnSpanner(RenderMultiColumnFlowThread* flowThread, RenderObject* descendant)
</span><span class="cx"> {
</span><span class="cx">     // We assume that we're inside the flow thread. This function is not to be called otherwise.
</span><del>-    // ASSERT(descendant-&gt;isDescendantOf(flowThread));
-    // FIXME: Put this back in when we figure out why spanner-crash.html is triggering it.
-    // See https://bugs.webkit.org/show_bug.cgi?id=137273
-    if (!descendant-&gt;isDescendantOf(flowThread))
-        return false;
-    
</del><ins>+    ASSERT(descendant-&gt;isDescendantOf(flowThread));
+
</ins><span class="cx">     // First make sure that the renderer itself has the right properties for becoming a spanner.
</span><span class="cx">     RenderStyle&amp; style = descendant-&gt;style();
</span><span class="cx">     if (style.columnSpan() != ColumnSpanAll || !is&lt;RenderBox&gt;(*descendant) || descendant-&gt;isFloatingOrOutOfFlowPositioned())
</span><span class="lines">@@ -386,9 +382,10 @@
</span><span class="cx">                 
</span><span class="cx">                 // We have to nuke the placeholder, since the ancestor already lost the mapping to it when
</span><span class="cx">                 // we shifted the placeholder down into this flow thread.
</span><del>-                ancestorBlock.multiColumnFlowThread()-&gt;handleSpannerRemoval(spanner);
-                placeholder.destroy();
-                
</del><ins>+                if (subtreeRoot == descendant)
+                    subtreeRoot = spanner;
+                placeholder.parent()-&gt;removeChild(placeholder);
+
</ins><span class="cx">                 // Now we process the spanner.
</span><span class="cx">                 descendant = processPossibleSpannerDescendant(subtreeRoot, spanner);
</span><span class="cx">                 continue;
</span></span></pre>
</div>
</div>

</body>
</html>