<!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>[201984] 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/201984">201984</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2016-06-12 13:45:44 -0700 (Sun, 12 Jun 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Remove positioned descendants when RenderBlock is no longer a containing block.
https://bugs.webkit.org/show_bug.cgi?id=158655
<rdar://problem/26510032>
Reviewed by Simon Fraser.
Normally the RenderView is the containing block for fixed positioned renderers.
However when a renderer acquires some transform related properties, it becomes the containing
block for all the fixed positioned renderers in its descendant tree.
When the last transform related property is removed, the renderer is no longer a containing block
and we need to remove all these positioned renderers from the descendant tracker map (gPositionedDescendantsMap).
They will be inserted back into the tracker map during the next layout (either under the RenderView or
under the next transformed renderer in the ancestor chain).
Source/WebCore:
Test: fast/block/fixed-position-reparent-when-transition-is-removed.html
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::removePositionedObjectsIfNeeded):
LayoutTests:
* fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt: Added.
* fast/block/fixed-position-reparent-when-transition-is-removed.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockcpp">trunk/Source/WebCore/rendering/RenderBlock.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastblockfixedpositionreparentwhentransitionisremovedexpectedtxt">trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastblockfixedpositionreparentwhentransitionisremovedhtml">trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (201983 => 201984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-06-12 13:22:53 UTC (rev 201983)
+++ trunk/LayoutTests/ChangeLog        2016-06-12 20:45:44 UTC (rev 201984)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-06-12 Zalan Bujtas <zalan@apple.com>
+
+ Remove positioned descendants when RenderBlock is no longer a containing block.
+ https://bugs.webkit.org/show_bug.cgi?id=158655
+ <rdar://problem/26510032>
+
+ Reviewed by Simon Fraser.
+
+ Normally the RenderView is the containing block for fixed positioned renderers.
+ However when a renderer acquires some transform related properties, it becomes the containing
+ block for all the fixed positioned renderers in its descendant tree.
+ When the last transform related property is removed, the renderer is no longer a containing block
+ and we need to remove all these positioned renderers from the descendant tracker map (gPositionedDescendantsMap).
+ They will be inserted back into the tracker map during the next layout (either under the RenderView or
+ under the next transformed renderer in the ancestor chain).
+
+ * fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt: Added.
+ * fast/block/fixed-position-reparent-when-transition-is-removed.html: Added.
+
</ins><span class="cx"> 2016-06-11 Myles C. Maxfield <mmaxfield@apple.com>
</span><span class="cx">
</span><span class="cx"> [Cocoa] Map commonly used Chinese Windows font names to names present on Cocoa operating systems
</span></span></pre></div>
<a id="trunkLayoutTestsfastblockfixedpositionreparentwhentransitionisremovedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt (0 => 201984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt         (rev 0)
+++ trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed-expected.txt        2016-06-12 20:45:44 UTC (rev 201984)
</span><span class="lines">@@ -0,0 +1,2 @@
</span><ins>+PASS if no crash or assert.
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastblockfixedpositionreparentwhentransitionisremovedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed.html (0 => 201984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed.html         (rev 0)
+++ trunk/LayoutTests/fast/block/fixed-position-reparent-when-transition-is-removed.html        2016-06-12 20:45:44 UTC (rev 201984)
</span><span class="lines">@@ -0,0 +1,40 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests the case when fixed positioned elements has a new containing block.</title>
+<style>
+div {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+</head>
+<body>
+PASS if no crash or assert.
+<div id=container style="position: absolute; transform: rotate(10deg);">
+ <div id=fixedChild style="position: fixed;"></div>
+</div>
+<script>
+if (window.testRunner) {
+ testRunner.waitUntilDone();
+ testRunner.dumpAsText();
+}
+var container = document.getElementById("container");
+setTimeout(function() {
+ container.style.transform = "";
+ setTimeout(function() {
+ var removeThis = document.getElementById("fixedChild");
+ removeThis.parentNode.removeChild(removeThis);
+ setTimeout(function() {
+ var newChild = document.createElement("div");
+ newChild.style.positioned = "absolute";
+ container.appendChild(newChild);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }, 0);
+ }, 0);
+}, 0);
+</script>
+</body>
+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201983 => 201984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-06-12 13:22:53 UTC (rev 201983)
+++ trunk/Source/WebCore/ChangeLog        2016-06-12 20:45:44 UTC (rev 201984)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-06-12 Zalan Bujtas <zalan@apple.com>
+
+ Remove positioned descendants when RenderBlock is no longer a containing block.
+ https://bugs.webkit.org/show_bug.cgi?id=158655
+ <rdar://problem/26510032>
+
+ Reviewed by Simon Fraser.
+
+ Normally the RenderView is the containing block for fixed positioned renderers.
+ However when a renderer acquires some transform related properties, it becomes the containing
+ block for all the fixed positioned renderers in its descendant tree.
+ When the last transform related property is removed, the renderer is no longer a containing block
+ and we need to remove all these positioned renderers from the descendant tracker map (gPositionedDescendantsMap).
+ They will be inserted back into the tracker map during the next layout (either under the RenderView or
+ under the next transformed renderer in the ancestor chain).
+
+ Test: fast/block/fixed-position-reparent-when-transition-is-removed.html
+
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::removePositionedObjectsIfNeeded):
+
</ins><span class="cx"> 2016-06-11 Myles C. Maxfield <mmaxfield@apple.com>
</span><span class="cx">
</span><span class="cx"> Addressing post-review comments after r201978.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (201983 => 201984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.cpp        2016-06-12 13:22:53 UTC (rev 201983)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp        2016-06-12 20:45:44 UTC (rev 201984)
</span><span class="lines">@@ -244,14 +244,20 @@
</span><span class="cx"> if (oldStyle.position() == newStyle.position() && hadTransform == willHaveTransform)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- // We are no longer a containing block.
</del><ins>+ // We are no longer the containing block for fixed descendants.
+ if (hadTransform && !willHaveTransform) {
+ // Our positioned descendants will be inserted into a new containing block's positioned objects list during the next layout.
+ removePositionedObjects(nullptr, NewContainingBlock);
+ return;
+ }
+
+ // We are no longer the containing block for absolute positioned descendants.
</ins><span class="cx"> if (newStyle.position() == StaticPosition && !willHaveTransform) {
</span><del>- // Clear our positioned objects list. Our absolutely positioned descendants will be
- // inserted into our containing block's positioned objects list during layout.
</del><ins>+ // Our positioned descendants will be inserted into a new containing block's positioned objects list during the next layout.
</ins><span class="cx"> removePositionedObjects(nullptr, NewContainingBlock);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><del>-
</del><ins>+
</ins><span class="cx"> // We are a new containing block.
</span><span class="cx"> if (oldStyle.position() == StaticPosition && !hadTransform) {
</span><span class="cx"> // Remove our absolutely positioned descendants from their current containing block.
</span></span></pre>
</div>
</div>
</body>
</html>