зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1498273 Part 3: Define and set ComputedFlexItemInfo::mClampState. r=dholbert
Depends on D9727 Differential Revision: https://phabricator.services.mozilla.com/D9728 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
2eb1938e51
Коммит
1600580027
|
@ -61,7 +61,7 @@ FlexItemValues::FlexItemValues(FlexLineValues* aParent,
|
|||
aItem->mCrossMinSize);
|
||||
mCrossMaxSize = ToPossiblyUnconstrainedPixels(aItem->mCrossMaxSize);
|
||||
|
||||
mClampState = FlexItemClampState::Unclamped;
|
||||
mClampState = aItem->mClampState;
|
||||
}
|
||||
|
||||
JSObject*
|
||||
|
|
|
@ -1457,6 +1457,11 @@ nsFlexContainerFrame::GenerateFlexItemForChild(
|
|||
// valid size, so we freeze to keep ourselves from flexing.
|
||||
if (isFixedSizeWidget || (flexGrow == 0.0f && flexShrink == 0.0f)) {
|
||||
item->Freeze();
|
||||
if (flexBaseSize < mainMinSize) {
|
||||
item->SetWasMinClamped();
|
||||
} else if (flexBaseSize > mainMaxSize) {
|
||||
item->SetWasMaxClamped();
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve "flex-basis:auto" and/or "min-[width|height]:auto" (which might
|
||||
|
@ -2608,6 +2613,11 @@ FlexLine::FreezeItemsEarly(bool aIsUsingFlexGrow,
|
|||
if (shouldFreeze) {
|
||||
// Freeze item! (at its hypothetical main size)
|
||||
item->Freeze();
|
||||
if (item->GetFlexBaseSize() < item->GetMainSize()) {
|
||||
item->SetWasMinClamped();
|
||||
} else if (item->GetFlexBaseSize() > item->GetMainSize()) {
|
||||
item->SetWasMaxClamped();
|
||||
}
|
||||
mNumFrozenItems++;
|
||||
}
|
||||
}
|
||||
|
@ -2647,9 +2657,11 @@ FlexLine::FreezeOrRestoreEachFlexibleSize(const nscoord aTotalViolation,
|
|||
MOZ_ASSERT(!item->HadMinViolation() || !item->HadMaxViolation(),
|
||||
"Can have either min or max violation, but not both");
|
||||
|
||||
bool hadMinViolation = item->HadMinViolation();
|
||||
bool hadMaxViolation = item->HadMaxViolation();
|
||||
if (eFreezeEverything == freezeType ||
|
||||
(eFreezeMinViolations == freezeType && item->HadMinViolation()) ||
|
||||
(eFreezeMaxViolations == freezeType && item->HadMaxViolation())) {
|
||||
(eFreezeMinViolations == freezeType && hadMinViolation) ||
|
||||
(eFreezeMaxViolations == freezeType && hadMaxViolation)) {
|
||||
|
||||
MOZ_ASSERT(item->GetMainSize() >= item->GetMainMinSize(),
|
||||
"Freezing item at a size below its minimum");
|
||||
|
@ -2657,6 +2669,11 @@ FlexLine::FreezeOrRestoreEachFlexibleSize(const nscoord aTotalViolation,
|
|||
"Freezing item at a size above its maximum");
|
||||
|
||||
item->Freeze();
|
||||
if (hadMinViolation) {
|
||||
item->SetWasMinClamped();
|
||||
} else if (hadMaxViolation) {
|
||||
item->SetWasMaxClamped();
|
||||
}
|
||||
mNumFrozenItems++;
|
||||
} else if (MOZ_UNLIKELY(aIsFinalIteration)) {
|
||||
// XXXdholbert If & when bug 765861 is fixed, we should upgrade this
|
||||
|
@ -4867,6 +4884,28 @@ nsFlexContainerFrame::DoFlexLayout(nsPresContext* aPresContext,
|
|||
line->ResolveFlexibleLengths(aContentBoxMainSize, lineInfo);
|
||||
}
|
||||
|
||||
// If needed, capture the final clamp state from all the items.
|
||||
if (containerInfo) {
|
||||
uint32_t lineIndex = 0;
|
||||
for (const FlexLine* line = lines.getFirst(); line;
|
||||
line = line->getNext(), ++lineIndex) {
|
||||
ComputedFlexLineInfo* lineInfo = &containerInfo->mLines[lineIndex];
|
||||
|
||||
uint32_t itemIndex = 0;
|
||||
for (const FlexItem* item = line->GetFirstItem(); item;
|
||||
item = item->getNext(), ++itemIndex) {
|
||||
ComputedFlexItemInfo* itemInfo = &lineInfo->mItems[itemIndex];
|
||||
|
||||
itemInfo->mClampState =
|
||||
item->WasMinClamped() ?
|
||||
mozilla::dom::FlexItemClampState::Clamped_to_min :
|
||||
(item->WasMaxClamped() ?
|
||||
mozilla::dom::FlexItemClampState::Clamped_to_max :
|
||||
mozilla::dom::FlexItemClampState::Unclamped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cross Size Determination - Flexbox spec section 9.4
|
||||
// ===================================================
|
||||
// Calculate the hypothetical cross size of each item:
|
||||
|
|
|
@ -54,6 +54,7 @@ struct ComputedFlexItemInfo
|
|||
nscoord mMainMaxSize;
|
||||
nscoord mCrossMinSize;
|
||||
nscoord mCrossMaxSize;
|
||||
mozilla::dom::FlexItemClampState mClampState;
|
||||
};
|
||||
|
||||
struct ComputedFlexLineInfo
|
||||
|
|
Загрузка…
Ссылка в новой задаче