Bug 1174003 part 3: [css-flexbox] Make GetMarginSizeInMainAxis() take a LogicalMargin, instead of nsMargin. r?mats
This patch doesn't change behavior. It just makes us use logical axes/types instead of physical ones for this particular API and its caller.
MozReview-Commit-ID: Jt6SECGI9EU
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -338,25 +338,28 @@ public:
nscoord GetCrossComponent(const nsSize& aSize) const {
return GET_CROSS_COMPONENT(*this, aSize.width, aSize.height);
}
int32_t GetCrossComponent(const LayoutDeviceIntSize& aIntSize) const {
return GET_CROSS_COMPONENT(*this, aIntSize.width, aIntSize.height);
}
- nscoord GetMarginSizeInMainAxis(const nsMargin& aMargin) const {
- return IsMainAxisHorizontal() ?
- aMargin.LeftRight() :
- aMargin.TopBottom();
- }
- nscoord GetMarginSizeInCrossAxis(const nsMargin& aMargin) const {
- return IsCrossAxisHorizontal() ?
- aMargin.LeftRight() :
- aMargin.TopBottom();
+ // NOTE: aMargin is expected to use the flex container's WritingMode.
+ nscoord GetMarginSizeInMainAxis(const LogicalMargin& aMargin) const {
+ // If we're row-oriented, our main axis is the inline axis.
+ return IsRowOriented()
+ ? aMargin.IStartEnd(mWM)
+ : aMargin.BStartEnd(mWM);
+ }
+ nscoord GetMarginSizeInCrossAxis(const LogicalMargin& aMargin) const {
+ // If we're row-oriented, our cross axis is the block axis.
+ return IsRowOriented()
+ ? aMargin.BStartEnd(mWM)
+ : aMargin.IStartEnd(mWM);
}
// Returns aFrame's computed value for 'height' or 'width' -- whichever is in
// the cross-axis. (NOTE: This is cross-axis-specific for now. If we need a
// main-axis version as well, we could generalize or clone this function.)
const nsStyleCoord& ComputedCrossSize(const nsIFrame* aFrame) const {
const nsStylePosition* stylePos = aFrame->StylePosition();
@@ -1279,19 +1282,21 @@ nsFlexContainerFrame::GenerateFlexItemFo
aPresContext->DevPixelsToAppUnits(
aAxisTracker.GetMainComponent(widgetMinSize));
nscoord widgetCrossMinSize =
aPresContext->DevPixelsToAppUnits(
aAxisTracker.GetCrossComponent(widgetMinSize));
// GetMinimumWidgetSize() returns border-box. We need content-box, so
// subtract borderPadding.
- nsMargin& bp = childRI.ComputedPhysicalBorderPadding();
- widgetMainMinSize -= aAxisTracker.GetMarginSizeInMainAxis(bp);
- widgetCrossMinSize -= aAxisTracker.GetMarginSizeInCrossAxis(bp);
+ const LogicalMargin bpInChildWM = childRI.ComputedLogicalBorderPadding();
+ const LogicalMargin bpInFlexWM =
+ bpInChildWM.ConvertTo(aAxisTracker.GetWritingMode(), childWM);
+ widgetMainMinSize -= aAxisTracker.GetMarginSizeInMainAxis(bpInFlexWM);
+ widgetCrossMinSize -= aAxisTracker.GetMarginSizeInCrossAxis(bpInFlexWM);
// ... (but don't let that push these min sizes below 0).
widgetMainMinSize = std::max(0, widgetMainMinSize);
widgetCrossMinSize = std::max(0, widgetCrossMinSize);
if (!canOverride) {
// Fixed-size widget: freeze our main-size at the widget's mandated size.
// (Set min and max main-sizes to that size, too, to keep us from
// clamping to any other size later on.)