Bug 1269046 part 6: Add a flags enum-class to customize FlexboxAxisTracker behavior. r=mats
Right now, there's only one flag in this new class (with no usages until a
later patch). This flag suppresses a hack, which otherwise makes us
transparently reverse the child list & flex axes in some circumstances, to
prevent bottom-to-top child ordering. (We don't want that hack when we're
dealing with individual abspos children, since it only makes things more
complicated.)
MozReview-Commit-ID: HYUf0vjlfiJ
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -231,21 +231,34 @@ PhysicalCoordFromFlexRelativeCoord(nscoo
#define GET_MAIN_COMPONENT_LOGICAL(axisTracker_, wm_, isize_, bsize_) \
wm_.IsOrthogonalTo(axisTracker_.GetWritingMode()) != \
(axisTracker_).IsRowOriented() ? (isize_) : (bsize_)
#define GET_CROSS_COMPONENT_LOGICAL(axisTracker_, wm_, isize_, bsize_) \
wm_.IsOrthogonalTo(axisTracker_.GetWritingMode()) != \
(axisTracker_).IsRowOriented() ? (bsize_) : (isize_)
+// Flags to customize behavior of the FlexboxAxisTracker constructor:
+enum AxisTrackerFlags {
+ eNoFlags = 0x0,
+
+ // Normally, FlexboxAxisTracker may attempt to reverse axes & iteration order
+ // to avoid bottom-to-top child ordering, for saner pagination. This flag
+ // suppresses that behavior (so that we allow bottom-to-top child ordering).
+ // (This may be helpful e.g. when we're only dealing with a single child.)
+ eAllowBottomToTopChildOrdering = 0x1
+};
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(AxisTrackerFlags)
+
// Encapsulates our flex container's main & cross axes.
class MOZ_STACK_CLASS nsFlexContainerFrame::FlexboxAxisTracker {
public:
FlexboxAxisTracker(const nsFlexContainerFrame* aFlexContainer,
- const WritingMode& aWM);
+ const WritingMode& aWM,
+ AxisTrackerFlags aFlags = eNoFlags);
// Accessors:
// XXXdholbert [BEGIN DEPRECATED]
AxisOrientationType GetMainAxis() const { return mMainAxis; }
AxisOrientationType GetCrossAxis() const { return mCrossAxis; }
bool IsMainAxisHorizontal() const {
// If we're row-oriented, and our writing mode is NOT vertical,
@@ -3235,33 +3248,37 @@ BlockDirToAxisOrientation(WritingMode::B
}
MOZ_ASSERT_UNREACHABLE("Unhandled BlockDir");
return eAxis_TB; // in case of unforseen error, assume English TTB block-flow
}
FlexboxAxisTracker::FlexboxAxisTracker(
const nsFlexContainerFrame* aFlexContainer,
- const WritingMode& aWM)
+ const WritingMode& aWM,
+ AxisTrackerFlags aFlags)
: mWM(aWM),
mAreAxesInternallyReversed(false)
{
if (IsLegacyBox(aFlexContainer)) {
InitAxesFromLegacyProps(aFlexContainer);
} else {
InitAxesFromModernProps(aFlexContainer);
}
// Master switch to enable/disable bug 983427's code for reversing our axes
// and reversing some logic, to avoid reflowing children in bottom-to-top
// order. (This switch can be removed eventually, but for now, it allows
// this special-case code path to be compared against the normal code path.)
static bool sPreventBottomToTopChildOrdering = true;
- if (sPreventBottomToTopChildOrdering) {
+ // Note: if the eAllowBottomToTopChildOrdering flag is set, that overrides
+ // the static boolean and makes us skip this special case.
+ if (!(aFlags & AxisTrackerFlags::eAllowBottomToTopChildOrdering) &&
+ sPreventBottomToTopChildOrdering) {
// If either axis is bottom-to-top, we flip both axes (and set a flag
// so that we can flip some logic to make the reversal transparent).
if (eAxis_BT == mMainAxis || eAxis_BT == mCrossAxis) {
mMainAxis = GetReverseAxis(mMainAxis);
mCrossAxis = GetReverseAxis(mCrossAxis);
mAreAxesInternallyReversed = true;
mIsMainAxisReversed = !mIsMainAxisReversed;
mIsCrossAxisReversed = !mIsCrossAxisReversed;