Combine event and touch action regions into a single class
[WebKit-https.git] / Source / WebCore / rendering / EventRegion.h
1 /*
2  * Copyright (C) 2019 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 #include "Region.h"
29 #include "TouchAction.h"
30 #include <wtf/OptionSet.h>
31 #include <wtf/Vector.h>
32
33 namespace WebCore {
34
35 class RenderStyle;
36
37 class EventRegion {
38 public:
39     WEBCORE_EXPORT EventRegion();
40
41     bool isEmpty() const { return m_region.isEmpty(); }
42
43     WEBCORE_EXPORT bool operator==(const EventRegion&) const;
44
45     WEBCORE_EXPORT void unite(const Region&, const RenderStyle&);
46     WEBCORE_EXPORT void translate(const IntSize&);
47
48     bool contains(const IntPoint& point) const { return m_region.contains(point); }
49     bool contains(const IntRect& rect) const { return m_region.contains(rect); }
50
51 #if ENABLE(POINTER_EVENTS)
52     bool hasTouchActions() const { return !m_touchActionRegions.isEmpty(); }
53     WEBCORE_EXPORT OptionSet<TouchAction> touchActionsForPoint(const IntPoint&) const;
54 #endif
55
56     template<class Encoder> void encode(Encoder&) const;
57     template<class Decoder> static Optional<EventRegion> decode(Decoder&);
58     // FIXME: Remove legacy decode.
59     template<class Decoder> static bool decode(Decoder&, EventRegion&);
60
61 private:
62 #if ENABLE(POINTER_EVENTS)
63     void uniteTouchActions(const Region&, OptionSet<TouchAction>);
64 #endif
65     friend TextStream& operator<<(TextStream&, const EventRegion&);
66
67     Region m_region;
68 #if ENABLE(POINTER_EVENTS)
69     Vector<Region> m_touchActionRegions;
70 #endif
71 };
72
73 TextStream& operator<<(TextStream&, const EventRegion&);
74
75 template<class Encoder>
76 void EventRegion::encode(Encoder& encoder) const
77 {
78     encoder << m_region;
79 #if ENABLE(POINTER_EVENTS)
80     encoder << m_touchActionRegions;
81 #endif
82 }
83
84 template<class Decoder>
85 Optional<EventRegion> EventRegion::decode(Decoder& decoder)
86 {
87     Optional<Region> region;
88     decoder >> region;
89     if (!region)
90         return WTF::nullopt;
91
92     EventRegion eventRegion;
93     eventRegion.m_region = WTFMove(*region);
94
95 #if ENABLE(POINTER_EVENTS)
96     Optional<Vector<Region>> touchActionRegions;
97     decoder >> touchActionRegions;
98     if (!touchActionRegions)
99         return WTF::nullopt;
100
101     eventRegion.m_touchActionRegions = WTFMove(*touchActionRegions);
102 #endif
103
104     return eventRegion;
105 }
106
107 template<class Decoder>
108 bool EventRegion::decode(Decoder& decoder, EventRegion& eventRegion)
109 {
110     Optional<EventRegion> decodedEventRegion;
111     decoder >> decodedEventRegion;
112     if (!decodedEventRegion)
113         return false;
114     eventRegion = WTFMove(*decodedEventRegion);
115     return true;
116 }
117
118 }