Diff
Modified: trunk/LayoutTests/ChangeLog (95576 => 95577)
--- trunk/LayoutTests/ChangeLog 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/LayoutTests/ChangeLog 2011-09-20 22:46:19 UTC (rev 95577)
@@ -1,3 +1,14 @@
+2011-09-18 Ojan Vafai <[email protected]>
+
+ change RenderFlexibleBox to act on logical coordinates
+ https://bugs.webkit.org/show_bug.cgi?id=68129
+
+ Reviewed by David Hyatt.
+
+ * css3/flexbox/resources/flexbox.js:
+ * css3/flexbox/writing-modes-expected.txt: Added.
+ * css3/flexbox/writing-modes.html: Added.
+
2011-09-20 Ryosuke Niwa <[email protected]>
Hit testing on margins of body and head elements doesn't recur
Modified: trunk/LayoutTests/css3/flexbox/resources/flexbox.js (95576 => 95577)
--- trunk/LayoutTests/css3/flexbox/resources/flexbox.js 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/LayoutTests/css3/flexbox/resources/flexbox.js 2011-09-20 22:46:19 UTC (rev 95577)
@@ -14,11 +14,23 @@
failures.push("Expected " + expectedWidth + " for width, but got " + node.offsetWidth + ". ");
}
+ var expectedHeight = node.getAttribute && node.getAttribute("data-expected-height");
+ if (expectedHeight) {
+ if (node.offsetHeight != parseInt(expectedHeight))
+ failures.push("Expected " + expectedHeight + " for height, but got " + node.offsetHeight + ". ");
+ }
+
var expectedOffset = node.getAttribute && node.getAttribute("data-offset-x");
if (expectedOffset) {
if (node.offsetLeft != parseInt(expectedOffset))
failures.push("Expected " + expectedOffset + " for offsetLeft, but got " + node.offsetLeft + ". ");
}
+
+ var expectedOffset = node.getAttribute && node.getAttribute("data-offset-y");
+ if (expectedOffset) {
+ if (node.offsetTop != parseInt(expectedOffset))
+ failures.push("Expected " + expectedOffset + " for offsetTop, but got " + node.offsetTop + ". ");
+ }
}
function checkHorizontalBoxen()
Added: trunk/LayoutTests/css3/flexbox/writing-modes-expected.txt (0 => 95577)
--- trunk/LayoutTests/css3/flexbox/writing-modes-expected.txt (rev 0)
+++ trunk/LayoutTests/css3/flexbox/writing-modes-expected.txt 2011-09-20 22:46:19 UTC (rev 95577)
@@ -0,0 +1,17 @@
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+PASS
+Expected 580 for offsetLeft, but got 0. Expected 580 for offsetLeft, but got 0. Expected 580 for offsetLeft, but got 0.
+Expected 580 for offsetLeft, but got 0. Expected 180 for offsetTop, but got 0. Expected 580 for offsetLeft, but got 150. Expected 180 for offsetTop, but got 0. Expected 580 for offsetLeft, but got 450. Expected 180 for offsetTop, but got 0.
+
Property changes on: trunk/LayoutTests/css3/flexbox/writing-modes-expected.txt
___________________________________________________________________
Added: svn:eol-style
Added: trunk/LayoutTests/css3/flexbox/writing-modes.html (0 => 95577)
--- trunk/LayoutTests/css3/flexbox/writing-modes.html (rev 0)
+++ trunk/LayoutTests/css3/flexbox/writing-modes.html 2011-09-20 22:46:19 UTC (rev 95577)
@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html>
+<style>
+body {
+ margin: 0;
+}
+/* FIXME: flexbox.js iterates over horizontal-box elements. Rename this to flexbox. */
+.horizontal-box {
+ width: 600px;
+ display: -webkit-flexbox;
+}
+.horizontal-box div {
+ height: 20px;
+ border: 0;
+}
+
+.rtl {
+ direction: rtl;
+}
+
+.bt {
+ -webkit-writing-mode: horizontal-bt;
+}
+
+.vertical-rl, .vertical-lr {
+ height: 600px;
+}
+
+:-webkit-any(.vertical-rl, .vertical-lr) div {
+ width: 20px;
+}
+
+.vertical-rl {
+ -webkit-writing-mode: vertical-rl;
+}
+
+.vertical-lr {
+ -webkit-writing-mode: vertical-lr;
+}
+
+.horizontal-box > :nth-child(1) {
+ background-color: blue;
+}
+.horizontal-box > :nth-child(2) {
+ background-color: green;
+}
+.horizontal-box > :nth-child(3) {
+ background-color: red;
+}
+</style>
+<script>
+if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+</script>
+<script src=""
+<body _onload_="checkHorizontalBoxen()">
+
+<div class="horizontal-box rtl">
+ <div data-expected-width="50" data-offset-x="500" style="width: -webkit-flex(1 0 0); margin: 0 auto;"></div>
+ <div data-expected-width="300" data-offset-x="150" style="width: -webkit-flex(2 0 0); padding: 0 100px;"></div>
+ <div data-expected-width="50" data-offset-x="100" style="width: -webkit-flex(1 0 0); margin-left: 100px;"></div>
+</div>
+
+<div class="horizontal-box rtl">
+ <div data-expected-width="50" data-offset-x="500" style="width: -webkit-flex(1 0 0); margin: 0 auto;"></div>
+ <div data-expected-width="300" data-offset-x="150" style="width: -webkit-flex(2 0 0); padding: 0 100px;"></div>
+ <div data-expected-width="50" data-offset-x="0" style="width: -webkit-flex(1 0 0); -webkit-margin-start: 100px;"></div>
+</div>
+
+<div class="horizontal-box rtl" style="-webkit-margin-start: 20px;-webkit-margin-end: 50px;">
+ <div data-expected-width="50" data-offset-x="550" style="width: -webkit-flex(1 0 0); margin: 0 auto;"></div>
+ <div data-expected-width="300" data-offset-x="200" style="width: -webkit-flex(2 0 0); padding: 0 100px;"></div>
+ <div data-expected-width="50" data-offset-x="50" style="width: -webkit-flex(1 0 0); -webkit-margin-start: 100px;"></div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="150" data-offset-y="0" style="height: -webkit-flex(1 0 0);"></div>
+ <div data-expected-height="300" data-offset-y="150" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="150" data-offset-y="450" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="150" data-offset-y="0" style="height: -webkit-flex(1 0 0);"></div>
+ <div data-expected-height="300" data-offset-y="150" class="bt" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="150" data-offset-y="450" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="450" data-offset-y="0" style="height: -webkit-flex(1 0 0);-webkit-padding-start:200px;-webkit-padding-end:200px;-webkit-padding-before:100px;-webkit-padding-after:100px;"></div>
+ <div data-expected-height="100" data-offset-y="450" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="50" data-offset-y="550" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="300" data-offset-y="0" class="bt" style="height: -webkit-flex(1 0 0);-webkit-padding-start:200px;-webkit-padding-end:200px;-webkit-padding-before:100px;-webkit-padding-after:100px;"></div>
+ <div data-expected-height="200" data-offset-y="300" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="100" data-offset-y="500" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="100" data-offset-y="100" style="height: -webkit-flex(1 0 0); margin: auto 0;"></div>
+ <div data-expected-height="200" data-offset-y="300" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="100" data-offset-y="500" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="50" data-offset-y="50" style="height: -webkit-flex(1 0 0);margin: auto 0;"></div>
+ <div data-expected-height="400" data-offset-y="150" style="height: -webkit-flex(2 0 auto);"><div style="width:200px;height:300px;background-color:orange;"></div></div>
+ <div data-expected-height="50" data-offset-y="550" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="50" data-offset-y="50" style="height: -webkit-flex(1 0 0);margin: auto 0;"></div>
+ <div data-expected-height="400" data-offset-y="150" class="bt" style="height: -webkit-flex(2 0 auto);"><div style="width:200px;height:300px;background-color:orange;"></div></div>
+ <div data-expected-height="50" data-offset-y="550" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="100" data-offset-y="100" style="height: -webkit-flex(1 0 0);-webkit-margin-start:auto;-webkit-margin-end:auto;-webkit-margin-before:0;-webkit-margin-after:0;;"></div>
+ <div data-expected-height="200" data-offset-y="300" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="100" data-offset-y="500" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="150" data-offset-y="0" class="bt" style="height: -webkit-flex(1 0 0);-webkit-margin-start:auto;-webkit-margin-end:auto;-webkit-margin-before:0;-webkit-margin-after:0;;"></div>
+ <div data-expected-height="300" data-offset-y="150" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="150" data-offset-y="450" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<div style="position:relative">
+<div class="horizontal-box vertical-lr rtl">
+ <div data-expected-height="50" data-offset-y="500" style="height: -webkit-flex(1 0 0); margin: auto 0;"></div>
+ <div data-expected-height="300" data-offset-y="150" class="bt" style="height: -webkit-flex(2 0 0); padding: 100px 0;"></div>
+ <div data-expected-height="50" data-offset-y="0" style="height: -webkit-flex(1 0 0); -webkit-margin-start: 100px;"></div>
+</div>
+</div>
+
+<div class="horizontal-box vertical-lr">
+ <div data-expected-height="350" style="height: -webkit-flex(1 1 400px); min-height: 350px;"></div>
+ <div data-expected-height="250" style="height: -webkit-flex(1 1 400px);"></div>
+</div>
+
+<!-- FIXME: There's a bug where offsetLeft reports the wrong value in vertical-rl writing-mode.-->
+<div style="position:relative">
+<div class="horizontal-box vertical-rl">
+ <div data-expected-height="150" data-offset-y="0" data-offset-x="580" style="height: -webkit-flex(1 0 0);"></div>
+ <div data-expected-height="300" data-offset-y="150" data-offset-x="580" style="height: -webkit-flex(2 0 0);"></div>
+ <div data-expected-height="150" data-offset-y="450" data-offset-x="580" style="height: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+<!-- FIXME: There's a bug where offsetTop reports the wrong value in horizontal-bt writing-mode.-->
+<div style="position:relative">
+<div class="horizontal-box bt" style="height:200px">
+ <div data-offset-y="180" data-offset-x="580" style="width: -webkit-flex(1 0 0);"></div>
+ <div data-offset-y="180" data-offset-x="580" style="width: -webkit-flex(2 0 0);"></div>
+ <div data-offset-y="180" data-offset-x="580" style="width: -webkit-flex(1 0 0);"></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
Property changes on: trunk/LayoutTests/css3/flexbox/writing-modes.html
___________________________________________________________________
Added: svn:eol-style
Modified: trunk/Source/WebCore/ChangeLog (95576 => 95577)
--- trunk/Source/WebCore/ChangeLog 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/Source/WebCore/ChangeLog 2011-09-20 22:46:19 UTC (rev 95577)
@@ -1,3 +1,35 @@
+2011-09-18 Ojan Vafai <[email protected]>
+
+ change RenderFlexibleBox to act on logical coordinates
+ https://bugs.webkit.org/show_bug.cgi?id=68129
+
+ Reviewed by David Hyatt.
+
+ This makes RenderFlexibleBox respect direction and writing-mode.
+ We now properly support the default flex-flow value of "row".
+
+ Test: css3/flexbox/writing-modes.html
+
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::setLogicalLocationForChild):
+ * rendering/RenderBlock.h:
+ * rendering/RenderFlexibleBox.cpp:
+ (WebCore::RenderFlexibleBox::layoutBlock):
+ (WebCore::RenderFlexibleBox::logicalBorderWidthForChild):
+ (WebCore::RenderFlexibleBox::logicalPaddingWidthForChild):
+ (WebCore::RenderFlexibleBox::logicalScrollbarHeightForChild):
+ (WebCore::RenderFlexibleBox::marginStartStyleForChild):
+ (WebCore::RenderFlexibleBox::marginEndStyleForChild):
+ (WebCore::RenderFlexibleBox::preferredLogicalContentWidthForFlexItem):
+ (WebCore::RenderFlexibleBox::layoutInlineDirection):
+ (WebCore::RenderFlexibleBox::logicalPositiveFlexForChild):
+ (WebCore::RenderFlexibleBox::logicalNegativeFlexForChild):
+ (WebCore::RenderFlexibleBox::computePreferredLogicalWidth):
+ (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection):
+ (WebCore::RenderFlexibleBox::setLogicalOverrideSize):
+ (WebCore::RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection):
+ * rendering/RenderFlexibleBox.h:
+
2011-09-20 Marshall Greenblatt <[email protected]>
Use DEFINE_STATIC_LOCAL to intentionally leak the static RefCountedHFONT object returned from
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (95576 => 95577)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2011-09-20 22:46:19 UTC (rev 95577)
@@ -1860,6 +1860,14 @@
setCollapsedBottomMargin(marginInfo);
}
+void RenderBlock::setLogicalLocationForChild(RenderBox* child, const LayoutPoint& location)
+{
+ if (style()->isHorizontalWritingMode())
+ child->setLocation(location);
+ else
+ child->setLocation(location.transposedPoint());
+}
+
void RenderBlock::setLogicalLeftForChild(RenderBox* child, LayoutUnit logicalLeft, ApplyLayoutDeltaMode applyDelta)
{
if (isHorizontalWritingMode()) {
Modified: trunk/Source/WebCore/rendering/RenderBlock.h (95576 => 95577)
--- trunk/Source/WebCore/rendering/RenderBlock.h 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/Source/WebCore/rendering/RenderBlock.h 2011-09-20 22:46:19 UTC (rev 95577)
@@ -209,6 +209,8 @@
LayoutUnit logicalHeightForChild(RenderBox* child) { return isHorizontalWritingMode() ? child->height() : child->width(); }
LayoutUnit logicalTopForChild(RenderBox* child) { return isHorizontalWritingMode() ? child->y() : child->x(); }
LayoutUnit logicalLeftForChild(RenderBox* child) { return isHorizontalWritingMode() ? child->x() : child->y(); }
+ // FIXME: Supporting layout deltas.
+ void setLogicalLocationForChild(RenderBox* child, const LayoutPoint&);
void setLogicalLeftForChild(RenderBox* child, LayoutUnit logicalLeft, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta);
void setLogicalTopForChild(RenderBox* child, LayoutUnit logicalTop, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta);
LayoutUnit marginBeforeForChild(RenderBoxModelObject* child) const;
Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp (95576 => 95577)
--- trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp 2011-09-20 22:46:19 UTC (rev 95577)
@@ -99,8 +99,7 @@
m_overflow.clear();
- // FIXME: Assume horizontal layout until flex-flow is added.
- layoutHorizontalBlock(relayoutChildren);
+ layoutInlineDirection(relayoutChildren);
computeLogicalHeight();
@@ -114,47 +113,88 @@
setNeedsLayout(false);
}
-static LayoutUnit preferredFlexItemContentWidth(RenderBox* child)
+LayoutUnit RenderFlexibleBox::logicalBorderWidthForChild(RenderBox* child)
{
- // FIXME: Handle vertical writing modes with horizontal flexing.
- if (child->style()->width().isAuto())
- return child->maxPreferredLogicalWidth() - child->borderLeft() - child->borderRight() - child->verticalScrollbarWidth() - child->paddingLeft() - child->paddingRight();
- return child->contentWidth();
+ if (isHorizontalWritingMode())
+ return child->borderLeft() + child->borderRight();
+ return child->borderTop() + child->borderBottom();
}
-void RenderFlexibleBox::layoutHorizontalBlock(bool relayoutChildren)
+LayoutUnit RenderFlexibleBox::logicalPaddingWidthForChild(RenderBox* child)
{
- LayoutUnit preferredSize;
+ if (isHorizontalWritingMode())
+ return child->paddingLeft() + child->paddingRight();
+ return child->paddingTop() + child->paddingBottom();
+}
+
+LayoutUnit RenderFlexibleBox::logicalScrollbarHeightForChild(RenderBox* child)
+{
+ if (isHorizontalWritingMode())
+ return child->horizontalScrollbarHeight();
+ return child->verticalScrollbarWidth();
+}
+
+Length RenderFlexibleBox::marginStartStyleForChild(RenderBox* child)
+{
+ if (isHorizontalWritingMode())
+ return style()->isLeftToRightDirection() ? child->style()->marginLeft() : child->style()->marginRight();
+ return style()->isLeftToRightDirection() ? child->style()->marginTop() : child->style()->marginBottom();
+}
+
+Length RenderFlexibleBox::marginEndStyleForChild(RenderBox* child)
+{
+ if (isHorizontalWritingMode())
+ return style()->isLeftToRightDirection() ? child->style()->marginRight() : child->style()->marginLeft();
+ return style()->isLeftToRightDirection() ? child->style()->marginBottom() : child->style()->marginTop();
+}
+
+LayoutUnit RenderFlexibleBox::preferredLogicalContentWidthForFlexItem(RenderBox* child)
+{
+ Length width = isHorizontalWritingMode() ? child->style()->width() : child->style()->height();
+ if (width.isAuto()) {
+ LayoutUnit logicalWidth = isHorizontalWritingMode() == child->isHorizontalWritingMode() ? child->maxPreferredLogicalWidth() : child->logicalHeight();
+ return logicalWidth - logicalBorderWidthForChild(child) - logicalScrollbarHeightForChild(child) - logicalPaddingWidthForChild(child);
+ }
+ return isHorizontalWritingMode() ? child->contentWidth() : child->contentHeight();
+}
+
+void RenderFlexibleBox::layoutInlineDirection(bool relayoutChildren)
+{
+ LayoutUnit preferredLogicalWidth;
float totalPositiveFlexibility;
float totalNegativeFlexibility;
FlexibleBoxIterator iterator(this);
- computePreferredSizeHorizontal(relayoutChildren, iterator, preferredSize, totalPositiveFlexibility, totalNegativeFlexibility);
- LayoutUnit availableFreeSpace = contentWidth() - preferredSize;
+ computePreferredLogicalWidth(relayoutChildren, iterator, preferredLogicalWidth, totalPositiveFlexibility, totalNegativeFlexibility);
+ LayoutUnit availableFreeSpace = contentLogicalWidth() - preferredLogicalWidth;
InflexibleFlexItemSize inflexibleItems;
WTF::Vector<LayoutUnit> childSizes;
- while (!runFreeSpaceAllocationAlgorithmHorizontal(availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) {
+ while (!runFreeSpaceAllocationAlgorithmInlineDirection(availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) {
ASSERT(totalPositiveFlexibility >= 0 && totalNegativeFlexibility >= 0);
ASSERT(inflexibleItems.size() > 0);
}
- layoutAndPlaceChildrenHorizontal(childSizes, availableFreeSpace, totalPositiveFlexibility);
+ layoutAndPlaceChildrenInlineDirection(childSizes, availableFreeSpace, totalPositiveFlexibility);
- // FIXME: Handle distribution of vertical space (third distribution round).
+ // FIXME: Handle distribution of cross-axis space (third distribution round).
}
-static LayoutUnit preferredSizeForMarginsAndPadding(Length length, LayoutUnit containerLength)
+float RenderFlexibleBox::logicalPositiveFlexForChild(RenderBox* child)
{
- return length.calcMinValue(containerLength);
+ return isHorizontalWritingMode() ? child->style()->flexboxWidthPositiveFlex() : child->style()->flexboxHeightPositiveFlex();
}
-void RenderFlexibleBox::computePreferredSizeHorizontal(bool relayoutChildren, FlexibleBoxIterator& iterator, LayoutUnit& preferredSize, float& totalPositiveFlexibility, float& totalNegativeFlexibility)
+float RenderFlexibleBox::logicalNegativeFlexForChild(RenderBox* child)
{
- preferredSize = 0;
+ return isHorizontalWritingMode() ? child->style()->flexboxWidthNegativeFlex() : child->style()->flexboxHeightNegativeFlex();
+}
+
+void RenderFlexibleBox::computePreferredLogicalWidth(bool relayoutChildren, FlexibleBoxIterator& iterator, LayoutUnit& preferredLogicalWidth, float& totalPositiveFlexibility, float& totalNegativeFlexibility)
+{
+ preferredLogicalWidth = 0;
totalPositiveFlexibility = totalNegativeFlexibility = 0;
- // FIXME: Handle vertical writing modes with horizontal flexing.
LayoutUnit flexboxAvailableLogicalWidth = availableLogicalWidth();
for (RenderBox* child = iterator.first(); child; child = iterator.next()) {
// We always have to lay out flexible objects again, since the flex distribution
@@ -164,59 +204,64 @@
child->setChildNeedsLayout(true);
child->layoutIfNeeded();
- preferredSize += preferredSizeForMarginsAndPadding(child->style()->marginLeft(), flexboxAvailableLogicalWidth);
- preferredSize += preferredSizeForMarginsAndPadding(child->style()->marginRight(), flexboxAvailableLogicalWidth);
- preferredSize += preferredSizeForMarginsAndPadding(child->style()->paddingLeft(), flexboxAvailableLogicalWidth);
- preferredSize += preferredSizeForMarginsAndPadding(child->style()->paddingRight(), flexboxAvailableLogicalWidth);
+ if (isHorizontalWritingMode()) {
+ preferredLogicalWidth += child->style()->marginLeft().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->marginRight().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->paddingLeft().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->paddingRight().calcMinValue(flexboxAvailableLogicalWidth);
+ } else {
+ preferredLogicalWidth += child->style()->marginTop().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->marginBottom().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->paddingTop().calcMinValue(flexboxAvailableLogicalWidth);
+ preferredLogicalWidth += child->style()->paddingBottom().calcMinValue(flexboxAvailableLogicalWidth);
+ }
- if (child->style()->marginLeft().isAuto())
+ if (marginStartStyleForChild(child).isAuto())
totalPositiveFlexibility += 1;
- if (child->style()->marginRight().isAuto())
+ if (marginEndStyleForChild(child).isAuto())
totalPositiveFlexibility += 1;
- preferredSize += child->borderLeft() + child->borderRight();
+ preferredLogicalWidth += logicalBorderWidthForChild(child);
+ preferredLogicalWidth += preferredLogicalContentWidthForFlexItem(child);
- preferredSize += preferredFlexItemContentWidth(child);
-
- totalPositiveFlexibility += child->style()->flexboxWidthPositiveFlex();
- totalNegativeFlexibility += child->style()->flexboxWidthNegativeFlex();
+ totalPositiveFlexibility += logicalPositiveFlexForChild(child);
+ totalNegativeFlexibility += logicalNegativeFlexForChild(child);
}
}
// Returns true if we successfully ran the algorithm and sized the flex items.
-bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithmHorizontal(LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)
+bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithmInlineDirection(LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)
{
FlexibleBoxIterator iterator(this);
childSizes.clear();
- // FIXME: Handle vertical writing modes with horizontal flexing.
LayoutUnit flexboxAvailableLogicalWidth = availableLogicalWidth();
for (RenderBox* child = iterator.first(); child; child = iterator.next()) {
LayoutUnit childPreferredSize;
if (inflexibleItems.contains(child))
childPreferredSize = inflexibleItems.get(child);
else {
- childPreferredSize = preferredFlexItemContentWidth(child);
+ childPreferredSize = preferredLogicalContentWidthForFlexItem(child);
if (availableFreeSpace > 0 && totalPositiveFlexibility > 0) {
- childPreferredSize += lroundf(availableFreeSpace * child->style()->flexboxWidthPositiveFlex() / totalPositiveFlexibility);
+ childPreferredSize += lroundf(availableFreeSpace * logicalPositiveFlexForChild(child) / totalPositiveFlexibility);
- Length childMaxWidth = child->style()->maxWidth();
- if (!childMaxWidth.isUndefined() && childMaxWidth.isSpecified() && childPreferredSize > childMaxWidth.calcValue(flexboxAvailableLogicalWidth)) {
- childPreferredSize = childMaxWidth.calcValue(flexboxAvailableLogicalWidth);
- availableFreeSpace -= childPreferredSize - preferredFlexItemContentWidth(child);
- totalPositiveFlexibility -= child->style()->flexboxWidthPositiveFlex();
+ Length childLogicalMaxWidth = isHorizontalWritingMode() ? child->style()->maxWidth() : child->style()->maxHeight();
+ if (!childLogicalMaxWidth.isUndefined() && childLogicalMaxWidth.isSpecified() && childPreferredSize > childLogicalMaxWidth.calcValue(flexboxAvailableLogicalWidth)) {
+ childPreferredSize = childLogicalMaxWidth.calcValue(flexboxAvailableLogicalWidth);
+ availableFreeSpace -= childPreferredSize - preferredLogicalContentWidthForFlexItem(child);
+ totalPositiveFlexibility -= logicalPositiveFlexForChild(child);
inflexibleItems.set(child, childPreferredSize);
return false;
}
} else if (availableFreeSpace < 0 && totalNegativeFlexibility > 0) {
- childPreferredSize += lroundf(availableFreeSpace * child->style()->flexboxWidthNegativeFlex() / totalNegativeFlexibility);
+ childPreferredSize += lroundf(availableFreeSpace * logicalNegativeFlexForChild(child) / totalNegativeFlexibility);
- Length childMinWidth = child->style()->minWidth();
- if (!childMinWidth.isUndefined() && childMinWidth.isSpecified() && childPreferredSize < childMinWidth.calcValue(flexboxAvailableLogicalWidth)) {
- childPreferredSize = childMinWidth.calcValue(flexboxAvailableLogicalWidth);
- availableFreeSpace += preferredFlexItemContentWidth(child) - childPreferredSize;
- totalNegativeFlexibility -= child->style()->flexboxWidthNegativeFlex();
+ Length childLogicalMinWidth = isHorizontalWritingMode() ? child->style()->minWidth() : child->style()->minHeight();
+ if (!childLogicalMinWidth.isUndefined() && childLogicalMinWidth.isSpecified() && childPreferredSize < childLogicalMinWidth.calcValue(flexboxAvailableLogicalWidth)) {
+ childPreferredSize = childLogicalMinWidth.calcValue(flexboxAvailableLogicalWidth);
+ availableFreeSpace += preferredLogicalContentWidthForFlexItem(child) - childPreferredSize;
+ totalNegativeFlexibility -= logicalNegativeFlexForChild(child);
inflexibleItems.set(child, childPreferredSize);
return false;
@@ -233,42 +278,56 @@
return availableFreeSpace > 0 && !totalPositiveFlexibility;
}
-void RenderFlexibleBox::layoutAndPlaceChildrenHorizontal(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)
+void RenderFlexibleBox::setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize)
{
+ // FIXME: Rename setOverrideWidth/setOverrideHeight to setOverrideLogicalWidth/setOverrideLogicalHeight.
+ if (isHorizontalWritingMode())
+ child->isHorizontalWritingMode() ? child->setOverrideWidth(childPreferredSize) : child->setOverrideHeight(childPreferredSize);
+ else
+ child->isHorizontalWritingMode() ? child->setOverrideHeight(childPreferredSize) : child->setOverrideWidth(childPreferredSize);
+}
+
+void RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)
+{
FlexibleBoxIterator iterator(this);
- // Now that we know the sizes, layout and position the flex items.
- LayoutUnit xOffset = borderLeft() + paddingLeft();
+ LayoutUnit startEdge = borderStart() + paddingStart();
if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility)) {
if (style()->flexPack() == PackEnd)
- xOffset += availableFreeSpace;
+ startEdge += availableFreeSpace;
else if (style()->flexPack() == PackCenter)
- xOffset += availableFreeSpace / 2;
+ startEdge += availableFreeSpace / 2;
}
- LayoutUnit yOffset = borderTop() + paddingTop();
- setHeight(0);
+ LayoutUnit logicalTop = borderBefore() + paddingBefore();
+ LayoutUnit totalAvailableLogicalWidth = availableLogicalWidth();
+ setLogicalHeight(0);
size_t i = 0;
for (RenderBox* child = iterator.first(); child; child = iterator.next(), ++i) {
- LayoutUnit childPreferredSize = child->borderLeft() + child->paddingLeft() + childSizes[i] + child->paddingRight() + child->borderRight();
- // FIXME: Handle vertical writing modes with horizontal flexing.
- child->setOverrideWidth(childPreferredSize);
+ // FIXME: Does this need to take the scrollbar width into account?
+ LayoutUnit childPreferredSize = childSizes[i] + logicalBorderWidthForChild(child) + logicalPaddingWidthForChild(child);
+ setLogicalOverrideSize(child, childPreferredSize);
child->setChildNeedsLayout(true);
child->layoutIfNeeded();
- setHeight(std::max(height(), borderTop() + paddingTop() + child->marginTop() + child->height() + child->marginBottom() + paddingBottom() + borderBottom() + horizontalScrollbarHeight()));
+ setLogicalHeight(std::max(logicalHeight(), borderBefore() + paddingBefore() + marginBeforeForChild(child) + logicalHeightForChild(child) + marginAfterForChild(child) + paddingAfter() + borderAfter() + scrollbarLogicalHeight()));
- if (child->style()->marginLeft().isAuto())
- child->setMarginLeft(availableFreeSpace > 0 ? lroundf(availableFreeSpace / totalPositiveFlexibility) : 0);
- if (child->style()->marginRight().isAuto())
- child->setMarginRight(availableFreeSpace > 0 ? lroundf(availableFreeSpace / totalPositiveFlexibility) : 0);
+ if (marginStartStyleForChild(child).isAuto())
+ setMarginStartForChild(child, availableFreeSpace > 0 ? lroundf(availableFreeSpace / totalPositiveFlexibility) : 0);
+ if (marginEndStyleForChild(child).isAuto())
+ setMarginEndForChild(child, availableFreeSpace > 0 ? lroundf(availableFreeSpace / totalPositiveFlexibility) : 0);
- xOffset += child->marginLeft();
- child->setLocation(IntPoint(xOffset, yOffset));
- xOffset += child->width() + child->marginRight();
+ startEdge += marginStartForChild(child);
+ LayoutUnit childLogicalWidth = logicalWidthForChild(child);
+ LayoutUnit logicalLeft = style()->isLeftToRightDirection() ? startEdge : totalAvailableLogicalWidth - startEdge - childLogicalWidth;
+ // FIXME: Do repaintDuringLayoutIfMoved.
+ // FIXME: Supporting layout deltas.
+ setLogicalLocationForChild(child, IntPoint(logicalLeft, logicalTop));
+ startEdge += childLogicalWidth + marginEndForChild(child);
+
if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility) && style()->flexPack() == PackJustify && childSizes.size() > 1)
- xOffset += availableFreeSpace / (childSizes.size() - 1);
+ startEdge += availableFreeSpace / (childSizes.size() - 1);
}
}
Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.h (95576 => 95577)
--- trunk/Source/WebCore/rendering/RenderFlexibleBox.h 2011-09-20 22:39:38 UTC (rev 95576)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h 2011-09-20 22:46:19 UTC (rev 95577)
@@ -52,11 +52,22 @@
class FlexibleBoxIterator;
typedef WTF::HashMap<const RenderBox*, LayoutUnit> InflexibleFlexItemSize;
- void layoutHorizontalBlock(bool relayoutChildren);
+ LayoutUnit logicalBorderWidthForChild(RenderBox* child);
+ LayoutUnit logicalPaddingWidthForChild(RenderBox* child);
+ LayoutUnit logicalScrollbarHeightForChild(RenderBox* child);
+ Length marginStartStyleForChild(RenderBox* child);
+ Length marginEndStyleForChild(RenderBox* child);
+ LayoutUnit preferredLogicalContentWidthForFlexItem(RenderBox* child);
- void computePreferredSizeHorizontal(bool relayoutChildren, FlexibleBoxIterator&, LayoutUnit&, float& totalPositiveFlexibility, float& totalNegativeFlexibility);
- bool runFreeSpaceAllocationAlgorithmHorizontal(LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes);
- void layoutAndPlaceChildrenHorizontal(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
+ void layoutInlineDirection(bool relayoutChildren);
+
+ 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 setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize);
+ void layoutAndPlaceChildrenInlineDirection(const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
};
} // namespace WebCore