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:
Brad Werth 2018-10-24 23:47:23 +00:00
Родитель 2eb1938e51
Коммит 1600580027
3 изменённых файлов: 43 добавлений и 3 удалений

Просмотреть файл

@ -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