mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 23:02:20 +00:00
Bug 1240795 - [css-grid] Refactor GetComputedTemplateColumns/Rows to return a self-contained value. r=dholbert
This commit is contained in:
parent
a87d11f3e7
commit
4256cf9ea7
@ -3341,14 +3341,21 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext,
|
||||
for (const TrackSize& sz : gridReflowState.mCols.mSizes) {
|
||||
colTrackSizes.AppendElement(sz.mBase);
|
||||
}
|
||||
Properties().Set(GridColTrackSizes(),
|
||||
new nsTArray<nscoord>(mozilla::Move(colTrackSizes)));
|
||||
ComputedGridTrackInfo* colInfo = new ComputedGridTrackInfo(
|
||||
gridReflowState.mColFunctions.mExplicitGridOffset,
|
||||
gridReflowState.mColFunctions.NumExplicitTracks(),
|
||||
Move(colTrackSizes));
|
||||
Properties().Set(GridColTrackInfo(), colInfo);
|
||||
|
||||
nsTArray<nscoord> rowTrackSizes(gridReflowState.mRows.mSizes.Length());
|
||||
for (const TrackSize& sz : gridReflowState.mRows.mSizes) {
|
||||
rowTrackSizes.AppendElement(sz.mBase);
|
||||
}
|
||||
Properties().Set(GridRowTrackSizes(),
|
||||
new nsTArray<nscoord>(mozilla::Move(rowTrackSizes)));
|
||||
ComputedGridTrackInfo* rowInfo = new ComputedGridTrackInfo(
|
||||
gridReflowState.mRowFunctions.mExplicitGridOffset,
|
||||
gridReflowState.mRowFunctions.NumExplicitTracks(),
|
||||
Move(rowTrackSizes));
|
||||
Properties().Set(GridRowTrackInfo(), rowInfo);
|
||||
|
||||
nscoord bSize = 0;
|
||||
if (computedBSize == NS_AUTOHEIGHT) {
|
||||
|
@ -21,6 +21,25 @@
|
||||
nsContainerFrame* NS_NewGridContainerFrame(nsIPresShell* aPresShell,
|
||||
nsStyleContext* aContext);
|
||||
|
||||
namespace mozilla {
|
||||
/**
|
||||
* The number of implicit / explicit tracks and their sizes.
|
||||
*/
|
||||
struct ComputedGridTrackInfo
|
||||
{
|
||||
ComputedGridTrackInfo(uint32_t aNumLeadingImplicitTracks,
|
||||
uint32_t aNumExplicitTracks,
|
||||
nsTArray<nscoord>&& aSizes)
|
||||
: mNumLeadingImplicitTracks(aNumLeadingImplicitTracks)
|
||||
, mNumExplicitTracks(aNumExplicitTracks)
|
||||
, mSizes(aSizes)
|
||||
{}
|
||||
uint32_t mNumLeadingImplicitTracks;
|
||||
uint32_t mNumExplicitTracks;
|
||||
nsTArray<nscoord> mSizes;
|
||||
};
|
||||
} // namespace mozilla
|
||||
|
||||
class nsGridContainerFrame final : public nsContainerFrame
|
||||
{
|
||||
public:
|
||||
@ -88,32 +107,18 @@ public:
|
||||
|
||||
NS_DECLARE_FRAME_PROPERTY(GridItemContainingBlockRect, DeleteValue<nsRect>)
|
||||
|
||||
NS_DECLARE_FRAME_PROPERTY(GridColTrackSizes, DeleteValue<nsTArray<nscoord>>)
|
||||
|
||||
const nsTArray<nscoord>* GetComputedTemplateColumns()
|
||||
NS_DECLARE_FRAME_PROPERTY(GridColTrackInfo, DeleteValue<ComputedGridTrackInfo>)
|
||||
const ComputedGridTrackInfo* GetComputedTemplateColumns()
|
||||
{
|
||||
return static_cast<nsTArray<nscoord>*>(Properties().Get(GridColTrackSizes()));
|
||||
return static_cast<ComputedGridTrackInfo*>(Properties().Get(GridColTrackInfo()));
|
||||
}
|
||||
|
||||
NS_DECLARE_FRAME_PROPERTY(GridRowTrackSizes, DeleteValue<nsTArray<nscoord>>)
|
||||
|
||||
const nsTArray<nscoord>* GetComputedTemplateRows()
|
||||
NS_DECLARE_FRAME_PROPERTY(GridRowTrackInfo, DeleteValue<ComputedGridTrackInfo>)
|
||||
const ComputedGridTrackInfo* GetComputedTemplateRows()
|
||||
{
|
||||
return static_cast<nsTArray<nscoord>*>(Properties().Get(GridRowTrackSizes()));
|
||||
return static_cast<ComputedGridTrackInfo*>(Properties().Get(GridRowTrackInfo()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of implicit tracks that comes before the explicit grid.
|
||||
*/
|
||||
uint32_t NumImplicitLeadingCols() const { return mExplicitGridOffsetCol; }
|
||||
uint32_t NumImplicitLeadingRows() const { return mExplicitGridOffsetRow; }
|
||||
|
||||
/**
|
||||
* Return the number of explicit tracks.
|
||||
*/
|
||||
uint32_t NumExplicitCols() const { return mExplicitGridColEnd - 1; }
|
||||
uint32_t NumExplicitRows() const { return mExplicitGridRowEnd - 1; }
|
||||
|
||||
protected:
|
||||
static const uint32_t kAutoLine;
|
||||
// The maximum line number, in the zero-based translated grid.
|
||||
|
@ -2449,10 +2449,9 @@ nsComputedDOMStyle::GetGridTrackSize(const nsStyleCoord& aMinValue,
|
||||
}
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::GetGridTemplateColumnsRows(const nsStyleGridTemplate& aTrackList,
|
||||
const uint32_t aNumLeadingImplicitTracks,
|
||||
const uint32_t aNumExplicitTracks,
|
||||
const nsTArray<nscoord>* aTrackSizes)
|
||||
nsComputedDOMStyle::GetGridTemplateColumnsRows(
|
||||
const nsStyleGridTemplate& aTrackList,
|
||||
const ComputedGridTrackInfo* aTrackInfo)
|
||||
{
|
||||
if (aTrackList.mIsSubgrid) {
|
||||
// XXX TODO: add support for repeat(auto-fill) for 'subgrid' (bug 1234311)
|
||||
@ -2491,17 +2490,18 @@ nsComputedDOMStyle::GetGridTemplateColumnsRows(const nsStyleGridTemplate& aTrack
|
||||
uint32_t numSizes = aTrackList.mMinTrackSizingFunctions.Length();
|
||||
MOZ_ASSERT(aTrackList.mMaxTrackSizingFunctions.Length() == numSizes,
|
||||
"Different number of min and max track sizing functions");
|
||||
if (aTrackSizes) {
|
||||
if (aTrackInfo) {
|
||||
DebugOnly<bool> isAutoFill =
|
||||
aTrackList.HasRepeatAuto() && aTrackList.mIsAutoFill;
|
||||
DebugOnly<bool> isAutoFit =
|
||||
aTrackList.HasRepeatAuto() && !aTrackList.mIsAutoFill;
|
||||
MOZ_ASSERT(aNumExplicitTracks == numSizes ||
|
||||
(isAutoFill && aNumExplicitTracks >= numSizes) ||
|
||||
(isAutoFit && aNumExplicitTracks + 1 >= numSizes),
|
||||
DebugOnly<uint32_t> numExplicitTracks = aTrackInfo->mNumExplicitTracks;
|
||||
MOZ_ASSERT(numExplicitTracks == numSizes ||
|
||||
(isAutoFill && numExplicitTracks >= numSizes) ||
|
||||
(isAutoFit && numExplicitTracks + 1 >= numSizes),
|
||||
"expected all explicit tracks (or possibly one less, if there's "
|
||||
"an 'auto-fit' track, since that can collapse away)");
|
||||
numSizes = aTrackSizes->Length();
|
||||
numSizes = aTrackInfo->mSizes.Length();
|
||||
}
|
||||
|
||||
// An empty <track-list> is represented as "none" in syntax.
|
||||
@ -2512,29 +2512,32 @@ nsComputedDOMStyle::GetGridTemplateColumnsRows(const nsStyleGridTemplate& aTrack
|
||||
}
|
||||
|
||||
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
|
||||
if (aTrackSizes) {
|
||||
if (aTrackInfo) {
|
||||
// We've done layout on the grid and have resolved the sizes of its tracks,
|
||||
// so we'll return those sizes here. The grid spec says we MAY use
|
||||
// repeat(<positive-integer>, Npx) here for consecutive tracks with the same
|
||||
// size, but that doesn't seem worth doing since even for repeat(auto-*)
|
||||
// the resolved size might differ for the repeated tracks.
|
||||
const nsTArray<nscoord>& trackSizes = aTrackInfo->mSizes;
|
||||
const uint32_t numExplicitTracks = aTrackInfo->mNumExplicitTracks;
|
||||
const uint32_t numLeadingImplicitTracks = aTrackInfo->mNumLeadingImplicitTracks;
|
||||
MOZ_ASSERT(numSizes > 0 &&
|
||||
numSizes >= aNumLeadingImplicitTracks + aNumExplicitTracks);
|
||||
numSizes >= numLeadingImplicitTracks + numExplicitTracks);
|
||||
|
||||
// Add any leading implicit tracks.
|
||||
for (uint32_t i = 0; i < aNumLeadingImplicitTracks; ++i) {
|
||||
for (uint32_t i = 0; i < numLeadingImplicitTracks; ++i) {
|
||||
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
|
||||
val->SetAppUnits((*aTrackSizes)[i]);
|
||||
val->SetAppUnits(trackSizes[i]);
|
||||
valueList->AppendCSSValue(val.forget());
|
||||
}
|
||||
|
||||
// Then add any explicit tracks.
|
||||
if (aNumExplicitTracks) {
|
||||
if (numExplicitTracks) {
|
||||
int32_t endOfRepeat = 0; // first index after any repeat() tracks
|
||||
int32_t offsetToLastRepeat = 0;
|
||||
if (aTrackList.HasRepeatAuto()) {
|
||||
// offsetToLastRepeat is -1 if all repeat(auto-fit) tracks are empty
|
||||
offsetToLastRepeat = aNumExplicitTracks + 1 - aTrackList.mLineNameLists.Length();
|
||||
offsetToLastRepeat = numExplicitTracks + 1 - aTrackList.mLineNameLists.Length();
|
||||
endOfRepeat = aTrackList.mRepeatAutoIndex + offsetToLastRepeat + 1;
|
||||
}
|
||||
for (int32_t i = 0;; i++) {
|
||||
@ -2569,20 +2572,20 @@ nsComputedDOMStyle::GetGridTemplateColumnsRows(const nsStyleGridTemplate& aTrack
|
||||
const nsTArray<nsString>& lineNames = aTrackList.mLineNameLists[i];
|
||||
AppendGridLineNames(valueList, lineNames);
|
||||
}
|
||||
if (uint32_t(i) == aNumExplicitTracks) {
|
||||
if (uint32_t(i) == numExplicitTracks) {
|
||||
break;
|
||||
}
|
||||
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
|
||||
val->SetAppUnits((*aTrackSizes)[i + aNumLeadingImplicitTracks]);
|
||||
val->SetAppUnits(trackSizes[i + numLeadingImplicitTracks]);
|
||||
valueList->AppendCSSValue(val.forget());
|
||||
}
|
||||
}
|
||||
|
||||
// Add any trailing implicit tracks.
|
||||
for (uint32_t i = aNumLeadingImplicitTracks + aNumExplicitTracks;
|
||||
for (uint32_t i = numLeadingImplicitTracks + numExplicitTracks;
|
||||
i < numSizes; ++i) {
|
||||
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
|
||||
val->SetAppUnits((*aTrackSizes)[i]);
|
||||
val->SetAppUnits(trackSizes[i]);
|
||||
valueList->AppendCSSValue(val.forget());
|
||||
}
|
||||
} else {
|
||||
@ -2656,45 +2659,31 @@ nsComputedDOMStyle::DoGetGridAutoRows()
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetGridTemplateColumns()
|
||||
{
|
||||
const nsTArray<nscoord>* trackSizes = nullptr;
|
||||
uint32_t numLeadingImplicitTracks = 0;
|
||||
uint32_t numExplicitTracks = 0;
|
||||
const ComputedGridTrackInfo* info = nullptr;
|
||||
if (mInnerFrame) {
|
||||
nsIFrame* gridContainerCandidate = mInnerFrame->GetContentInsertionFrame();
|
||||
if (gridContainerCandidate &&
|
||||
gridContainerCandidate->GetType() == nsGkAtoms::gridContainerFrame) {
|
||||
auto gridContainer = static_cast<nsGridContainerFrame*>(gridContainerCandidate);
|
||||
trackSizes = gridContainer->GetComputedTemplateColumns();
|
||||
numLeadingImplicitTracks = gridContainer->NumImplicitLeadingCols();
|
||||
numExplicitTracks = gridContainer->NumExplicitCols();
|
||||
info = static_cast<nsGridContainerFrame*>(gridContainerCandidate)->
|
||||
GetComputedTemplateColumns();
|
||||
}
|
||||
}
|
||||
return GetGridTemplateColumnsRows(StylePosition()->mGridTemplateColumns,
|
||||
numLeadingImplicitTracks,
|
||||
numExplicitTracks,
|
||||
trackSizes);
|
||||
return GetGridTemplateColumnsRows(StylePosition()->mGridTemplateColumns, info);
|
||||
}
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetGridTemplateRows()
|
||||
{
|
||||
const nsTArray<nscoord>* trackSizes = nullptr;
|
||||
uint32_t numLeadingImplicitTracks = 0;
|
||||
uint32_t numExplicitTracks = 0;
|
||||
const ComputedGridTrackInfo* info = nullptr;
|
||||
if (mInnerFrame) {
|
||||
nsIFrame* gridContainerCandidate = mInnerFrame->GetContentInsertionFrame();
|
||||
if (gridContainerCandidate &&
|
||||
gridContainerCandidate->GetType() == nsGkAtoms::gridContainerFrame) {
|
||||
auto gridContainer = static_cast<nsGridContainerFrame*>(gridContainerCandidate);
|
||||
trackSizes = gridContainer->GetComputedTemplateRows();
|
||||
numLeadingImplicitTracks = gridContainer->NumImplicitLeadingRows();
|
||||
numExplicitTracks = gridContainer->NumExplicitRows();
|
||||
info = static_cast<nsGridContainerFrame*>(gridContainerCandidate)->
|
||||
GetComputedTemplateRows();
|
||||
}
|
||||
}
|
||||
return GetGridTemplateColumnsRows(StylePosition()->mGridTemplateRows,
|
||||
numLeadingImplicitTracks,
|
||||
numExplicitTracks,
|
||||
trackSizes);
|
||||
return GetGridTemplateColumnsRows(StylePosition()->mGridTemplateRows, info);
|
||||
}
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
|
@ -27,6 +27,7 @@ namespace mozilla {
|
||||
namespace dom {
|
||||
class Element;
|
||||
} // namespace dom
|
||||
struct ComputedGridTrackInfo;
|
||||
} // namespace mozilla
|
||||
|
||||
struct nsComputedStyleMap;
|
||||
@ -192,9 +193,7 @@ private:
|
||||
const nsStyleCoord& aMaxSize);
|
||||
already_AddRefed<CSSValue> GetGridTemplateColumnsRows(
|
||||
const nsStyleGridTemplate& aTrackList,
|
||||
const uint32_t aNumLeadingImplicitTracks,
|
||||
const uint32_t aNumExplicitTracks,
|
||||
const nsTArray<nscoord>* aTrackSizes);
|
||||
const mozilla::ComputedGridTrackInfo* aTrackInfo);
|
||||
already_AddRefed<CSSValue> GetGridLine(const nsStyleGridLine& aGridLine);
|
||||
|
||||
bool GetLineHeightCoord(nscoord& aCoord);
|
||||
|
Loading…
Reference in New Issue
Block a user