<!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>[164988] 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/164988">164988</a></dd>
<dt>Author</dt> <dd>abucur@adobe.com</dd>
<dt>Date</dt> <dd>2014-03-03 09:16:06 -0800 (Mon, 03 Mar 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[CSS Regions] Overset computation is incorrect in some cases
https://bugs.webkit.org/show_bug.cgi?id=129032
Reviewed by Mihnea Ovidenie.
Source/WebCore:
This patch reworks the way overset is computed for regions and named flows.
1. Regions overflow no longer trigger an overset changed event. This is because
the overflow of a box is contained within the region range of the box. The content
edge should be considered the logical bottom position of the content inside the
flow thread.
2. The regions events logic was moved from RenderFlowThread to RenderNamedFlowThread
and from RenderRegion to RenderNamedFlowFragment (including the regionOverset property).
3. The overset value of the named flow is no longer stored in the named flow. It is
extracted from the overset of the last region in the chain.
4. The regions overset is not computed every time the flow thread is laid out which
should improve performance for flows with many regions. With the patch, each region
computes the overset value during its layout when the flow thread is in the overflow
or the final layout phase.
5. The overset changed event is dispatched only at the end of the layout of the named flows,
after all the region overset changes have been considered. This means that the overset
event can't be dispatched in the middle of the auto-height processing algorithm that
requires multiple layout passes for the flow threads.
However, the region layout update event dispatch timing was not changed, it is dispatched
every time the flow thread has a layout. This preserves the current behavior of the event.
Tests: The old tests were modified to take into account the change.
* dom/Element.cpp:
(WebCore::Element::webkitRegionOverset):
* dom/WebKitNamedFlow.cpp:
(WebCore::WebKitNamedFlow::overset):
* inspector/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::buildArrayForRegions):
* rendering/FlowThreadController.cpp:
(WebCore::FlowThreadController::updateFlowThreadsIntoMeasureContentPhase):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::computeOverflow):
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::RenderFlowThread):
(WebCore::RenderFlowThread::layout):
* rendering/RenderFlowThread.h:
* rendering/RenderNamedFlowFragment.cpp:
(WebCore::RenderNamedFlowFragment::layoutBlock):
(WebCore::RenderNamedFlowFragment::setRegionOversetState):
(WebCore::RenderNamedFlowFragment::regionOversetState):
(WebCore::RenderNamedFlowFragment::updateOversetState):
* rendering/RenderNamedFlowFragment.h:
* rendering/RenderNamedFlowThread.cpp:
(WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
(WebCore::RenderNamedFlowThread::computeOverflow):
(WebCore::RenderNamedFlowThread::layout):
(WebCore::RenderNamedFlowThread::dispatchNamedFlowEvents):
(WebCore::RenderNamedFlowThread::dispatchRegionLayoutUpdateEventIfNeeded):
(WebCore::RenderNamedFlowThread::dispatchRegionOversetChangeEventIfNeeded):
* rendering/RenderNamedFlowThread.h:
There's a new field called m_flowContentBottom that tracks the content bottom of the flow thread
after layout. This value is used to compute the overset value of the regions because it's not
affected by relative positioning or visual overflow such as shadows.
* rendering/RenderRegion.cpp:
* rendering/RenderRegion.h:
LayoutTests:
Adjust the tests to cope with the overset changes.
* fast/regions/cssom/element-region-overset-state-expected.txt:
* fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt:
* fast/regions/cssom/element-region-overset-state-vertical-rl.html:
* fast/regions/cssom/element-region-overset-state.html:
This test has a new case that verifies region clamping is correctly taken into account.
* fast/regions/cssom/webkit-named-flow-overset-expected.txt:
* fast/regions/cssom/webkit-named-flow-overset.html:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomelementregionoversetstateexpectedtxt">trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomelementregionoversetstateverticalrlexpectedtxt">trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomelementregionoversetstateverticalrlhtml">trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomelementregionoversetstatehtml">trunk/LayoutTests/fast/regions/cssom/element-region-overset-state.html</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomwebkitnamedflowoversetexpectedtxt">trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionscssomwebkitnamedflowoversethtml">trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomElementcpp">trunk/Source/WebCore/dom/Element.cpp</a></li>
<li><a href="#trunkSourceWebCoredomWebKitNamedFlowcpp">trunk/Source/WebCore/dom/WebKitNamedFlow.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorCSSAgentcpp">trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingFlowThreadControllercpp">trunk/Source/WebCore/rendering/FlowThreadController.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockcpp">trunk/Source/WebCore/rendering/RenderBlock.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadcpp">trunk/Source/WebCore/rendering/RenderFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadh">trunk/Source/WebCore/rendering/RenderFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmenth">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadcpp">trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadh">trunk/Source/WebCore/rendering/RenderNamedFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderRegioncpp">trunk/Source/WebCore/rendering/RenderRegion.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderRegionh">trunk/Source/WebCore/rendering/RenderRegion.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/ChangeLog        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-03-03 Andrei Bucur <abucur@adobe.com>
+
+ [CSS Regions] Overset computation is incorrect in some cases
+ https://bugs.webkit.org/show_bug.cgi?id=129032
+
+ Reviewed by Mihnea Ovidenie.
+
+ Adjust the tests to cope with the overset changes.
+
+ * fast/regions/cssom/element-region-overset-state-expected.txt:
+ * fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt:
+ * fast/regions/cssom/element-region-overset-state-vertical-rl.html:
+ * fast/regions/cssom/element-region-overset-state.html:
+ This test has a new case that verifies region clamping is correctly taken into account.
+ * fast/regions/cssom/webkit-named-flow-overset-expected.txt:
+ * fast/regions/cssom/webkit-named-flow-overset.html:
+
</ins><span class="cx"> 2014-03-02 Timothy Hatcher <timothy@apple.com>
</span><span class="cx">
</span><span class="cx"> Remove ASSERT in ~IDBRequest since it is firing during legitimate uses in Web Inspector.
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomelementregionoversetstateexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-expected.txt (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-expected.txt        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-expected.txt        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -10,6 +10,10 @@
</span><span class="cx"> PASS regionOverset('region_1') is "fit"
</span><span class="cx"> PASS regionOverset('region_2') is "fit"
</span><span class="cx"> PASS regionOverset('region_3') is "empty"
</span><ins>+Generate layout overflow
+PASS regionOverset('region_1') is "fit"
+PASS regionOverset('region_2') is "fit"
+PASS regionOverset('region_3') is "empty"
</ins><span class="cx"> Add more content
</span><span class="cx"> PASS regionOverset('region_1') is "fit"
</span><span class="cx"> PASS regionOverset('region_2') is "fit"
</span><span class="lines">@@ -17,7 +21,7 @@
</span><span class="cx"> Add visual overflow
</span><span class="cx"> PASS regionOverset('region_1') is "fit"
</span><span class="cx"> PASS regionOverset('region_2') is "fit"
</span><del>-PASS regionOverset('region_3') is "overset"
</del><ins>+PASS regionOverset('region_3') is "fit"
</ins><span class="cx"> Empty content
</span><span class="cx"> PASS regionOverset('region_1') is "empty"
</span><span class="cx"> PASS regionOverset('region_2') is "empty"
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomelementregionoversetstateverticalrlexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl-expected.txt        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> Add visual overflow
</span><span class="cx"> PASS regionOverset('region_1') is "fit"
</span><span class="cx"> PASS regionOverset('region_2') is "fit"
</span><del>-PASS regionOverset('region_3') is "overset"
</del><ins>+PASS regionOverset('region_3') is "fit"
</ins><span class="cx"> Empty content
</span><span class="cx"> PASS regionOverset('region_1') is "empty"
</span><span class="cx"> PASS regionOverset('region_2') is "empty"
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomelementregionoversetstateverticalrlhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl.html (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl.html        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/element-region-overset-state-vertical-rl.html        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_1')", "fit");
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_2')", "fit");
</span><del>- shouldBeEqualToString("regionOverset('region_3')", "overset");
</del><ins>+ shouldBeEqualToString("regionOverset('region_3')", "fit");
</ins><span class="cx">
</span><span class="cx"> debug("Empty content");
</span><span class="cx"> flowContent("no_article");
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomelementregionoversetstatehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/element-region-overset-state.html (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/element-region-overset-state.html        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/element-region-overset-state.html        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -58,9 +58,20 @@
</span><span class="cx"> }
</span><span class="cx"> function addMoreContent() {
</span><span class="cx"> var c = document.getElementById("content");
</span><ins>+ c.style.marginTop = 0;
</ins><span class="cx"> c.style.height = 326;
</span><ins>+ var a = document.getElementById("article");
+ a.style.height = "auto";
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ function generateLayoutOverflow() {
+ var c = document.getElementById("content");
+ c.style.marginTop = 400;
+ c.style.height = 400;
+ var a = document.getElementById("article");
+ a.style.height = 150;
+ }
+
</ins><span class="cx"> function test() {
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_1')", "empty");
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_2')", "empty");
</span><span class="lines">@@ -73,6 +84,12 @@
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_2')", "fit");
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_3')", "empty");
</span><span class="cx">
</span><ins>+ debug("Generate layout overflow");
+ generateLayoutOverflow();
+ shouldBeEqualToString("regionOverset('region_1')", "fit");
+ shouldBeEqualToString("regionOverset('region_2')", "fit");
+ shouldBeEqualToString("regionOverset('region_3')", "empty");
+
</ins><span class="cx"> debug("Add more content");
</span><span class="cx"> addMoreContent();
</span><span class="cx">
</span><span class="lines">@@ -85,7 +102,7 @@
</span><span class="cx">
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_1')", "fit");
</span><span class="cx"> shouldBeEqualToString("regionOverset('region_2')", "fit");
</span><del>- shouldBeEqualToString("regionOverset('region_3')", "overset");
</del><ins>+ shouldBeEqualToString("regionOverset('region_3')", "fit");
</ins><span class="cx">
</span><span class="cx"> debug("Empty content");
</span><span class="cx"> flowContent("no_article");
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomwebkitnamedflowoversetexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset-expected.txt (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset-expected.txt        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset-expected.txt        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -7,10 +7,10 @@
</span><span class="cx"> PASS namedFlow.overset is false
</span><span class="cx"> PASS namedFlow.overset is true
</span><span class="cx"> PASS namedFlow.overset is false
</span><del>-PASS namedFlow.overset is true
</del><span class="cx"> PASS namedFlow.overset is false
</span><del>-PASS namedFlow.overset is true
</del><span class="cx"> PASS namedFlow.overset is false
</span><ins>+PASS namedFlow.overset is false
+PASS namedFlow.overset is false
</ins><span class="cx"> PASS namedFlow.overset is true
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx">
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionscssomwebkitnamedflowoversethtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset.html (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset.html        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/LayoutTests/fast/regions/cssom/webkit-named-flow-overset.html        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -59,8 +59,9 @@
</span><span class="cx"> // Add visual overset, overset should be true.
</span><span class="cx"> document.getElementById("article").style.webkitBoxShadow="0px 50px lime";
</span><span class="cx">
</span><del>- // Overset should be true since the content does not fit in regions
- shouldBe("namedFlow.overset", "true");
</del><ins>+ // Overset should be false even if the content shadow overflows the last region
+ // since the visual overflow does not influence the overset property.
+ shouldBe("namedFlow.overset", "false");
</ins><span class="cx">
</span><span class="cx"> // Add the third region, overset should be false.
</span><span class="cx"> var region3 = document.createElement("div");
</span><span class="lines">@@ -74,8 +75,9 @@
</span><span class="cx"> // Remove the first region from the flow, overset should be true.
</span><span class="cx"> region.className = "";
</span><span class="cx">
</span><del>- // Overset should be true since the content does not fit the regions
- shouldBe("namedFlow.overset", "true");
</del><ins>+ // Overset should be false even if the content shadow overflows the last region
+ // since the visual overflow does not influence the overset property.
+ shouldBe("namedFlow.overset", "false");
</ins><span class="cx">
</span><span class="cx"> // Remove the content from the flow, overset should be false.
</span><span class="cx"> document.getElementById("article").className = "";
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/ChangeLog        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -1,3 +1,72 @@
</span><ins>+2014-03-03 Andrei Bucur <abucur@adobe.com>
+
+ [CSS Regions] Overset computation is incorrect in some cases
+ https://bugs.webkit.org/show_bug.cgi?id=129032
+
+ Reviewed by Mihnea Ovidenie.
+
+ This patch reworks the way overset is computed for regions and named flows.
+
+ 1. Regions overflow no longer trigger an overset changed event. This is because
+ the overflow of a box is contained within the region range of the box. The content
+ edge should be considered the logical bottom position of the content inside the
+ flow thread.
+
+ 2. The regions events logic was moved from RenderFlowThread to RenderNamedFlowThread
+ and from RenderRegion to RenderNamedFlowFragment (including the regionOverset property).
+
+ 3. The overset value of the named flow is no longer stored in the named flow. It is
+ extracted from the overset of the last region in the chain.
+
+ 4. The regions overset is not computed every time the flow thread is laid out which
+ should improve performance for flows with many regions. With the patch, each region
+ computes the overset value during its layout when the flow thread is in the overflow
+ or the final layout phase.
+
+ 5. The overset changed event is dispatched only at the end of the layout of the named flows,
+ after all the region overset changes have been considered. This means that the overset
+ event can't be dispatched in the middle of the auto-height processing algorithm that
+ requires multiple layout passes for the flow threads.
+
+ However, the region layout update event dispatch timing was not changed, it is dispatched
+ every time the flow thread has a layout. This preserves the current behavior of the event.
+
+ Tests: The old tests were modified to take into account the change.
+
+ * dom/Element.cpp:
+ (WebCore::Element::webkitRegionOverset):
+ * dom/WebKitNamedFlow.cpp:
+ (WebCore::WebKitNamedFlow::overset):
+ * inspector/InspectorCSSAgent.cpp:
+ (WebCore::InspectorCSSAgent::buildArrayForRegions):
+ * rendering/FlowThreadController.cpp:
+ (WebCore::FlowThreadController::updateFlowThreadsIntoMeasureContentPhase):
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::computeOverflow):
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::RenderFlowThread):
+ (WebCore::RenderFlowThread::layout):
+ * rendering/RenderFlowThread.h:
+ * rendering/RenderNamedFlowFragment.cpp:
+ (WebCore::RenderNamedFlowFragment::layoutBlock):
+ (WebCore::RenderNamedFlowFragment::setRegionOversetState):
+ (WebCore::RenderNamedFlowFragment::regionOversetState):
+ (WebCore::RenderNamedFlowFragment::updateOversetState):
+ * rendering/RenderNamedFlowFragment.h:
+ * rendering/RenderNamedFlowThread.cpp:
+ (WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
+ (WebCore::RenderNamedFlowThread::computeOverflow):
+ (WebCore::RenderNamedFlowThread::layout):
+ (WebCore::RenderNamedFlowThread::dispatchNamedFlowEvents):
+ (WebCore::RenderNamedFlowThread::dispatchRegionLayoutUpdateEventIfNeeded):
+ (WebCore::RenderNamedFlowThread::dispatchRegionOversetChangeEventIfNeeded):
+ * rendering/RenderNamedFlowThread.h:
+ There's a new field called m_flowContentBottom that tracks the content bottom of the flow thread
+ after layout. This value is used to compute the overset value of the regions because it's not
+ affected by relative positioning or visual overflow such as shadows.
+ * rendering/RenderRegion.cpp:
+ * rendering/RenderRegion.h:
+
</ins><span class="cx"> 2014-03-03 Tomas Popela <tpopela@redhat.com>
</span><span class="cx">
</span><span class="cx"> [GTK] CodeGeneratorGObject.pm remove usage of undefined variable
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/dom/Element.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -2570,7 +2570,7 @@
</span><span class="cx"> if (!document().cssRegionsEnabled() || !renderNamedFlowFragment())
</span><span class="cx"> return undefinedState;
</span><span class="cx">
</span><del>- switch (renderNamedFlowFragment()->regionOversetState()) {
</del><ins>+ switch (regionOversetState()) {
</ins><span class="cx"> case RegionFit: {
</span><span class="cx"> DEFINE_STATIC_LOCAL(AtomicString, fitState, ("fit", AtomicString::ConstructFromLiteral));
</span><span class="cx"> return fitState;
</span></span></pre></div>
<a id="trunkSourceWebCoredomWebKitNamedFlowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/WebKitNamedFlow.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/WebKitNamedFlow.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/dom/WebKitNamedFlow.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -69,7 +69,11 @@
</span><span class="cx">
</span><span class="cx"> // The renderer may be destroyed or created after the style update.
</span><span class="cx"> // Because this is called from JS, where the wrapper keeps a reference to the NamedFlow, no guard is necessary.
</span><del>- return m_parentFlowThread ? m_parentFlowThread->overset() : true;
</del><ins>+ if (!m_parentFlowThread || !m_parentFlowThread->hasRegions())
+ return true;
+
+ const RenderNamedFlowFragment* namedFlowFragment = toRenderNamedFlowFragment(m_parentFlowThread->lastRegion());
+ return namedFlowFragment->regionOversetState() == RegionOverset;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static inline bool inFlowThread(RenderObject* renderer, RenderNamedFlowThread* flowThread)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorCSSAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -1196,7 +1196,7 @@
</span><span class="cx"> for (unsigned i = 0; i < regionList->length(); ++i) {
</span><span class="cx"> Inspector::TypeBuilder::CSS::Region::RegionOverset::Enum regionOverset;
</span><span class="cx">
</span><del>- switch (toElement(regionList->item(i))->renderNamedFlowFragment()->regionOversetState()) {
</del><ins>+ switch (toElement(regionList->item(i))->regionOversetState()) {
</ins><span class="cx"> case RegionFit:
</span><span class="cx"> regionOverset = Inspector::TypeBuilder::CSS::Region::RegionOverset::Fit;
</span><span class="cx"> break;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingFlowThreadControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/FlowThreadController.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/FlowThreadController.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/FlowThreadController.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -246,6 +246,7 @@
</span><span class="cx"> RenderNamedFlowThread* flowRenderer = *iter;
</span><span class="cx"> ASSERT(flowRenderer->inFinalLayoutPhase());
</span><span class="cx">
</span><ins>+ flowRenderer->dispatchNamedFlowEvents();
</ins><span class="cx"> flowRenderer->setLayoutPhase(RenderFlowThread::LayoutPhaseMeasureContent);
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -1590,9 +1590,6 @@
</span><span class="cx">
</span><span class="cx"> // Add visual overflow from theme.
</span><span class="cx"> addVisualOverflowFromTheme();
</span><del>-
- if (isRenderNamedFlowThread())
- toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void RenderBlock::clearLayoutOverflow()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -58,8 +58,6 @@
</span><span class="cx"> , m_regionsInvalidated(false)
</span><span class="cx"> , m_regionsHaveUniformLogicalWidth(true)
</span><span class="cx"> , m_regionsHaveUniformLogicalHeight(true)
</span><del>- , m_dispatchRegionLayoutUpdateEvent(false)
- , m_dispatchRegionOversetChangeEvent(false)
</del><span class="cx"> , m_pageLogicalSizeChanged(false)
</span><span class="cx"> , m_layoutPhase(LayoutPhaseMeasureContent)
</span><span class="cx"> , m_needsTwoPhasesLayout(false)
</span><span class="lines">@@ -236,12 +234,6 @@
</span><span class="cx"> if (updateAllLayerToRegionMappings())
</span><span class="cx"> layer()->compositor().setCompositingLayersNeedRebuild();
</span><span class="cx"> }
</span><del>-
- if (shouldDispatchRegionLayoutUpdateEvent())
- dispatchRegionLayoutUpdateEvent();
-
- if (shouldDispatchRegionOversetChangeEvent())
- dispatchRegionOversetChangeEvent();
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool RenderFlowThread::hasCompositingRegionDescendant() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.h        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -209,7 +209,6 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> virtual bool isRenderFlowThread() const override final { return true; }
</span><del>- virtual void layout() override final;
</del><span class="cx">
</span><span class="cx"> // Always create a RenderLayer for the RenderFlowThread so that we
</span><span class="cx"> // can easily avoid drawing the children directly.
</span><span class="lines">@@ -219,6 +218,7 @@
</span><span class="cx"> RenderFlowThread(Document&, PassRef<RenderStyle>);
</span><span class="cx">
</span><span class="cx"> virtual const char* renderName() const = 0;
</span><ins>+ virtual void layout() override;
</ins><span class="cx">
</span><span class="cx"> // Overridden by columns/pages to set up an initial logical width of the page width even when
</span><span class="cx"> // no regions have been generated yet.
</span><span class="lines">@@ -235,16 +235,6 @@
</span><span class="cx"> void updateLayerToRegionMappings(RenderLayer&, LayerToRegionMap&, RegionToLayerListMap&, bool& needsLayerUpdate);
</span><span class="cx"> void updateRegionForRenderLayer(RenderLayer*, LayerToRegionMap&, RegionToLayerListMap&, bool& needsLayerUpdate);
</span><span class="cx">
</span><del>- void setDispatchRegionLayoutUpdateEvent(bool value) { m_dispatchRegionLayoutUpdateEvent = value; }
- bool shouldDispatchRegionLayoutUpdateEvent() { return m_dispatchRegionLayoutUpdateEvent; }
-
- void setDispatchRegionOversetChangeEvent(bool value) { m_dispatchRegionOversetChangeEvent = value; }
- bool shouldDispatchRegionOversetChangeEvent() const { return m_dispatchRegionOversetChangeEvent; }
-
- // Override if the flow thread implementation supports dispatching events when the flow layout is updated (e.g. for named flows)
- virtual void dispatchRegionLayoutUpdateEvent() { m_dispatchRegionLayoutUpdateEvent = false; }
- virtual void dispatchRegionOversetChangeEvent() { m_dispatchRegionOversetChangeEvent = false; }
-
</del><span class="cx"> void initializeRegionsComputedAutoHeight(RenderRegion* = 0);
</span><span class="cx">
</span><span class="cx"> virtual void autoGenerateRegionsToBlockOffset(LayoutUnit) { };
</span><span class="lines">@@ -339,8 +329,6 @@
</span><span class="cx"> bool m_regionsInvalidated : 1;
</span><span class="cx"> bool m_regionsHaveUniformLogicalWidth : 1;
</span><span class="cx"> bool m_regionsHaveUniformLogicalHeight : 1;
</span><del>- bool m_dispatchRegionLayoutUpdateEvent : 1;
- bool m_dispatchRegionOversetChangeEvent : 1;
</del><span class="cx"> bool m_pageLogicalSizeChanged : 1;
</span><span class="cx"> unsigned m_layoutPhase : 2;
</span><span class="cx"> bool m_needsTwoPhasesLayout : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -257,8 +257,10 @@
</span><span class="cx"> if (!isHorizontalWritingMode())
</span><span class="cx"> oldRegionRect = oldRegionRect.transposedRect();
</span><span class="cx">
</span><del>- if (m_flowThread->inOverflowLayoutPhase() || m_flowThread->inFinalLayoutPhase())
</del><ins>+ if (m_flowThread->inOverflowLayoutPhase() || m_flowThread->inFinalLayoutPhase()) {
</ins><span class="cx"> computeOverflowFromFlowThread();
</span><ins>+ updateOversetState();
+ }
</ins><span class="cx">
</span><span class="cx"> if (hasAutoLogicalHeight() && m_flowThread->inMeasureContentLayoutPhase()) {
</span><span class="cx"> m_flowThread->invalidateRegions();
</span><span class="lines">@@ -272,6 +274,55 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void RenderNamedFlowFragment::setRegionOversetState(RegionOversetState state)
+{
+ ASSERT(generatingElement());
+
+ generatingElement()->setRegionOversetState(state);
+}
+
+RegionOversetState RenderNamedFlowFragment::regionOversetState() const
+{
+ ASSERT(generatingElement());
+
+ if (!isValid())
+ return RegionUndefined;
+
+ return generatingElement()->regionOversetState();
+}
+
+void RenderNamedFlowFragment::updateOversetState()
+{
+ ASSERT(isValid());
+
+ RenderNamedFlowThread* flowThread = namedFlowThread();
+ ASSERT(flowThread && (flowThread->inOverflowLayoutPhase() || flowThread->inFinalLayoutPhase()));
+
+ LayoutUnit flowContentBottom = flowThread->flowContentBottom();
+ bool isHorizontalWritingMode = flowThread->isHorizontalWritingMode();
+
+ LayoutUnit flowMin = flowContentBottom - (isHorizontalWritingMode ? flowThreadPortionRect().y() : flowThreadPortionRect().x());
+ LayoutUnit flowMax = flowContentBottom - (isHorizontalWritingMode ? flowThreadPortionRect().maxY() : flowThreadPortionRect().maxX());
+
+ RegionOversetState previousState = regionOversetState();
+ RegionOversetState state = RegionFit;
+ if (flowMin <= 0)
+ state = RegionEmpty;
+ if (flowMax > 0 && isLastRegion())
+ state = RegionOverset;
+
+ setRegionOversetState(state);
+
+ // Determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
+ if (previousState != state
+ || state == RegionFit
+ || state == RegionOverset)
+ flowThread->setDispatchRegionLayoutUpdateEvent(true);
+
+ if (previousState != state)
+ flowThread->setDispatchRegionOversetChangeEvent(true);
+}
+
</ins><span class="cx"> void RenderNamedFlowFragment::checkRegionStyle()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_flowThread);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -104,6 +104,8 @@
</span><span class="cx">
</span><span class="cx"> bool hasComputedAutoHeight() const { return m_hasComputedAutoHeight; }
</span><span class="cx">
</span><ins>+ RegionOversetState regionOversetState() const;
+
</ins><span class="cx"> virtual void attachRegion() override;
</span><span class="cx"> virtual void detachRegion() override;
</span><span class="cx">
</span><span class="lines">@@ -127,6 +129,9 @@
</span><span class="cx">
</span><span class="cx"> bool shouldHaveAutoLogicalHeight() const;
</span><span class="cx">
</span><ins>+ void updateOversetState();
+ void setRegionOversetState(RegionOversetState);
+
</ins><span class="cx"> virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override;
</span><span class="cx">
</span><span class="cx"> struct ObjectRegionStyleInfo {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -47,8 +47,9 @@
</span><span class="cx">
</span><span class="cx"> RenderNamedFlowThread::RenderNamedFlowThread(Document& document, PassRef<RenderStyle> style, PassRef<WebKitNamedFlow> namedFlow)
</span><span class="cx"> : RenderFlowThread(document, std::move(style))
</span><del>- , m_overset(true)
</del><span class="cx"> , m_hasRegionsWithStyling(false)
</span><ins>+ , m_dispatchRegionLayoutUpdateEvent(false)
+ , m_dispatchRegionOversetChangeEvent(false)
</ins><span class="cx"> , m_namedFlow(std::move(namedFlow))
</span><span class="cx"> , m_regionLayoutUpdateEventTimer(this, &RenderNamedFlowThread::regionLayoutUpdateEventTimerFired)
</span><span class="cx"> , m_regionOversetChangeEventTimer(this, &RenderNamedFlowThread::regionOversetChangeEventTimerFired)
</span><span class="lines">@@ -354,53 +355,33 @@
</span><span class="cx"> return visualOverflowRect;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void RenderNamedFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)
</del><ins>+void RenderNamedFlowThread::computeOverflow(LayoutUnit oldClientAfterEdge, bool recomputeFloats)
</ins><span class="cx"> {
</span><del>- LayoutUnit height = oldClientAfterEdge;
</del><ins>+ RenderFlowThread::computeOverflow(oldClientAfterEdge, recomputeFloats);
</ins><span class="cx">
</span><del>- // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
- // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
- // because of how computeLogicalHeight is implemented for RenderNamedFlowThread (as a sum of all regions height).
- // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
- if (hasRenderOverflow()
- && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())
- || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))
- height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
</del><ins>+ m_flowContentBottom = oldClientAfterEdge;
+}
</ins><span class="cx">
</span><del>- RenderNamedFlowFragment* lastFragment = toRenderNamedFlowFragment(lastRegion());
- for (auto& namedFlowFragment : m_regionList) {
- LayoutUnit flowMin = height - (isHorizontalWritingMode() ? namedFlowFragment->flowThreadPortionRect().y() : namedFlowFragment->flowThreadPortionRect().x());
- LayoutUnit flowMax = height - (isHorizontalWritingMode() ? namedFlowFragment->flowThreadPortionRect().maxY() : namedFlowFragment->flowThreadPortionRect().maxX());
- RegionOversetState previousState = namedFlowFragment->regionOversetState();
- RegionOversetState state = RegionFit;
- if (flowMin <= 0)
- state = RegionEmpty;
- if (flowMax > 0 && namedFlowFragment == lastFragment)
- state = RegionOverset;
- namedFlowFragment->setRegionOversetState(state);
- // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
- // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually
- // changed, so it just assumes that the NamedFlow should dispatch the event
- if (previousState != state
- || state == RegionFit
- || state == RegionOverset)
- setDispatchRegionLayoutUpdateEvent(true);
-
- if (previousState != state)
- setDispatchRegionOversetChangeEvent(true);
- }
-
</del><ins>+void RenderNamedFlowThread::layout()
+{
+ RenderFlowThread::layout();
+
</ins><span class="cx"> // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.
</span><span class="cx"> if (previousRegionCountChanged()) {
</span><span class="cx"> setDispatchRegionOversetChangeEvent(true);
</span><span class="cx"> updatePreviousRegionCount();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- // With the regions overflow state computed we can also set the overset flag for the named flow.
- // If there are no valid regions in the chain, overset is true.
- m_overset = lastFragment ? lastFragment->regionOversetState() == RegionOverset : true;
</del><ins>+ dispatchRegionLayoutUpdateEventIfNeeded();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void RenderNamedFlowThread::dispatchNamedFlowEvents()
+{
+ ASSERT(inFinalLayoutPhase());
+
+ dispatchRegionOversetChangeEventIfNeeded();
+}
+
</ins><span class="cx"> void RenderNamedFlowThread::checkInvalidRegions()
</span><span class="cx"> {
</span><span class="cx"> Vector<RenderNamedFlowFragment*> newValidFragments;
</span><span class="lines">@@ -529,18 +510,24 @@
</span><span class="cx"> return toElement(originalParent)->renderer()->isChildAllowed(child, style);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void RenderNamedFlowThread::dispatchRegionLayoutUpdateEvent()
</del><ins>+void RenderNamedFlowThread::dispatchRegionLayoutUpdateEventIfNeeded()
</ins><span class="cx"> {
</span><del>- RenderFlowThread::dispatchRegionLayoutUpdateEvent();
</del><ins>+ if (!m_dispatchRegionLayoutUpdateEvent)
+ return;
+
+ m_dispatchRegionLayoutUpdateEvent = false;
</ins><span class="cx"> InspectorInstrumentation::didUpdateRegionLayout(&document(), &namedFlow());
</span><span class="cx">
</span><span class="cx"> if (!m_regionLayoutUpdateEventTimer.isActive() && namedFlow().hasEventListeners())
</span><span class="cx"> m_regionLayoutUpdateEventTimer.startOneShot(0);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void RenderNamedFlowThread::dispatchRegionOversetChangeEvent()
</del><ins>+void RenderNamedFlowThread::dispatchRegionOversetChangeEventIfNeeded()
</ins><span class="cx"> {
</span><del>- RenderFlowThread::dispatchRegionOversetChangeEvent();
</del><ins>+ if (!m_dispatchRegionOversetChangeEvent)
+ return;
+
+ m_dispatchRegionOversetChangeEvent = false;
</ins><span class="cx"> InspectorInstrumentation::didChangeRegionOverset(&document(), &namedFlow());
</span><span class="cx">
</span><span class="cx"> if (!m_regionOversetChangeEventTimer.isActive() && namedFlow().hasEventListeners())
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.h (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -70,9 +70,6 @@
</span><span class="cx">
</span><span class="cx"> LayoutRect decorationsClipRectForBoxInNamedFlowFragment(const RenderBox&, RenderNamedFlowFragment&) const;
</span><span class="cx">
</span><del>- bool overset() const { return m_overset; }
- void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);
-
</del><span class="cx"> void registerNamedFlowContentElement(Element&);
</span><span class="cx"> void unregisterNamedFlowContentElement(Element&);
</span><span class="cx"> const NamedFlowContentElements& contentElements() const { return m_contentElements; }
</span><span class="lines">@@ -91,6 +88,12 @@
</span><span class="cx">
</span><span class="cx"> virtual void removeFlowChildInfo(RenderObject*) override final;
</span><span class="cx">
</span><ins>+ LayoutUnit flowContentBottom() const { return m_flowContentBottom; }
+ void dispatchNamedFlowEvents();
+
+ void setDispatchRegionLayoutUpdateEvent(bool value) { m_dispatchRegionLayoutUpdateEvent = value; }
+ void setDispatchRegionOversetChangeEvent(bool value) { m_dispatchRegionOversetChangeEvent = value; }
+
</ins><span class="cx"> protected:
</span><span class="cx"> void setMarkForDestruction();
</span><span class="cx"> void resetMarkForDestruction();
</span><span class="lines">@@ -99,9 +102,11 @@
</span><span class="cx"> virtual const char* renderName() const override;
</span><span class="cx"> virtual bool isRenderNamedFlowThread() const override { return true; }
</span><span class="cx"> virtual bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;
</span><ins>+ virtual void computeOverflow(LayoutUnit, bool = false) override;
+ virtual void layout() override final;
</ins><span class="cx">
</span><del>- virtual void dispatchRegionLayoutUpdateEvent() override;
- virtual void dispatchRegionOversetChangeEvent() override;
</del><ins>+ void dispatchRegionLayoutUpdateEventIfNeeded();
+ void dispatchRegionOversetChangeEventIfNeeded();
</ins><span class="cx">
</span><span class="cx"> bool dependsOn(RenderNamedFlowThread* otherRenderFlowThread) const;
</span><span class="cx"> void addDependencyOnFlowThread(RenderNamedFlowThread*);
</span><span class="lines">@@ -137,14 +142,17 @@
</span><span class="cx">
</span><span class="cx"> RenderRegionList m_invalidRegionList;
</span><span class="cx">
</span><del>- bool m_overset : 1;
</del><span class="cx"> bool m_hasRegionsWithStyling : 1;
</span><ins>+ bool m_dispatchRegionLayoutUpdateEvent : 1;
+ bool m_dispatchRegionOversetChangeEvent : 1;
</ins><span class="cx">
</span><span class="cx"> // The DOM Object that represents a named flow.
</span><span class="cx"> Ref<WebKitNamedFlow> m_namedFlow;
</span><span class="cx">
</span><span class="cx"> Timer<RenderNamedFlowThread> m_regionLayoutUpdateEventTimer;
</span><span class="cx"> Timer<RenderNamedFlowThread> m_regionOversetChangeEventTimer;
</span><ins>+
+ LayoutUnit m_flowContentBottom;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> RENDER_OBJECT_TYPE_CASTS(RenderNamedFlowThread, isRenderNamedFlowThread())
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderRegioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderRegion.cpp (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -181,23 +181,6 @@
</span><span class="cx"> return clipRect;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RegionOversetState RenderRegion::regionOversetState() const
-{
- ASSERT(generatingElement());
-
- if (!isValid())
- return RegionUndefined;
-
- return generatingElement()->regionOversetState();
-}
-
-void RenderRegion::setRegionOversetState(RegionOversetState state)
-{
- ASSERT(generatingElement());
-
- generatingElement()->setRegionOversetState(state);
-}
-
</del><span class="cx"> LayoutUnit RenderRegion::pageLogicalTopForOffset(LayoutUnit /* offset */) const
</span><span class="cx"> {
</span><span class="cx"> return flowThread()->isHorizontalWritingMode() ? flowThreadPortionRect().y() : flowThreadPortionRect().x();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderRegionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderRegion.h (164987 => 164988)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderRegion.h        2014-03-03 17:06:45 UTC (rev 164987)
+++ trunk/Source/WebCore/rendering/RenderRegion.h        2014-03-03 17:16:06 UTC (rev 164988)
</span><span class="lines">@@ -79,9 +79,6 @@
</span><span class="cx"> bool isLastRegion() const;
</span><span class="cx"> bool shouldClipFlowThreadContent() const;
</span><span class="cx">
</span><del>- RegionOversetState regionOversetState() const;
- void setRegionOversetState(RegionOversetState);
-
</del><span class="cx"> // These methods represent the width and height of a "page" and for a RenderRegion they are just the
</span><span class="cx"> // content width and content height of a region. For RenderRegionSets, however, they will be the width and
</span><span class="cx"> // height of a single column or page in the set.
</span></span></pre>
</div>
</div>
</body>
</html>