a061d63b8563f7ce3348648a7eb794f8600a7060
[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 PassRefPtr<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(TOUCH_EVENTS) && PLATFORM(IOS)
56     void handleTouchEvent(TouchEvent*);
57
58     void disabledAttributeChanged();
59 #endif
60
61 private:
62     SliderThumbElement(Document&);
63
64     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
65     virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren() override;
66     virtual bool isDisabledFormControl() const override;
67     virtual bool matchesReadOnlyPseudoClass() const override;
68     virtual bool matchesReadWritePseudoClass() const override;
69     virtual Element* focusDelegate() override;
70 #if !PLATFORM(IOS)
71     virtual void defaultEventHandler(Event*) override;
72     virtual bool willRespondToMouseMoveEvents() override;
73     virtual bool willRespondToMouseClickEvents() override;
74 #endif
75
76 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS)
77     virtual void didAttachRenderers() override;
78 #endif
79     virtual void willDetachRenderers() override;
80
81     virtual const AtomicString& shadowPseudoId() const override;
82
83     void startDragging();
84     void stopDragging();
85
86 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS)
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     bool m_inDragMode;
101
102 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS)
103     // FIXME: Currently it is safe to use 0, but this may need to change
104     // if touch identifers change in the future and can be 0.
105     static const unsigned NoIdentifier = 0;
106     unsigned m_exclusiveTouchIdentifier;
107     bool m_isRegisteredAsTouchEventListener;
108 #endif
109 };
110
111 inline PassRefPtr<SliderThumbElement> SliderThumbElement::create(Document& document)
112 {
113     return adoptRef(new SliderThumbElement(document));
114 }
115
116 // --------------------------------
117
118 class RenderSliderThumb final : public RenderBlockFlow {
119 public:
120     RenderSliderThumb(SliderThumbElement&, PassRef<RenderStyle>);
121     void updateAppearance(RenderStyle* parentStyle);
122
123 private:
124     virtual bool isSliderThumb() const override;
125 };
126
127 // --------------------------------
128
129 class SliderContainerElement final : public HTMLDivElement {
130 public:
131     static PassRefPtr<SliderContainerElement> create(Document&);
132
133 private:
134     SliderContainerElement(Document&);
135     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
136     virtual const AtomicString& shadowPseudoId() const override;
137 };
138
139 }
140
141 #endif