Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / html / shadow / SliderThumbElement.h
1 /*
2  * Copyright (C) 2006-2018 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Google Inc. All rights reserved.
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 #pragma once
33
34 #include "HTMLDivElement.h"
35 #include "RenderBlockFlow.h"
36 #include <wtf/Forward.h>
37
38 namespace WebCore {
39
40 class HTMLInputElement;
41 class TouchEvent;
42
43 class SliderThumbElement final : public HTMLDivElement {
44     WTF_MAKE_ISO_ALLOCATED(SliderThumbElement);
45 public:
46     static Ref<SliderThumbElement> create(Document&);
47
48     void setPositionFromValue();
49     void dragFrom(const LayoutPoint&);
50     RefPtr<HTMLInputElement> hostInput() const;
51     void setPositionFromPoint(const LayoutPoint&);
52
53 #if ENABLE(IOS_TOUCH_EVENTS)
54     void handleTouchEvent(TouchEvent&);
55 #endif
56
57     void hostDisabledStateChanged();
58
59 private:
60     SliderThumbElement(Document&);
61
62     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
63
64     Ref<Element> cloneElementWithoutAttributesAndChildren(Document&) final;
65     bool isDisabledFormControl() const final;
66     bool matchesReadWritePseudoClass() const final;
67     RefPtr<Element> focusDelegate() final;
68
69 #if !PLATFORM(IOS_FAMILY)
70     void defaultEventHandler(Event&) final;
71     bool willRespondToMouseMoveEvents() final;
72     bool willRespondToMouseClickEvents() final;
73 #endif
74
75 #if ENABLE(IOS_TOUCH_EVENTS)
76     void didAttachRenderers() final;
77 #endif
78     void willDetachRenderers() final;
79
80     Optional<ElementStyle> resolveCustomStyle(const RenderStyle&, const RenderStyle*) final;
81     const AtomString& shadowPseudoId() const final;
82
83     void startDragging();
84     void stopDragging();
85
86 #if ENABLE(IOS_TOUCH_EVENTS)
87     unsigned exclusiveTouchIdentifier() const;
88     void setExclusiveTouchIdentifier(unsigned);
89     void clearExclusiveTouchIdentifier();
90
91     void handleTouchStart(TouchEvent&);
92     void handleTouchMove(TouchEvent&);
93     void handleTouchEndAndCancel(TouchEvent&);
94
95     bool shouldAcceptTouchEvents();
96     void registerForTouchEvents();
97     void unregisterForTouchEvents();
98 #endif
99
100     AtomString m_shadowPseudoId;
101     bool m_inDragMode { false };
102
103 #if ENABLE(IOS_TOUCH_EVENTS)
104     // FIXME: Currently it is safe to use 0, but this may need to change
105     // if touch identifiers change in the future and can be 0.
106     static const unsigned NoIdentifier = 0;
107     unsigned m_exclusiveTouchIdentifier { NoIdentifier };
108     bool m_isRegisteredAsTouchEventListener { false };
109 #endif
110 };
111
112 inline Ref<SliderThumbElement> SliderThumbElement::create(Document& document)
113 {
114     return adoptRef(*new SliderThumbElement(document));
115 }
116
117 // --------------------------------
118
119 class RenderSliderThumb final : public RenderBlockFlow {
120     WTF_MAKE_ISO_ALLOCATED(RenderSliderThumb);
121 public:
122     RenderSliderThumb(SliderThumbElement&, RenderStyle&&);
123     void updateAppearance(const RenderStyle* parentStyle);
124
125 private:
126     bool isSliderThumb() const final;
127 };
128
129 // --------------------------------
130
131 class SliderContainerElement final : public HTMLDivElement {
132     WTF_MAKE_ISO_ALLOCATED(SliderContainerElement);
133 public:
134     static Ref<SliderContainerElement> create(Document&);
135
136 private:
137     SliderContainerElement(Document&);
138     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
139     Optional<ElementStyle> resolveCustomStyle(const RenderStyle&, const RenderStyle*) final;
140     const AtomString& shadowPseudoId() const final;
141     bool isSliderContainerElement() const final { return true; }
142
143     AtomString m_shadowPseudoId;
144 };
145
146 } // namespace WebCore
147
148 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::SliderContainerElement)
149     static bool isType(const WebCore::Element& element) { return element.isSliderContainerElement(); }
150     static bool isType(const WebCore::Node& node) { return is<WebCore::Element>(node) && isType(downcast<WebCore::Element>(node)); }
151 SPECIALIZE_TYPE_TRAITS_END()