Title: [95783] trunk
Revision
95783
Author
[email protected]
Date
2011-09-22 21:54:42 -0700 (Thu, 22 Sep 2011)

Log Message

implement -webkit-flex-order
https://bugs.webkit.org/show_bug.cgi?id=67432

Reviewed by Ojan Vafai.

Source/WebCore:

flex-order can be an int (including negative), but we disallow the two
smallest values so we can put the numbers into a hash set.

Also, create two iterators: one that goes in render tree order (we use
this for the first pass and to collect the possible flex order values)
and one that goes in flex order.

Test: css3/flexbox/flex-order.html

* css/CSSParser.cpp:
(WebCore::CSSParser::parseValue):
* rendering/RenderFlexibleBox.cpp:
(WebCore::FlexOrderHashTraits::emptyValue):
(WebCore::FlexOrderHashTraits::constructDeletedValue):
(WebCore::FlexOrderHashTraits::isDeletedValue):
(WebCore::RenderFlexibleBox::TreeOrderIterator::TreeOrderIterator): A simple iterator
    that goes in render tree order.
(WebCore::RenderFlexibleBox::TreeOrderIterator::next):
(WebCore::RenderFlexibleBox::TreeOrderIterator::reset):
(WebCore::RenderFlexibleBox::TreeOrderIterator::flexOrderValues):
(WebCore::RenderFlexibleBox::FlexOrderIterator::FlexOrderIterator): An iterator that
    goes in flex-order order.  Creating this involves sorting, so only create it once
    and pass it around.
(WebCore::RenderFlexibleBox::FlexOrderIterator::first):
(WebCore::RenderFlexibleBox::FlexOrderIterator::next):
(WebCore::RenderFlexibleBox::FlexOrderIterator::reset):
(WebCore::RenderFlexibleBox::layoutHorizontalBlock):
(WebCore::RenderFlexibleBox::computePreferredLogicalWidth):
(WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection):
(WebCore::RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection):
* rendering/RenderFlexibleBox.h:

LayoutTests:

* css3/flexbox/flex-order-expected.png: Added.
* css3/flexbox/flex-order-expected.txt: Added.
* css3/flexbox/flex-order.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (95782 => 95783)


--- trunk/LayoutTests/ChangeLog	2011-09-23 04:10:24 UTC (rev 95782)
+++ trunk/LayoutTests/ChangeLog	2011-09-23 04:54:42 UTC (rev 95783)
@@ -1,3 +1,14 @@
+2011-09-22  Tony Chang  <[email protected]>
+
+        implement -webkit-flex-order
+        https://bugs.webkit.org/show_bug.cgi?id=67432
+
+        Reviewed by Ojan Vafai.
+
+        * css3/flexbox/flex-order-expected.png: Added.
+        * css3/flexbox/flex-order-expected.txt: Added.
+        * css3/flexbox/flex-order.html: Added.
+
 2011-09-22  Ben Wells  <[email protected]>
 
         Rebaseline for bug 65583 (path based border radius drawing on skia) part 6

Added: trunk/LayoutTests/css3/flexbox/flex-order-expected.png (0 => 95783)


--- trunk/LayoutTests/css3/flexbox/flex-order-expected.png	                        (rev 0)
+++ trunk/LayoutTests/css3/flexbox/flex-order-expected.png	2011-09-23 04:54:42 UTC (rev 95783)
@@ -0,0 +1,7 @@
+\x89PNG
+
+
+IHDR X')tEXtchecksumb61d2f3e53f39239e003fbcbf26bb10aM)\xD9hIDATx\x9C\xED\xDCA\x8D\xC4P\xC1d\xF9C
+\x85P\x95\xBF$zdɪB\xF0\x8E-|_\xE7\x82\xDE7=\x80\x95\x9E\xE9\xAC\xF4N`\xA3\xBF\xE9\xDB,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88\xDD\xE7\x9C\xE9
+\xAB\xB8`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4\xEE\xCB#w~\xE1\x9B\xC0J\xCF\xF4Vz\xA7\xB0\x91@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@\xEC>\xE7LoX\xC5 &\xB0b &\xB0b &\xB0b &\xB0b v_\xB9\xF3\xDF\xF4Vz\xA6\xB0\xD2;=\x80\x8D\\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b\xF79gz\xC0*.X1\x81X1\x81X1\x81X1\x81X\xB1\xFB\xF2ȝ_\xF8\xA6\xB0\xD23=\x80\x95\xDE\xE9l\xE4\x82X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81\xBB\xCF9\xD3Vq\xC1\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88ݗG\xEE\xFC\xC27=\x80\x95\x9E\xE9\xAC\xF4N`#,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\xD8}Ι\xDE\xB0\x8A@L`\xC4@L`\xC4@L`\xC4@L`\xC4@\xEC\xBE<r\xE7\xBE\xE9\xAC\xF4L`\xA5wz\xB9`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4\xEEs\xCE\xF4\x80U\\xB0b &\xB0b &\xB0b &\xB0b &\xB0b\xF7\xE5\x91;\xBF\xF0M`\xA5gz+\xBD\xD3\xD8\xC8 &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b v\x9Fs\xA67\xAC\xE2\x82X1\x81X1\x81X1\x81X1\x81\xBB/\x8F\xDC\xF9\x85oz+=\xD3X\xE9\x9D\xC0F.X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X\xB1\xFB\x9C3\xBD`,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\xD8}y\xE4\xCE/|\xD3X\xE9\x99\xC0J\xEF\xF46r\xC1\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88\xDD\xE7\x9C\xE9
+\xAB\xB8`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4\xEE\xCB#w~\xE1\x9B\xC0J\xCF\xF4Vz\xA7\xB0\x91@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@L`\xC4@\xEC>\xE7LoX\xC5 &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b \xF6#\xF3D{I\xFF:IEND\xAEB`\x82
\ No newline at end of file

Added: trunk/LayoutTests/css3/flexbox/flex-order-expected.txt (0 => 95783)


--- trunk/LayoutTests/css3/flexbox/flex-order-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/css3/flexbox/flex-order-expected.txt	2011-09-23 04:54:42 UTC (rev 95783)
@@ -0,0 +1 @@
+You should see identical green bars going from light green (left) to dark green (right).

Added: trunk/LayoutTests/css3/flexbox/flex-order.html (0 => 95783)


--- trunk/LayoutTests/css3/flexbox/flex-order.html	                        (rev 0)
+++ trunk/LayoutTests/css3/flexbox/flex-order.html	2011-09-23 04:54:42 UTC (rev 95783)
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<html>
+<style>
+body {
+    margin: 0;
+}
+.horizontal-box div {
+    height: 30px;
+    border: 0;
+    margin-bottom: 10px;
+}
+
+.first {
+    background-color: #0f0;
+}
+.second {
+    background-color: #0d0;
+}
+.third {
+    background-color: #090;
+}
+.fourth {
+    background-color: #060;
+}
+.fifth {
+    background-color: #030;
+}
+</style>
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText(true);
+</script>
+<body>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: 1"></div>
+  <div class="second" style="width: -webkit-flex(1);"></div>
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 3"></div>
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 20"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 4"></div>
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 3"></div>
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 2"></div>
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: 1"></div>
+</div>
+
+<!-- The example from the spec. -->
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 2"></div>
+  <div class="first"  style="width: -webkit-flex(1)"></div>
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 2"></div>
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 1"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 2"></div>
+  <div class="second" style="width: -webkit-flex(1)"></div>
+  <div class="third"  style="width: -webkit-flex(1)"></div>
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: -10"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 2000000000"></div>
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 1000000000"></div>
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 1000000000"></div>
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: -1000000000"></div>
+</div>
+
+<!-- Floating numbers are ignored and we use the default of 1 instead. -->
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 2.5"></div>
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 2"></div>
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: -1"></div>
+  <div class="third"  style="width: -webkit-flex(1)"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 0"></div>
+  <div class="first" style="width: -webkit-flex(1); -webkit-flex-order: -1"></div>
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 1"></div>
+  <div class="fourth"  style="width: -webkit-flex(1)"></div>
+</div>
+
+<!-- Values greater than what can be stored in an int are clamped from
+     -2,147,483,646 (int min + 2) to 2,147,483,647. -->
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 4000000000"></div>
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 3000000000"></div>
+  <div class="first"  style="width: -webkit-flex(1);"></div>
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 2147483646"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: 4000000000"></div>
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: 3000000000"></div>
+  <div class="first"  style="width: -webkit-flex(1);"></div>
+  <div class="fourth" style="width: -webkit-flex(1); -webkit-flex-order: 2147483647"></div>
+</div>
+
+<div style="display: -webkit-flexbox" class="horizontal-box">
+  <div class="third"  style="width: -webkit-flex(1); -webkit-flex-order: -2147483645"></div>
+  <div class="first"  style="width: -webkit-flex(1); -webkit-flex-order: -2147483646"></div>
+  <div class="second" style="width: -webkit-flex(1); -webkit-flex-order: -2147483647"></div>
+  <div class="fourth" style="width: -webkit-flex(1);"></div>
+</div>
+
+<!-- This should not crash. -->
+<div style="display: -webkit-flexbox" class="horizontal-box"></div>
+
+<div style="position:absolute; left: -10000px;">You should see identical green bars going from light green
+(left) to dark green (right).</div>
+
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (95782 => 95783)


--- trunk/Source/WebCore/ChangeLog	2011-09-23 04:10:24 UTC (rev 95782)
+++ trunk/Source/WebCore/ChangeLog	2011-09-23 04:54:42 UTC (rev 95783)
@@ -1,3 +1,42 @@
+2011-09-22  Tony Chang  <[email protected]>
+
+        implement -webkit-flex-order
+        https://bugs.webkit.org/show_bug.cgi?id=67432
+
+        Reviewed by Ojan Vafai.
+
+        flex-order can be an int (including negative), but we disallow the two
+        smallest values so we can put the numbers into a hash set.
+
+        Also, create two iterators: one that goes in render tree order (we use
+        this for the first pass and to collect the possible flex order values)
+        and one that goes in flex order.
+
+        Test: css3/flexbox/flex-order.html
+
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseValue):
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::FlexOrderHashTraits::emptyValue):
+        (WebCore::FlexOrderHashTraits::constructDeletedValue):
+        (WebCore::FlexOrderHashTraits::isDeletedValue):
+        (WebCore::RenderFlexibleBox::TreeOrderIterator::TreeOrderIterator): A simple iterator
+            that goes in render tree order.
+        (WebCore::RenderFlexibleBox::TreeOrderIterator::next):
+        (WebCore::RenderFlexibleBox::TreeOrderIterator::reset):
+        (WebCore::RenderFlexibleBox::TreeOrderIterator::flexOrderValues):
+        (WebCore::RenderFlexibleBox::FlexOrderIterator::FlexOrderIterator): An iterator that
+            goes in flex-order order.  Creating this involves sorting, so only create it once
+            and pass it around.
+        (WebCore::RenderFlexibleBox::FlexOrderIterator::first):
+        (WebCore::RenderFlexibleBox::FlexOrderIterator::next):
+        (WebCore::RenderFlexibleBox::FlexOrderIterator::reset):
+        (WebCore::RenderFlexibleBox::layoutHorizontalBlock):
+        (WebCore::RenderFlexibleBox::computePreferredLogicalWidth):
+        (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection):
+        (WebCore::RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection):
+        * rendering/RenderFlexibleBox.h:
+
 2011-09-22  Darin Adler  <[email protected]>
 
         Use AffineTransform scale functions in ShadowBlur::adjustBlurRadius

Modified: trunk/Source/WebCore/css/CSSParser.cpp (95782 => 95783)


--- trunk/Source/WebCore/css/CSSParser.cpp	2011-09-23 04:10:24 UTC (rev 95782)
+++ trunk/Source/WebCore/css/CSSParser.cpp	2011-09-23 04:54:42 UTC (rev 95783)
@@ -1574,7 +1574,12 @@
         break;
 #if ENABLE(CSS3_FLEXBOX)
     case CSSPropertyWebkitFlexOrder:
-        validPrimitive = validUnit(value, FInteger, true);
+        if (validUnit(value, FInteger, true)) {
+            // We restrict the smallest value to int min + 2 because we use int min and int min + 1 as special values in a hash set.
+            parsedValue = primitiveValueCache()->createValue(max(static_cast<double>(std::numeric_limits<int>::min() + 2), value->fValue),
+                                                             static_cast<CSSPrimitiveValue::UnitTypes>(value->unit));
+            m_valueList->next();
+        }
         break;
     case CSSPropertyWebkitFlexPack:
         validPrimitive = id == CSSValueStart || id == CSSValueEnd || id == CSSValueCenter || id == CSSValueJustify;

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp (95782 => 95783)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2011-09-23 04:10:24 UTC (rev 95782)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2011-09-23 04:54:42 UTC (rev 95783)
@@ -35,9 +35,21 @@
 
 namespace WebCore {
 
-class RenderFlexibleBox::FlexibleBoxIterator {
+// Normally, -1 and 0 are not valid in a HashSet, but these are relatively likely flex-order values. Instead,
+// we make the two smallest int values invalid flex-order values (in the css parser code we clamp them to
+// int min + 2).
+struct FlexOrderHashTraits : WTF::GenericHashTraits<int> {
+    static const bool emptyValueIsZero = false;
+    static int emptyValue() { return std::numeric_limits<int>::min(); }
+    static void constructDeletedValue(int& slot) { slot = std::numeric_limits<int>::min() + 1; }
+    static bool isDeletedValue(int value) { return value == std::numeric_limits<int>::min() + 1; }
+};
+
+typedef HashSet<int, DefaultHash<int>::Hash, FlexOrderHashTraits> FlexOrderHashSet;
+
+class RenderFlexibleBox::TreeOrderIterator {
 public:
-    explicit FlexibleBoxIterator(RenderFlexibleBox* flexibleBox)
+    explicit TreeOrderIterator(RenderFlexibleBox* flexibleBox)
         : m_flexibleBox(flexibleBox)
         , m_currentChild(0)
     {
@@ -56,6 +68,9 @@
         while (child && !child->isBox())
             child = child->nextSibling();
 
+        if (child)
+            m_flexOrderValues.add(child->style()->flexOrder());
+
         m_currentChild = toRenderBox(child);
         return m_currentChild;
     }
@@ -65,12 +80,71 @@
         m_currentChild = 0;
     }
 
+    const FlexOrderHashSet& flexOrderValues()
+    {
+        return m_flexOrderValues;
+    }
+
 private:
     RenderFlexibleBox* m_flexibleBox;
     RenderBox* m_currentChild;
+    FlexOrderHashSet m_flexOrderValues;
 };
 
+class RenderFlexibleBox::FlexOrderIterator {
+public:
+    FlexOrderIterator(RenderFlexibleBox* flexibleBox, const FlexOrderHashSet& flexOrderValues)
+        : m_flexibleBox(flexibleBox)
+        , m_currentChild(0)
+        , m_orderValuesIterator(0)
+    {
+        copyToVector(flexOrderValues, m_orderValues);
+        std::sort(m_orderValues.begin(), m_orderValues.end());
+    }
 
+    RenderBox* first()
+    {
+        reset();
+        return next();
+    }
+
+    RenderBox* next()
+    {
+        RenderObject* child = m_currentChild;
+        do {
+            if (!child) {
+                if (m_orderValuesIterator == m_orderValues.end())
+                    return 0;
+                if (m_orderValuesIterator) {
+                    ++m_orderValuesIterator;
+                    if (m_orderValuesIterator == m_orderValues.end())
+                        return 0;
+                } else
+                    m_orderValuesIterator = m_orderValues.begin();
+
+                child = m_flexibleBox->firstChild();
+            } else
+                child = child->nextSibling();
+        } while (!child || !child->isBox() || child->style()->flexOrder() != *m_orderValuesIterator);
+
+        m_currentChild = toRenderBox(child);
+        return m_currentChild;
+    }
+
+    void reset()
+    {
+        m_currentChild = 0;
+        m_orderValuesIterator = 0;
+    }
+
+private:
+    RenderFlexibleBox* m_flexibleBox;
+    RenderBox* m_currentChild;
+    Vector<int> m_orderValues;
+    Vector<int>::const_iterator m_orderValuesIterator;
+};
+
+
 RenderFlexibleBox::RenderFlexibleBox(Node* node)
     : RenderBlock(node)
 {
@@ -152,19 +226,20 @@
     LayoutUnit preferredLogicalWidth;
     float totalPositiveFlexibility;
     float totalNegativeFlexibility;
-    FlexibleBoxIterator iterator(this);
+    TreeOrderIterator treeIterator(this);
 
-    computePreferredLogicalWidth(relayoutChildren, iterator, preferredLogicalWidth, totalPositiveFlexibility, totalNegativeFlexibility);
+    computePreferredLogicalWidth(relayoutChildren, treeIterator, preferredLogicalWidth, totalPositiveFlexibility, totalNegativeFlexibility);
     LayoutUnit availableFreeSpace = contentLogicalWidth() - preferredLogicalWidth;
 
+    FlexOrderIterator flexIterator(this, treeIterator.flexOrderValues());
     InflexibleFlexItemSize inflexibleItems;
     WTF::Vector<LayoutUnit> childSizes;
-    while (!runFreeSpaceAllocationAlgorithmInlineDirection(availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) {
+    while (!runFreeSpaceAllocationAlgorithmInlineDirection(flexIterator, availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) {
         ASSERT(totalPositiveFlexibility >= 0 && totalNegativeFlexibility >= 0);
         ASSERT(inflexibleItems.size() > 0);
     }
 
-    layoutAndPlaceChildrenInlineDirection(childSizes, availableFreeSpace, totalPositiveFlexibility);
+    layoutAndPlaceChildrenInlineDirection(flexIterator, childSizes, availableFreeSpace, totalPositiveFlexibility);
 
     // FIXME: Handle distribution of cross-axis space (third distribution round).
 }
@@ -179,7 +254,7 @@
     return isHorizontalWritingMode() ? child->style()->flexboxWidthNegativeFlex() : child->style()->flexboxHeightNegativeFlex();
 }
 
-void RenderFlexibleBox::computePreferredLogicalWidth(bool relayoutChildren, FlexibleBoxIterator& iterator, LayoutUnit& preferredLogicalWidth, float& totalPositiveFlexibility, float& totalNegativeFlexibility)
+void RenderFlexibleBox::computePreferredLogicalWidth(bool relayoutChildren, TreeOrderIterator& iterator, LayoutUnit& preferredLogicalWidth, float& totalPositiveFlexibility, float& totalNegativeFlexibility)
 {
     preferredLogicalWidth = 0;
     totalPositiveFlexibility = totalNegativeFlexibility = 0;
@@ -216,9 +291,8 @@
 }
 
 // Returns true if we successfully ran the algorithm and sized the flex items.
-bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection(LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)
+bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection(FlexOrderIterator& iterator, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)
 {
-    FlexibleBoxIterator iterator(this);
     childSizes.clear();
 
     LayoutUnit flexboxAvailableLogicalWidth = availableLogicalWidth();
@@ -273,9 +347,8 @@
         child->isHorizontalWritingMode() ? child->setOverrideHeight(childPreferredSize) : child->setOverrideWidth(childPreferredSize);
 }
 
-void RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)
+void RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection(FlexOrderIterator& iterator, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)
 {
-    FlexibleBoxIterator iterator(this);
     LayoutUnit startEdge = borderStart() + paddingStart();
 
     if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility)) {

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.h (95782 => 95783)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2011-09-23 04:10:24 UTC (rev 95782)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2011-09-23 04:54:42 UTC (rev 95783)
@@ -49,7 +49,8 @@
     virtual void layoutBlock(bool relayoutChildren, int pageLogicalHeight = 0, BlockLayoutPass = NormalLayoutPass);
 
 private:
-    class FlexibleBoxIterator;
+    class TreeOrderIterator;
+    class FlexOrderIterator;
     typedef WTF::HashMap<const RenderBox*, LayoutUnit> InflexibleFlexItemSize;
 
     LayoutUnit logicalBorderAndPaddingWidthForChild(RenderBox* child);
@@ -63,10 +64,10 @@
     float logicalPositiveFlexForChild(RenderBox* child);
     float logicalNegativeFlexForChild(RenderBox* child);
 
-    void computePreferredLogicalWidth(bool relayoutChildren, FlexibleBoxIterator&, LayoutUnit&, float& totalPositiveFlexibility, float& totalNegativeFlexibility);
-    bool runFreeSpaceAllocationAlgorithmInlineDirection(LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes);
+    void computePreferredLogicalWidth(bool relayoutChildren, TreeOrderIterator&, LayoutUnit&, float& totalPositiveFlexibility, float& totalNegativeFlexibility);
+    bool runFreeSpaceAllocationAlgorithmInlineDirection(FlexOrderIterator&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes);
     void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize);
-    void layoutAndPlaceChildrenInlineDirection(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
+    void layoutAndPlaceChildrenInlineDirection(FlexOrderIterator&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to