blob: 5c68b8bfad3c699d7cb66f8a696cb49a64786d64 [file] [log] [blame]
/*
* Copyright (C) 2011 Google Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "config.h"
#include "StyleGridData.h"
#include "RenderStyle.h"
namespace WebCore {
StyleGridData::StyleGridData()
: implicitNamedGridColumnLines(RenderStyle::initialNamedGridColumnLines())
, implicitNamedGridRowLines(RenderStyle::initialNamedGridRowLines())
, gridAutoFlow(RenderStyle::initialGridAutoFlow())
, gridAutoRows(RenderStyle::initialGridAutoRows())
, gridAutoColumns(RenderStyle::initialGridAutoColumns())
, namedGridArea(RenderStyle::initialNamedGridArea())
, namedGridAreaRowCount(RenderStyle::initialNamedGridAreaCount())
, namedGridAreaColumnCount(RenderStyle::initialNamedGridAreaCount())
, m_gridColumns(RenderStyle::initialGridColumns())
, m_gridRows(RenderStyle::initialGridRows())
, m_namedGridColumnLines(RenderStyle::initialNamedGridColumnLines())
, m_namedGridRowLines(RenderStyle::initialNamedGridRowLines())
, m_orderedNamedGridColumnLines(RenderStyle::initialOrderedNamedGridColumnLines())
, m_orderedNamedGridRowLines(RenderStyle::initialOrderedNamedGridRowLines())
, m_autoRepeatNamedGridColumnLines(RenderStyle::initialNamedGridColumnLines())
, m_autoRepeatNamedGridRowLines(RenderStyle::initialNamedGridRowLines())
, m_autoRepeatOrderedNamedGridColumnLines(RenderStyle::initialOrderedNamedGridColumnLines())
, m_autoRepeatOrderedNamedGridRowLines(RenderStyle::initialOrderedNamedGridRowLines())
, m_gridAutoRepeatColumns(RenderStyle::initialGridAutoRepeatTracks())
, m_gridAutoRepeatRows(RenderStyle::initialGridAutoRepeatTracks())
, m_autoRepeatColumnsInsertionPoint(RenderStyle::initialGridAutoRepeatInsertionPoint())
, m_autoRepeatRowsInsertionPoint(RenderStyle::initialGridAutoRepeatInsertionPoint())
, m_autoRepeatColumnsType(RenderStyle::initialGridAutoRepeatType())
, m_autoRepeatRowsType(RenderStyle::initialGridAutoRepeatType())
, m_subgridRows(false)
, m_subgridColumns(false)
{
}
inline StyleGridData::StyleGridData(const StyleGridData& o)
: RefCounted<StyleGridData>()
, implicitNamedGridColumnLines(o.implicitNamedGridColumnLines)
, implicitNamedGridRowLines(o.implicitNamedGridRowLines)
, gridAutoFlow(o.gridAutoFlow)
, gridAutoRows(o.gridAutoRows)
, gridAutoColumns(o.gridAutoColumns)
, namedGridArea(o.namedGridArea)
, namedGridAreaRowCount(o.namedGridAreaRowCount)
, namedGridAreaColumnCount(o.namedGridAreaColumnCount)
, m_columns(o.m_columns)
, m_rows(o.m_rows)
, m_gridColumns(o.m_gridColumns)
, m_gridRows(o.m_gridRows)
, m_namedGridColumnLines(o.m_namedGridColumnLines)
, m_namedGridRowLines(o.m_namedGridRowLines)
, m_orderedNamedGridColumnLines(o.m_orderedNamedGridColumnLines)
, m_orderedNamedGridRowLines(o.m_orderedNamedGridRowLines)
, m_autoRepeatNamedGridColumnLines(o.m_autoRepeatNamedGridColumnLines)
, m_autoRepeatNamedGridRowLines(o.m_autoRepeatNamedGridRowLines)
, m_autoRepeatOrderedNamedGridColumnLines(o.m_autoRepeatOrderedNamedGridColumnLines)
, m_autoRepeatOrderedNamedGridRowLines(o.m_autoRepeatOrderedNamedGridRowLines)
, m_gridAutoRepeatColumns(o.m_gridAutoRepeatColumns)
, m_gridAutoRepeatRows(o.m_gridAutoRepeatRows)
, m_autoRepeatColumnsInsertionPoint(o.m_autoRepeatColumnsInsertionPoint)
, m_autoRepeatRowsInsertionPoint(o.m_autoRepeatRowsInsertionPoint)
, m_autoRepeatColumnsType(o.m_autoRepeatColumnsType)
, m_autoRepeatRowsType(o.m_autoRepeatRowsType)
, m_subgridRows(o.m_subgridRows)
, m_subgridColumns(o.m_subgridColumns)
{
}
void StyleGridData::setRows(const GridTrackList& list)
{
m_rows = list;
computeCachedTrackData(m_rows, m_gridRows, m_namedGridRowLines, m_orderedNamedGridRowLines, m_gridAutoRepeatRows, m_autoRepeatNamedGridRowLines, m_autoRepeatOrderedNamedGridRowLines, m_autoRepeatRowsInsertionPoint, m_autoRepeatRowsType, m_subgridRows);
}
void StyleGridData::setColumns(const GridTrackList& list)
{
m_columns = list;
computeCachedTrackData(m_columns, m_gridColumns, m_namedGridColumnLines, m_orderedNamedGridColumnLines, m_gridAutoRepeatColumns, m_autoRepeatNamedGridColumnLines, m_autoRepeatOrderedNamedGridColumnLines, m_autoRepeatColumnsInsertionPoint, m_autoRepeatColumnsType, m_subgridColumns);
}
static void createGridLineNamesList(const Vector<String>& names, unsigned currentNamedGridLine, NamedGridLinesMap& namedGridLines, OrderedNamedGridLinesMap& orderedNamedGridLines)
{
auto orderedResult = orderedNamedGridLines.add(currentNamedGridLine, Vector<String>());
for (auto& name : names) {
auto result = namedGridLines.add(name, Vector<unsigned>());
result.iterator->value.append(currentNamedGridLine);
orderedResult.iterator->value.append(name);
}
}
void StyleGridData::computeCachedTrackData(const GridTrackList& list, Vector<GridTrackSize>& sizes, NamedGridLinesMap& namedLines, OrderedNamedGridLinesMap& orderedNamedLines, Vector<GridTrackSize>& autoRepeatSizes, NamedGridLinesMap& autoRepeatNamedLines, OrderedNamedGridLinesMap& autoRepeatOrderedNamedLines, unsigned& autoRepeatInsertionPoint, AutoRepeatType& autoRepeatType, bool& subgrid)
{
sizes.clear();
namedLines.clear();
orderedNamedLines.clear();
autoRepeatSizes.clear();
autoRepeatNamedLines.clear();
autoRepeatOrderedNamedLines.clear();
autoRepeatInsertionPoint = RenderStyle::initialGridAutoRepeatInsertionPoint();
autoRepeatType = RenderStyle::initialGridAutoRepeatType();
subgrid = false;
if (list.isEmpty())
return;
unsigned currentNamedGridLine = 0;
unsigned autoRepeatIndex = 0;
auto visitor = WTF::makeVisitor([&](const GridTrackSize& size) {
++currentNamedGridLine;
sizes.append(size);
}, [&](const Vector<String>& names) {
createGridLineNamesList(names, currentNamedGridLine, namedLines, orderedNamedLines);
// Subgrids only have line names defined, not track sizes, so we want our count
// to be the number of lines named rather than number of sized tracks.
if (subgrid)
currentNamedGridLine++;
}, [&](const GridTrackEntryRepeat& repeat) {
for (size_t i = 0; i < repeat.repeats; ++i) {
for (auto& repeatEntry : repeat.list) {
if (std::holds_alternative<Vector<String>>(repeatEntry)) {
createGridLineNamesList(std::get<Vector<String>>(repeatEntry), currentNamedGridLine, namedLines, orderedNamedLines);
// Subgrids only have line names defined, not track sizes, so we want our count
// to be the number of lines named rather than number of sized tracks.
if (subgrid)
currentNamedGridLine++;
} else {
++currentNamedGridLine;
sizes.append(std::get<GridTrackSize>(repeatEntry));
}
}
}
}, [&](const GridTrackEntryAutoRepeat& repeat) {
ASSERT(!autoRepeatIndex);
autoRepeatIndex = 0;
autoRepeatType = repeat.type;
for (auto& autoRepeatEntry : repeat.list) {
if (std::holds_alternative<Vector<String>>(autoRepeatEntry)) {
createGridLineNamesList(std::get<Vector<String>>(autoRepeatEntry), autoRepeatIndex, autoRepeatNamedLines, autoRepeatOrderedNamedLines);
if (subgrid)
++autoRepeatIndex;
continue;
}
++autoRepeatIndex;
autoRepeatSizes.append(std::get<GridTrackSize>(autoRepeatEntry));
}
autoRepeatInsertionPoint = currentNamedGridLine;
if (!subgrid)
currentNamedGridLine++;
}, [&](const GridTrackEntrySubgrid&) {
subgrid = true;
});
for (const auto& entry : list)
std::visit(visitor, entry);
// The parser should have rejected any <track-list> without any <track-size> as
// this is not conformant to the syntax.
ASSERT(!sizes.isEmpty() || !autoRepeatSizes.isEmpty() || subgrid);
}
WTF::TextStream& operator<<(WTF::TextStream& ts, const RepeatEntry& entry)
{
auto visitor = WTF::makeVisitor([&](const GridTrackSize& size) {
ts << size;
}, [&](const Vector<String>& names) {
ts << names;
});
std::visit(visitor, entry);
return ts;
}
WTF::TextStream& operator<<(WTF::TextStream& ts, const GridTrackEntry& entry)
{
auto visitor = WTF::makeVisitor([&](const GridTrackSize& size) {
ts << size;
}, [&](const Vector<String>& names) {
ts << names;
}, [&](const GridTrackEntryRepeat& repeat) {
ts << "repeat(" << repeat.repeats << ", " << repeat.list << ")";
}, [&](const GridTrackEntryAutoRepeat& repeat) {
ts << "repeat(" << repeat.type << ", " << repeat.list << ")";
}, [&](const GridTrackEntrySubgrid&) {
ts << "subgrid";
});
std::visit(visitor, entry);
return ts;
}
Ref<StyleGridData> StyleGridData::copy() const
{
return adoptRef(*new StyleGridData(*this));
}
} // namespace WebCore