<!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>[204789] releases/WebKitGTK/webkit-2.12</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/204789">204789</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-08-23 02:51:15 -0700 (Tue, 23 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/201889">r201889</a> - Changing canvas height immediately after page load does not relayout canvas
https://bugs.webkit.org/show_bug.cgi?id=156097

Patch by Antoine Quint &lt;graouts@apple.com&gt; on 2016-06-09
Reviewed by Zalan Bujtas.

Source/WebCore:

Promote the logic use to identify whether we should perform a layout after a change of
intrinsic size from RenderImage to RenderReplaced such that RenderCanvas may use it
in canvasSizeChanged() and correctly update its layout in the case where the width
or height attribute is updated and there are no explicit sizing performed with CSS.
Additionally, this will also account for the object-fix property to only perform
a layout if necessary.

Test: fast/canvas/canvas-css-size-after-height-change-with-display-flex.html

* rendering/RenderHTMLCanvas.cpp:
(WebCore::RenderHTMLCanvas::canvasSizeChanged):
* rendering/RenderImage.cpp:
(WebCore::RenderImage::repaintOrMarkForLayout):
* rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::setNeedsLayoutIfNeededAfterIntrinsicSizeChange):
* rendering/RenderReplaced.h:

LayoutTests:

* fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html: Added.
* fast/canvas/canvas-css-size-after-height-change-with-display-flex.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderHTMLCanvascpp">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderHTMLCanvas.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderImagecpp">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderImage.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderReplacedcpp">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderReplacedh">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsfastcanvascanvascsssizeafterheightchangewithdisplayflexexpectedhtml">releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsfastcanvascanvascsssizeafterheightchangewithdisplayflexhtml">releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit212LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-06-09  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        Changing canvas height immediately after page load does not relayout canvas
+        https://bugs.webkit.org/show_bug.cgi?id=156097
+
+        Reviewed by Zalan Bujtas.
+
+        * fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html: Added.
+        * fast/canvas/canvas-css-size-after-height-change-with-display-flex.html: Added.
+
</ins><span class="cx"> 2016-06-06  Jiewen Tan  &lt;jiewen_tan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         URLs containing tabs or newlines are parsed incorrectly
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212LayoutTestsfastcanvascanvascsssizeafterheightchangewithdisplayflexexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html (0 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex-expected.html        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+&lt;div style=&quot;height: 500px; background-color: blue;&quot;&gt;&lt;/div&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit212LayoutTestsfastcanvascanvascsssizeafterheightchangewithdisplayflexhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex.html (0 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/fast/canvas/canvas-css-size-after-height-change-with-display-flex.html        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+&lt;div style=&quot;display: flex; flex-direction: column;&quot;&gt;
+    &lt;canvas style=&quot;background-color: blue;&quot;&gt;
+        &lt;script&gt;
+            if (window.testRunner)
+                testRunner.waitUntilDone();
+
+            window.requestAnimationFrame(function() {
+                document.querySelector(&quot;canvas&quot;).height = &quot;500&quot;;
+                if (window.testRunner)
+                    testRunner.notifyDone();
+            });
+        &lt;/script&gt;
+    &lt;/canvas&gt;
+&lt;/div&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2016-06-09  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        Changing canvas height immediately after page load does not relayout canvas
+        https://bugs.webkit.org/show_bug.cgi?id=156097
+
+        Reviewed by Zalan Bujtas.
+
+        Promote the logic use to identify whether we should perform a layout after a change of
+        intrinsic size from RenderImage to RenderReplaced such that RenderCanvas may use it
+        in canvasSizeChanged() and correctly update its layout in the case where the width
+        or height attribute is updated and there are no explicit sizing performed with CSS.
+        Additionally, this will also account for the object-fix property to only perform
+        a layout if necessary.
+
+        Test: fast/canvas/canvas-css-size-after-height-change-with-display-flex.html
+
+        * rendering/RenderHTMLCanvas.cpp:
+        (WebCore::RenderHTMLCanvas::canvasSizeChanged):
+        * rendering/RenderImage.cpp:
+        (WebCore::RenderImage::repaintOrMarkForLayout):
+        * rendering/RenderReplaced.cpp:
+        (WebCore::RenderReplaced::setNeedsLayoutIfNeededAfterIntrinsicSizeChange):
+        * rendering/RenderReplaced.h:
+
</ins><span class="cx"> 2016-06-06  Jiewen Tan  &lt;jiewen_tan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         URLs containing tabs or newlines are parsed incorrectly
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderHTMLCanvascpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderHTMLCanvas.cpp (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderHTMLCanvas.cpp        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderHTMLCanvas.cpp        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -101,18 +101,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!parent())
</span><span class="cx">         return;
</span><del>-
-    if (!preferredLogicalWidthsDirty())
-        setPreferredLogicalWidthsDirty(true);
-
-    LayoutSize oldSize = size();
-    updateLogicalWidth();
-    updateLogicalHeight();
-    if (oldSize == size())
-        return;
-
-    if (!selfNeedsLayout())
-        setNeedsLayout();
</del><ins>+    setNeedsLayoutIfNeededAfterIntrinsicSizeChange();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderImagecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderImage.cpp (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderImage.cpp        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderImage.cpp        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -294,30 +294,9 @@
</span><span class="cx"> 
</span><span class="cx">     bool imageSourceHasChangedSize = oldIntrinsicSize != newIntrinsicSize || imageSizeChange != ImageSizeChangeNone;
</span><span class="cx"> 
</span><del>-    if (imageSourceHasChangedSize) {
-        setPreferredLogicalWidthsDirty(true);
</del><ins>+    if (imageSourceHasChangedSize &amp;&amp; setNeedsLayoutIfNeededAfterIntrinsicSizeChange())
+        return;
</ins><span class="cx"> 
</span><del>-        // If the actual area occupied by the image has changed and it is not constrained by style then a layout is required.
-        bool imageSizeIsConstrained = style().logicalWidth().isSpecified() &amp;&amp; style().logicalHeight().isSpecified();
-
-        // FIXME: We only need to recompute the containing block's preferred size
-        // if the containing block's size depends on the image's size (i.e., the container uses shrink-to-fit sizing).
-        // There's no easy way to detect that shrink-to-fit is needed, always force a layout.
-        bool containingBlockNeedsToRecomputePreferredSize =
-            style().logicalWidth().isPercentOrCalculated()
-            || style().logicalMaxWidth().isPercentOrCalculated()
-            || style().logicalMinWidth().isPercentOrCalculated();
-
-        bool layoutSizeDependsOnIntrinsicSize = style().aspectRatioType() == AspectRatioFromIntrinsic;
-
-        if (!imageSizeIsConstrained || containingBlockNeedsToRecomputePreferredSize || layoutSizeDependsOnIntrinsicSize) {
-            // FIXME: It's not clear that triggering a layout guarantees a repaint in all cases.
-            // But many callers do depend on this code causing a layout.
-            setNeedsLayout();
-            return;
-        }
-    }
-
</del><span class="cx">     if (everHadLayout() &amp;&amp; !selfNeedsLayout()) {
</span><span class="cx">         // The inner content rectangle is calculated during layout, but may need an update now
</span><span class="cx">         // (unless the box has already been scheduled for layout). In order to calculate it, we
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderReplacedcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.cpp (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.cpp        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.cpp        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -287,6 +287,31 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool RenderReplaced::setNeedsLayoutIfNeededAfterIntrinsicSizeChange()
+{
+    setPreferredLogicalWidthsDirty(true);
+    
+    // If the actual area occupied by the image has changed and it is not constrained by style then a layout is required.
+    bool imageSizeIsConstrained = style().logicalWidth().isSpecified() &amp;&amp; style().logicalHeight().isSpecified();
+    
+    // FIXME: We only need to recompute the containing block's preferred size
+    // if the containing block's size depends on the image's size (i.e., the container uses shrink-to-fit sizing).
+    // There's no easy way to detect that shrink-to-fit is needed, always force a layout.
+    bool containingBlockNeedsToRecomputePreferredSize =
+        style().logicalWidth().isPercentOrCalculated()
+        || style().logicalMaxWidth().isPercentOrCalculated()
+        || style().logicalMinWidth().isPercentOrCalculated();
+    
+    bool layoutSizeDependsOnIntrinsicSize = style().aspectRatioType() == AspectRatioFromIntrinsic;
+    
+    if (!imageSizeIsConstrained || containingBlockNeedsToRecomputePreferredSize || layoutSizeDependsOnIntrinsicSize) {
+        setNeedsLayout();
+        return true;
+    }
+
+    return false;
+}
+    
</ins><span class="cx"> void RenderReplaced::computeAspectRatioInformationForRenderBox(RenderBox* contentRenderer, FloatSize&amp; constrainedSize, double&amp; intrinsicRatio) const
</span><span class="cx"> {
</span><span class="cx">     FloatSize intrinsicSize;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderReplacedh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.h (204788 => 204789)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.h        2016-08-23 09:41:17 UTC (rev 204788)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderReplaced.h        2016-08-23 09:51:15 UTC (rev 204789)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasReplacedLogicalWidth() const;
</span><span class="cx">     bool hasReplacedLogicalHeight() const;
</span><ins>+    bool setNeedsLayoutIfNeededAfterIntrinsicSizeChange();
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     RenderReplaced(Element&amp;, Ref&lt;RenderStyle&gt;&amp;&amp;);
</span></span></pre>
</div>
</div>

</body>
</html>