<!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>[173830] releases/WebKitGTK/webkit-2.6</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/173830">173830</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2014-09-22 03:40:58 -0700 (Mon, 22 Sep 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/173806">r173806</a> - [CSS Regions] Assertion failure and null dereference crash when using animations and regions
https://bugs.webkit.org/show_bug.cgi?id=136918
Reviewed by Andrei Bucur.
Source/WebCore:
In some situations, for instance when an image has an attached animation, the style change caused by the animation
triggers a geometry update for the backing store associated with the image's layer. This may occur before
the layout for the image has finished.
Moreover, if the image in such situation - having a composited layer - is displayed in a region,
sicne the layout did not finish yet, the mappings between the layers of the elements collected in the named flow
and the regions associated with the named flow are not updated and cannot be used.
Therefore in those situations, we have to bail out early and use these mappings only after the layout has finished.
This patch also changes RenderLayerBacking method updateAfterDescendents -> updateAfterDescendants.
Test: fast/regions/animated-image-in-region.html
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::cachedRegionForCompositedLayer):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateAfterDescendants):
* rendering/RenderLayerBacking.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::rebuildCompositingLayerTree):
(WebCore::RenderLayerCompositor::updateLayerTreeGeometry):
(WebCore::RenderLayerCompositor::updateCompositingDescendantGeometry):
LayoutTests:
* fast/regions/animated-image-in-region-expected.txt: Added.
* fast/regions/animated-image-in-region.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCorerenderingRenderFlowThreadcpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderFlowThread.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayercpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerBackingcpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerBackingh">releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.h</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerCompositorcpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestsfastregionsanimatedimageinregionexpectedtxt">releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region-expected.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestsfastregionsanimatedimageinregionhtml">releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit26LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-09-22 Mihnea Ovidenie <mihnea@adobe.com>
+
+ [CSS Regions] Assertion failure and null dereference crash when using animations and regions
+ https://bugs.webkit.org/show_bug.cgi?id=136918
+
+ Reviewed by Andrei Bucur.
+
+ * fast/regions/animated-image-in-region-expected.txt: Added.
+ * fast/regions/animated-image-in-region.html: Added.
+
</ins><span class="cx"> 2014-09-17 Philippe Normand <pnormand@igalia.com>
</span><span class="cx">
</span><span class="cx"> [GStreamer] Cannot play Vimeo video
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestsfastregionsanimatedimageinregionexpectedtxt"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region-expected.txt (0 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region-expected.txt         (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region-expected.txt        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+Test that an animated image displayed in a region is correctly animated.
+
+On success, you should see an image of an iPad displayed inside a black border box and no crash.
+
+PASS
+
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestsfastregionsanimatedimageinregionhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region.html (0 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region.html         (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/fast/regions/animated-image-in-region.html        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <style>
+ .region {
+ -webkit-flow-from: flow;
+ width: 320px;
+ height: 320px;
+ border: 5px solid black;
+ }
+
+ #img {
+ -webkit-flow-into: flow;
+ width: 300px;
+ height: 300px;
+ }
+
+ .spin {
+ -webkit-animation-name: spin;
+ -webkit-animation-duration: 0.1s;
+ -webkit-animation-timing-function: linear;
+ }
+
+ @-webkit-keyframes spin {
+ from { -webkit-transform: rotateZ(0deg);}
+ to { -webkit-transform: rotateZ(360deg); }
+ }
+ </style>
+ </head>
+
+ <body>
+ <p>Test that an animated image displayed in a region is correctly animated.</p>
+ <p>On success, you should see an image of an iPad displayed inside a black border box and no crash.</p>
+ <p>PASS</p>
+ <div class="region"></div>
+ <img id="img" class="spin" src="resources/ipad.jpg" />
+ <script>
+ if (window.testRunner)
+ window.testRunner.dumpAsText();
+ </script>
+ </body>
+</html>
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2014-09-22 Mihnea Ovidenie <mihnea@adobe.com>
+
+ [CSS Regions] Assertion failure and null dereference crash when using animations and regions
+ https://bugs.webkit.org/show_bug.cgi?id=136918
+
+ Reviewed by Andrei Bucur.
+
+ In some situations, for instance when an image has an attached animation, the style change caused by the animation
+ triggers a geometry update for the backing store associated with the image's layer. This may occur before
+ the layout for the image has finished.
+
+ Moreover, if the image in such situation - having a composited layer - is displayed in a region,
+ sicne the layout did not finish yet, the mappings between the layers of the elements collected in the named flow
+ and the regions associated with the named flow are not updated and cannot be used.
+
+ Therefore in those situations, we have to bail out early and use these mappings only after the layout has finished.
+
+ This patch also changes RenderLayerBacking method updateAfterDescendents -> updateAfterDescendants.
+
+ Test: fast/regions/animated-image-in-region.html
+
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::cachedRegionForCompositedLayer):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::calculateClipRects):
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::updateAfterDescendants):
+ * rendering/RenderLayerBacking.h:
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::rebuildCompositingLayerTree):
+ (WebCore::RenderLayerCompositor::updateLayerTreeGeometry):
+ (WebCore::RenderLayerCompositor::updateCompositingDescendantGeometry):
+
</ins><span class="cx"> 2014-09-21 Christophe Dumez <cdumez@apple.com>
</span><span class="cx">
</span><span class="cx"> Fix post-mortem nits for r173724
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCorerenderingRenderFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderFlowThread.cpp (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderFlowThread.cpp        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderFlowThread.cpp        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -251,7 +251,12 @@
</span><span class="cx">
</span><span class="cx"> RenderNamedFlowFragment* RenderFlowThread::cachedRegionForCompositedLayer(RenderLayer& childLayer) const
</span><span class="cx"> {
</span><del>- ASSERT(m_layerToRegionMap);
</del><ins>+ if (!m_layerToRegionMap) {
+ ASSERT(needsLayout());
+ ASSERT(m_layersToRegionMappingsDirty);
+ return nullptr;
+ }
+
</ins><span class="cx"> RenderNamedFlowFragment* namedFlowFragment = m_layerToRegionMap->get(&childLayer);
</span><span class="cx"> ASSERT(!namedFlowFragment || m_regionList.contains(namedFlowFragment));
</span><span class="cx"> return namedFlowFragment;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayer.cpp (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayer.cpp        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayer.cpp        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -6539,7 +6539,7 @@
</span><span class="cx"> else if (isComposited()) {
</span><span class="cx"> // FIXME: updating geometry here is potentially harmful, because layout is not up-to-date.
</span><span class="cx"> backing()->updateGeometry();
</span><del>- backing()->updateAfterDescendents();
</del><ins>+ backing()->updateAfterDescendants();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (oldStyle) {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.cpp (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -954,7 +954,7 @@
</span><span class="cx"> compositor().updateScrollCoordinatedStatus(m_owningLayer);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void RenderLayerBacking::updateAfterDescendents()
</del><ins>+void RenderLayerBacking::updateAfterDescendants()
</ins><span class="cx"> {
</span><span class="cx"> bool isSimpleContainer = false;
</span><span class="cx"> if (!m_owningLayer.isRootLayer()) {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerBackingh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.h (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.h        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerBacking.h        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> void updateGeometry();
</span><span class="cx">
</span><span class="cx"> // Update state the requires that descendant layers have been updated.
</span><del>- void updateAfterDescendents();
</del><ins>+ void updateAfterDescendants();
</ins><span class="cx">
</span><span class="cx"> // Update contents and clipping structure.
</span><span class="cx"> void updateDrawsContent();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerCompositor.cpp (173829 => 173830)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-09-22 10:34:43 UTC (rev 173829)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-09-22 10:40:58 UTC (rev 173830)
</span><span class="lines">@@ -1538,7 +1538,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (RenderLayerBacking* layerBacking = layer.backing())
</span><del>- layerBacking->updateAfterDescendents();
</del><ins>+ layerBacking->updateAfterDescendants();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void RenderLayerCompositor::rebuildRegionCompositingLayerTree(RenderNamedFlowFragment* region, Vector<GraphicsLayer*>& childList, int depth)
</span><span class="lines">@@ -1775,7 +1775,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (RenderLayerBacking* layerBacking = layer.backing())
</span><del>- layerBacking->updateAfterDescendents();
</del><ins>+ layerBacking->updateAfterDescendants();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Recurs down the RenderLayer tree until its finds the compositing descendants of compositingAncestor and updates their geometry.
</span><span class="lines">@@ -1792,7 +1792,7 @@
</span><span class="cx">
</span><span class="cx"> layerBacking->updateGeometry();
</span><span class="cx"> if (compositedChildrenOnly) {
</span><del>- layerBacking->updateAfterDescendents();
</del><ins>+ layerBacking->updateAfterDescendants();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -1832,7 +1832,7 @@
</span><span class="cx">
</span><span class="cx"> if (&layer != &compositingAncestor) {
</span><span class="cx"> if (RenderLayerBacking* layerBacking = layer.backing())
</span><del>- layerBacking->updateAfterDescendents();
</del><ins>+ layerBacking->updateAfterDescendants();
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>