1/*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2013, 2014 Igalia S.L.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 *     * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *     * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef GridTrackSize_h
33#define GridTrackSize_h
34
35#if ENABLE(CSS_GRID_LAYOUT)
36
37#include "GridLength.h"
38
39namespace WebCore {
40
41enum GridTrackSizeType {
42    LengthTrackSizing,
43    MinMaxTrackSizing
44};
45
46class GridTrackSize {
47public:
48    GridTrackSize(LengthType type = Undefined)
49        : m_type(LengthTrackSizing)
50        , m_minTrackBreadth(type)
51        , m_maxTrackBreadth(type)
52    {
53    }
54
55    const GridLength& length() const
56    {
57        ASSERT(m_type == LengthTrackSizing);
58        ASSERT(m_minTrackBreadth == m_maxTrackBreadth);
59        const GridLength& minTrackBreadth = m_minTrackBreadth;
60        ASSERT(!minTrackBreadth.isLength() || !minTrackBreadth.length().isUndefined());
61        return minTrackBreadth;
62    }
63
64    void setLength(const GridLength& length)
65    {
66        m_type = LengthTrackSizing;
67        m_minTrackBreadth = length;
68        m_maxTrackBreadth = length;
69    }
70
71    const GridLength& minTrackBreadth() const
72    {
73        ASSERT(!m_minTrackBreadth.isLength() || !m_minTrackBreadth.length().isUndefined());
74        if (m_minTrackBreadth.isLength() && m_minTrackBreadth.length().isAuto()) {
75            DEPRECATED_DEFINE_STATIC_LOCAL(GridLength, minContent, (MinContent));
76            return minContent;
77        }
78        return m_minTrackBreadth;
79    }
80
81    const GridLength& maxTrackBreadth() const
82    {
83        ASSERT(!m_maxTrackBreadth.isLength() || !m_maxTrackBreadth.length().isUndefined());
84        if (m_maxTrackBreadth.isLength() && m_maxTrackBreadth.length().isAuto()) {
85            DEPRECATED_DEFINE_STATIC_LOCAL(GridLength, maxContent, (MaxContent));
86            return maxContent;
87        }
88        return m_maxTrackBreadth;
89    }
90
91    void setMinMax(const GridLength& minTrackBreadth, const GridLength& maxTrackBreadth)
92    {
93        m_type = MinMaxTrackSizing;
94        m_minTrackBreadth = minTrackBreadth;
95        m_maxTrackBreadth = maxTrackBreadth;
96    }
97
98    GridTrackSizeType type() const { return m_type; }
99
100    bool isContentSized() const { return m_minTrackBreadth.isContentSized() || m_maxTrackBreadth.isContentSized(); }
101
102    bool isPercentage() const { return m_type == LengthTrackSizing && length().isLength() && length().length().isPercent(); }
103
104    bool operator==(const GridTrackSize& other) const
105    {
106        return m_type == other.m_type && m_minTrackBreadth == other.m_minTrackBreadth && m_maxTrackBreadth == other.m_maxTrackBreadth;
107    }
108
109    bool hasMinOrMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && (minTrackBreadth().length().isMinContent() || minTrackBreadth().length().isMaxContent()); }
110    bool hasMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && minTrackBreadth().length().isMaxContent(); }
111    bool hasMinOrMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && (maxTrackBreadth().length().isMinContent() || maxTrackBreadth().length().isMaxContent()); }
112    bool hasMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent(); }
113
114private:
115    GridTrackSizeType m_type;
116    GridLength m_minTrackBreadth;
117    GridLength m_maxTrackBreadth;
118};
119
120} // namespace WebCore
121
122#endif /* ENABLE(CSS_GRID_LAYOUT) */
123
124#endif // GridTrackSize_h
125