Bug 1174003 part 3: [css-flexbox] Make GetMarginSizeInMainAxis() take a LogicalMargin, instead of nsMargin. r?mats draft
authorDaniel Holbert <dholbert@cs.stanford.edu>
Tue, 27 Feb 2018 15:40:10 -0800
changeset 760681 aa3b6f2846bf1446566595e26be9934cadaf7cbc
parent 760660 5b30f58d1ea3914eb61ab3ac7319f669f7730f6b
child 760682 ebdefc1a94f6df0ee048de330e9477fc5264eb8d
push id100718
push userdholbert@mozilla.com
push dateTue, 27 Feb 2018 23:41:18 +0000
reviewersmats
bugs1174003
milestone60.0a1
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
layout/generic/nsFlexContainerFrame.cpp
--- 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.)