Implement CSS `display: flow-root` (modern clearfix)
[WebKit-https.git] / Source / WebCore / rendering / style / StyleScrollSnapPoints.h
1 /*
2  * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(CSS_SCROLL_SNAP)
29
30 #include "LengthBox.h"
31 #include "LengthSize.h"
32 #include "RenderStyleConstants.h"
33 #include <wtf/RefCounted.h>
34 #include <wtf/Vector.h>
35
36 namespace WebCore {
37
38 struct ScrollSnapType {
39     ScrollSnapAxis axis { ScrollSnapAxis::Both };
40     ScrollSnapStrictness strictness { ScrollSnapStrictness::None };
41 };
42
43 inline bool operator==(const ScrollSnapType& a, const ScrollSnapType& b)
44 {
45     return a.axis == b.axis && a.strictness == b.strictness;
46 }
47
48 inline bool operator!=(const ScrollSnapType& a, const ScrollSnapType& b) { return !(a == b); }
49
50 class StyleScrollSnapPort : public RefCounted<StyleScrollSnapPort> {
51 public:
52     static Ref<StyleScrollSnapPort> create() { return adoptRef(*new StyleScrollSnapPort); }
53     Ref<StyleScrollSnapPort> copy() const;
54
55     ScrollSnapType type;
56     LengthBox scrollPadding { 0, 0, 0, 0 };
57
58 private:
59     StyleScrollSnapPort();
60     StyleScrollSnapPort(const StyleScrollSnapPort&);
61 };
62
63 inline bool operator==(const StyleScrollSnapPort& a, const StyleScrollSnapPort& b)
64 {
65     return a.type == b.type && a.scrollPadding == b.scrollPadding;
66 }
67
68 inline bool operator!=(const StyleScrollSnapPort& a, const StyleScrollSnapPort& b) { return !(a == b); }
69
70 struct ScrollSnapAlign {
71     ScrollSnapAxisAlignType x { ScrollSnapAxisAlignType::None };
72     ScrollSnapAxisAlignType y { ScrollSnapAxisAlignType::None };
73 };
74
75 inline bool operator==(const ScrollSnapAlign& a, const ScrollSnapAlign& b)
76 {
77     return a.x == b.x && a.y == b.y;
78 }
79
80 inline bool operator!=(const ScrollSnapAlign& a, const ScrollSnapAlign& b) { return !(a == b); }
81
82 class StyleScrollSnapArea : public RefCounted<StyleScrollSnapArea> {
83 public:
84     static Ref<StyleScrollSnapArea> create() { return adoptRef(*new StyleScrollSnapArea); }
85     Ref<StyleScrollSnapArea> copy() const;
86     bool hasSnapPosition() const { return alignment.x != ScrollSnapAxisAlignType::None || alignment.y != ScrollSnapAxisAlignType::None; }
87
88     ScrollSnapAlign alignment;
89     LengthBox scrollSnapMargin { 0, 0, 0, 0 };
90
91 private:
92     StyleScrollSnapArea();
93     StyleScrollSnapArea(const StyleScrollSnapArea&);
94 };
95
96 inline bool operator==(const StyleScrollSnapArea& a, const StyleScrollSnapArea& b)
97 {
98     return a.alignment == b.alignment && a.scrollSnapMargin == b.scrollSnapMargin;
99 }
100
101 inline bool operator!=(const StyleScrollSnapArea& a, const StyleScrollSnapArea& b) { return !(a == b); }
102
103 } // namespace WebCore
104
105 #endif // ENABLE(CSS_SCROLL_SNAP)