Bug 1498273 Part 2: Change mHasMinViolation and mHasMaxViolation to also track clamp state after item freeze. r=dholbert
Depends on D8769
Differential Revision:
https://phabricator.services.mozilla.com/D9727
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -541,18 +541,39 @@ public:
AxisEdgeType aEdge,
const FlexboxAxisTracker& aAxisTracker,
bool aUseFirstLineBaseline) const;
float GetShareOfWeightSoFar() const { return mShareOfWeightSoFar; }
bool IsFrozen() const { return mIsFrozen; }
- bool HadMinViolation() const { return mHadMinViolation; }
- bool HadMaxViolation() const { return mHadMaxViolation; }
+ bool HadMinViolation() const
+ {
+ MOZ_ASSERT(!mIsFrozen, "min violation has no meaning for frozen items.");
+ return mHadMinViolation;
+ }
+
+ bool HadMaxViolation() const
+ {
+ MOZ_ASSERT(!mIsFrozen, "max violation has no meaning for frozen items.");
+ return mHadMaxViolation;
+ }
+
+ bool WasMinClamped() const
+ {
+ MOZ_ASSERT(mIsFrozen, "min clamping has no meaning for unfrozen items.");
+ return mHadMinViolation;
+ }
+
+ bool WasMaxClamped() const
+ {
+ MOZ_ASSERT(mIsFrozen, "max clamping has no meaning for unfrozen items.");
+ return mHadMaxViolation;
+ }
// Indicates whether this item received a preliminary "measuring" reflow
// before its actual reflow.
bool HadMeasuringReflow() const { return mHadMeasuringReflow; }
// Indicates whether this item's computed cross-size property is 'auto'.
bool IsCrossSizeAuto() const;
@@ -735,34 +756,67 @@ public:
void SetShareOfWeightSoFar(float aNewShare)
{
MOZ_ASSERT(!mIsFrozen || aNewShare == 0.0f,
"shouldn't be giving this item any share of the weight "
"after it's frozen");
mShareOfWeightSoFar = aNewShare;
}
- void Freeze() { mIsFrozen = true; }
+ void Freeze()
+ {
+ mIsFrozen = true;
+ // Now that we are frozen, the meaning of mHadMinViolation and
+ // mHadMaxViolation changes to indicate min and max clamping. Clear
+ // both of the member variables so that they are ready to be set
+ // as clamping state later, if necessary.
+ mHadMinViolation = false;
+ mHadMaxViolation = false;
+ }
void SetHadMinViolation()
{
MOZ_ASSERT(!mIsFrozen,
"shouldn't be changing main size & having violations "
"after we're frozen");
mHadMinViolation = true;
}
void SetHadMaxViolation()
{
MOZ_ASSERT(!mIsFrozen,
"shouldn't be changing main size & having violations "
"after we're frozen");
mHadMaxViolation = true;
}
void ClearViolationFlags()
- { mHadMinViolation = mHadMaxViolation = false; }
+ {
+ MOZ_ASSERT(!mIsFrozen,
+ "shouldn't be altering violation flags after we're "
+ "frozen");
+ mHadMinViolation = mHadMaxViolation = false;
+ }
+
+ void SetWasMinClamped()
+ {
+ MOZ_ASSERT(!mHadMinViolation && !mHadMaxViolation, "only clamp once");
+ // This reuses the mHadMinViolation member variable to track clamping
+ // events. This is allowable because mHadMinViolation only reflects
+ // a violation up until the item is frozen.
+ MOZ_ASSERT(mIsFrozen, "shouldn't set clamping state when we are unfrozen");
+ mHadMinViolation = true;
+ }
+ void SetWasMaxClamped()
+ {
+ MOZ_ASSERT(!mHadMinViolation && !mHadMaxViolation, "only clamp once");
+ // This reuses the mHadMaxViolation member variable to track clamping
+ // events. This is allowable because mHadMaxViolation only reflects
+ // a violation up until the item is frozen.
+ MOZ_ASSERT(mIsFrozen, "shouldn't set clamping state when we are unfrozen");
+ mHadMaxViolation = true;
+ }
// Setters for values that are determined after we've resolved our main size
// -------------------------------------------------------------------------
// Sets the main-axis position of our flex item's content-box.
// (This is the distance between the main-start edge of the flex container
// and the main-start edge of the flex item's content-box.)
void SetMainPosition(nscoord aPosn) {
@@ -2609,18 +2663,20 @@ FlexLine::FreezeOrRestoreEachFlexibleSiz
// assertion to be fatal except in documents with enormous lengths.
NS_ERROR("Final iteration still has unfrozen items, this shouldn't"
" happen unless there was nscoord under/overflow.");
item->Freeze();
mNumFrozenItems++;
} // else, we'll reset this item's main size to its flex base size on the
// next iteration of this algorithm.
- // Clear this item's violation(s), now that we've dealt with them
- item->ClearViolationFlags();
+ if (!item->IsFrozen()) {
+ // Clear this item's violation(s), now that we've dealt with them
+ item->ClearViolationFlags();
+ }
}
}
}
void
FlexLine::ResolveFlexibleLengths(nscoord aFlexContainerMainSize,
ComputedFlexLineInfo* aLineInfo)
{