No subject


Fri Mar 7 15:32:22 PST 2014


3971">r153971</a> by &lt;jchaffraix at chromium.org&gt;

This patches reuse the OrderIterator's Vector. It provides a helper class=
 OrderIteratorPopulator, used for
manipulating the Vector directly. Which allows to consolidate the code in=
to a single implementation across
flexbox and grid.

No new tests, already covered by current tests.

* rendering/OrderIterator.cpp:
(WebCore::OrderIteratorPopulator::~OrderIteratorPopulator): Reset OrderIt=
erator and call
removeDuplicatedOrderValues().
(WebCore::OrderIteratorPopulator::removeDuplicatedOrderValues): Sorts the=
 Vector and removes the duplicated
order values.
(WebCore::OrderIteratorPopulator::collectChild): Collect order value info=
rmation from child.
(WebCore::OrderIterator::setOrderValues): Deleted.
* rendering/OrderIterator.h:
(WebCore::OrderIteratorPopulator::OrderIteratorPopulator): Add helper cla=
ss to manipulate OrderValues Vector.
* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::layoutBlock): Remove unneeded code related t=
o old OrderValues vector.
(WebCore::RenderFlexibleBox::prepareOrderIteratorAndMargins): Populate Or=
derIterator using collectChild().
(WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): Deleted.
* rendering/RenderFlexibleBox.h: Rename computeMainAxisPreferredSizes() t=
o prepareOrderIteratorAndMargins().
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Populate Ord=
erIterator using collectChild().</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href=3D"#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeL=
og</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingOrderIteratorcpp">trunk/Source=
/WebCore/rendering/OrderIterator.cpp</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingOrderIteratorh">trunk/Source/W=
ebCore/rendering/OrderIterator.h</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderFlexibleBoxcpp">trunk/So=
urce/WebCore/rendering/RenderFlexibleBox.cpp</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderFlexibleBoxh">trunk/Sour=
ce/WebCore/rendering/RenderFlexibleBox.h</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderGridcpp">trunk/Source/We=
bCore/rendering/RenderGrid.cpp</a></li>
</ul>

</div>
<div id=3D"patch">
<h3>Diff</h3>
<a id=3D"trunkSourceWebCoreChangeLog"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (1693=
71 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/ChangeLog	2014-05-27 07:05:=
44 UTC (rev 169371)
+++ trunk/Source/WebCore/ChangeLog	2014-05-27 07:17:52 UTC (rev 169372)
</span><span class=3D"lines">@@ -1,3 +1,35 @@
</span><ins>+2014-05-27  Manuel Rego Casasnovas  &lt;rego at igalia.com&gt;
+
+        Setting up OrderIterator shouldn't require an extra Vector
+        https://bugs.webkit.org/show_bug.cgi?id=3D119061
+
+        Reviewed by Darin Adler.
+
+        From Blink r153971 by &lt;jchaffraix at chromium.org&gt;
+
+        This patches reuse the OrderIterator's Vector. It provides a hel=
per class OrderIteratorPopulator, used for
+        manipulating the Vector directly. Which allows to consolidate th=
e code into a single implementation across
+        flexbox and grid.
+
+        No new tests, already covered by current tests.
+
+        * rendering/OrderIterator.cpp:
+        (WebCore::OrderIteratorPopulator::~OrderIteratorPopulator): Rese=
t OrderIterator and call
+        removeDuplicatedOrderValues().
+        (WebCore::OrderIteratorPopulator::removeDuplicatedOrderValues): =
Sorts the Vector and removes the duplicated
+        order values.
+        (WebCore::OrderIteratorPopulator::collectChild): Collect order v=
alue information from child.
+        (WebCore::OrderIterator::setOrderValues): Deleted.
+        * rendering/OrderIterator.h:
+        (WebCore::OrderIteratorPopulator::OrderIteratorPopulator): Add h=
elper class to manipulate OrderValues Vector.
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::layoutBlock): Remove unneeded code =
related to old OrderValues vector.
+        (WebCore::RenderFlexibleBox::prepareOrderIteratorAndMargins): Po=
pulate OrderIterator using collectChild().
+        (WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): Del=
eted.
+        * rendering/RenderFlexibleBox.h: Rename computeMainAxisPreferred=
Sizes() to prepareOrderIteratorAndMargins().
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Pop=
ulate OrderIterator using collectChild().
+
</ins><span class=3D"cx"> 2014-05-26  Tim Horton  &lt;timothy_horton at appl=
e.com&gt;
</span><span class=3D"cx">=20
</span><span class=3D"cx">         [wk2] RemoteLayerBackingStore front bu=
ffers should be purgeable when unparented
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingOrderIteratorcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Order=
Iterator.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/OrderIterator.cpp=
	2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/OrderIterator.cpp	2014-05-27 07:17:52 =
UTC (rev 169372)
</span><span class=3D"lines">@@ -32,8 +32,7 @@
</span><span class=3D"cx"> #include &quot;config.h&quot;
</span><span class=3D"cx"> #include &quot;OrderIterator.h&quot;
</span><span class=3D"cx">=20
</span><del>-#include &quot;RenderFlexibleBox.h&quot;
-#include &quot;RenderGrid.h&quot;
</del><ins>+#include &quot;RenderBox.h&quot;
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> namespace WebCore {
</span><span class=3D"cx">=20
</span><span class=3D"lines">@@ -45,18 +44,6 @@
</span><span class=3D"cx">     reset();
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><del>-void OrderIterator::setOrderValues(OrderValues&amp;&amp; ord=
erValues)
-{
-    reset();
-    m_orderValues =3D std::move(orderValues);
-    if (m_orderValues.size() &lt; 2)
-        return;
-
-    std::sort(m_orderValues.begin(), m_orderValues.end());
-    auto nextElement =3D std::unique(m_orderValues.begin(), m_orderValue=
s.end());
-    m_orderValues.shrinkCapacity(nextElement - m_orderValues.begin());
-}
-
</del><span class=3D"cx"> RenderBox* OrderIterator::first()
</span><span class=3D"cx"> {
</span><span class=3D"cx">     reset();
</span><span class=3D"lines">@@ -94,4 +81,35 @@
</span><span class=3D"cx">     m_orderIndex =3D cInvalidIndex;
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><ins>+OrderIteratorPopulator::OrderIteratorPopulator(OrderIterator=
&amp; iterator)
+    : m_iterator(iterator)
+{
+    // Note that we don't release the memory here, we only invalidate th=
e size
+    // This avoids unneeded reallocation if the size ends up not changin=
g.
+    m_iterator.m_orderValues.shrink(0);
+}
+
+OrderIteratorPopulator::~OrderIteratorPopulator()
+{
+    m_iterator.reset();
+
+    if (m_iterator.m_orderValues.size() &gt; 1)
+        removeDuplicatedOrderValues();
+}
+
+void OrderIteratorPopulator::removeDuplicatedOrderValues()
+{
+    auto&amp; orderValues =3D m_iterator.m_orderValues;
+
+    std::sort(orderValues.begin(), orderValues.end());
+    auto nextElement =3D std::unique(orderValues.begin(), orderValues.en=
d());
+    orderValues.shrinkCapacity(nextElement - orderValues.begin());
+}
+
+void OrderIteratorPopulator::collectChild(const RenderBox&amp; child)
+{
+    m_iterator.m_orderValues.append(child.style().order());
+}
+
+
</ins><span class=3D"cx"> } // namespace WebCore
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingOrderIteratorh"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Order=
Iterator.h (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/OrderIterator.h	2=
014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/OrderIterator.h	2014-05-27 07:17:52 UT=
C (rev 169372)
</span><span class=3D"lines">@@ -41,10 +41,9 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> class OrderIterator {
</span><span class=3D"cx"> public:
</span><del>-    OrderIterator(RenderBox&amp;);
</del><ins>+    friend class OrderIteratorPopulator;
</ins><span class=3D"cx">=20
</span><del>-    typedef Vector&lt;int, 1&gt; OrderValues;
-    void setOrderValues(OrderValues&amp;&amp;);
</del><ins>+    explicit OrderIterator(RenderBox&amp;);
</ins><span class=3D"cx">=20
</span><span class=3D"cx">     RenderBox* currentChild() const { return m=
_currentChild; }
</span><span class=3D"cx">     RenderBox* first();
</span><span class=3D"lines">@@ -55,10 +54,24 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx">     RenderBox&amp; m_containerBox;
</span><span class=3D"cx">     RenderBox* m_currentChild;
</span><del>-    OrderValues m_orderValues;
</del><ins>+
+    Vector&lt;int, 1&gt; m_orderValues;
</ins><span class=3D"cx">     int m_orderIndex;
</span><span class=3D"cx"> };
</span><span class=3D"cx">=20
</span><ins>+class OrderIteratorPopulator {
+public:
+    OrderIteratorPopulator(OrderIterator&amp;);
+    ~OrderIteratorPopulator();
+
+    void collectChild(const RenderBox&amp;);
+
+private:
+    void removeDuplicatedOrderValues();
+
+    OrderIterator&amp; m_iterator;
+};
+
</ins><span class=3D"cx"> } // namespace WebCore
</span><span class=3D"cx">=20
</span><span class=3D"cx"> #endif //  OrderIterator_h
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderFlexibleBoxcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rFlexibleBox.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderFlexibleBox=
.cpp	2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2014-05-27 07:17=
:52 UTC (rev 169372)
</span><span class=3D"lines">@@ -275,13 +275,11 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx">     dirtyForLayoutFromPercentageHeightDescenda=
nts();
</span><span class=3D"cx">=20
</span><del>-    Vector&lt;LineContext&gt; lineContexts;
-    OrderIterator::OrderValues orderValues;
-    computeMainAxisPreferredSizes(orderValues);
-    m_orderIterator.setOrderValues(std::move(orderValues));
</del><ins>+    prepareOrderIteratorAndMargins();
</ins><span class=3D"cx">=20
</span><span class=3D"cx">     ChildFrameRects oldChildRects;
</span><span class=3D"cx">     appendChildFrameRects(oldChildRects);
</span><ins>+    Vector&lt;LineContext&gt; lineContexts;
</ins><span class=3D"cx">     layoutFlexItems(relayoutChildren, lineConte=
xts);
</span><span class=3D"cx">=20
</span><span class=3D"cx">     updateLogicalHeight();
</span><span class=3D"lines">@@ -834,16 +832,12 @@
</span><span class=3D"cx">     return minimumValueForLength(margin, avail=
ableSize);
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><del>-void RenderFlexibleBox::computeMainAxisPreferredSizes(OrderI=
terator::OrderValues&amp; orderValues)
</del><ins>+void RenderFlexibleBox::prepareOrderIteratorAndMargins()
</ins><span class=3D"cx"> {
</span><del>-    ASSERT(orderValues.isEmpty());
</del><ins>+    OrderIteratorPopulator populator(m_orderIterator);
</ins><span class=3D"cx">=20
</span><span class=3D"cx">     for (RenderBox* child =3D firstChildBox();=
 child; child =3D child-&gt;nextSiblingBox()) {
</span><del>-        // Avoid growing the vector for the common-case defa=
ult value of 0. This optimizes the most common case which is
-        // one or a few values with the default order 0
-        int order =3D child-&gt;style().order();
-        if (orderValues.isEmpty() || orderValues.last() !=3D order)
-            orderValues.append(order);
</del><ins>+        populator.collectChild(*child);
</ins><span class=3D"cx">=20
</span><span class=3D"cx">         if (child-&gt;isOutOfFlowPositioned())
</span><span class=3D"cx">             continue;
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderFlexibleBoxh"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rFlexibleBox.h (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderFlexibleBox=
.h	2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2014-05-27 07:17:5=
2 UTC (rev 169372)
</span><span class=3D"lines">@@ -137,7 +137,7 @@
</span><span class=3D"cx">     LayoutUnit marginBoxAscentForChild(RenderB=
ox&amp;);
</span><span class=3D"cx">=20
</span><span class=3D"cx">     LayoutUnit computeChildMarginValue(const L=
ength&amp; margin);
</span><del>-    void computeMainAxisPreferredSizes(OrderIterator::OrderV=
alues&amp;);
</del><ins>+    void prepareOrderIteratorAndMargins();
</ins><span class=3D"cx">     LayoutUnit adjustChildSizeForMinAndMax(Rend=
erBox&amp;, LayoutUnit childSize);
</span><span class=3D"cx">     bool computeNextFlexLine(OrderedFlexItemLi=
st&amp; orderedChildren, LayoutUnit&amp; preferredMainAxisExtent, double&=
amp; totalFlexGrow, double&amp; totalWeightedFlexShrink, LayoutUnit&amp; =
minMaxAppliedMainAxisExtent, bool&amp; hasInfiniteLineLength);
</span><span class=3D"cx">=20
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rGrid.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp	20=
14-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2014-05-27 07:17:52 UTC=
 (rev 169372)
</span><span class=3D"lines">@@ -698,17 +698,12 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> void RenderGrid::populateExplicitGridAndOrderI=
terator()
</span><span class=3D"cx"> {
</span><del>-    // FIXME: We should find a way to share OrderValues's in=
itialization code with RenderFlexibleBox.
-    OrderIterator::OrderValues orderValues;
</del><ins>+    OrderIteratorPopulator populator(m_orderIterator);
</ins><span class=3D"cx">     size_t maximumRowIndex =3D std::max&lt;size=
_t&gt;(1, explicitGridRowCount());
</span><span class=3D"cx">     size_t maximumColumnIndex =3D std::max&lt;=
size_t&gt;(1, explicitGridColumnCount());
</span><span class=3D"cx">=20
</span><span class=3D"cx">     for (RenderBox* child =3D firstChildBox();=
 child; child =3D child-&gt;nextSiblingBox()) {
</span><del>-        // Avoid growing the vector for the common-case defa=
ult value of 0. This optimizes the most common case which is
-        // one or a few values with the default order 0
-        int order =3D child-&gt;style().order();
-        if (orderValues.isEmpty() || orderValues.last() !=3D order)
-            orderValues.append(order);
</del><ins>+        populator.collectChild(*child);
</ins><span class=3D"cx">=20
</span><span class=3D"cx">         // This function bypasses the cache (c=
achedGridCoordinate()) as it is used to build it.
</span><span class=3D"cx">         std::unique_ptr&lt;GridSpan&gt; rowPos=
itions =3D resolveGridPositionsFromStyle(child, ForRows);
</span><span class=3D"lines">@@ -725,8 +720,6 @@
</span><span class=3D"cx">     m_grid.grow(maximumRowIndex);
</span><span class=3D"cx">     for (size_t i =3D 0; i &lt; m_grid.size();=
 ++i)
</span><span class=3D"cx">         m_grid[i].grow(maximumColumnIndex);
</span><del>-
-    m_orderIterator.setOrderValues(std::move(orderValues));
</del><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><span class=3D"cx"> void RenderGrid::placeSpecifiedMajorAxisItemsO=
nGrid(const Vector&lt;RenderBox*&gt;&amp; autoGridItems)
</span></span></pre>
</div>
</div>

</body>
</html>


More information about the webkit-changes mailing list