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