Node.appendChild(null) / replaceChild(null, null) / removeChild(null) / insertBefore...
[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     virtual RenderPtr<RenderElement> createElementRenderer(Ref<RenderStyle>&&, const RenderTreePosition&) override;
65     virtual Ref<Element> cloneElementWithoutAttributesAndChildren(Document&) override;
66     virtual bool isDisabledFormControl() const override;
67     virtual bool matchesReadWritePseudoClass() const override;
68     virtual Element* focusDelegate() override;
69 #if !PLATFORM(IOS)
70     virtual void defaultEventHandler(Event*) override;
71     virtual bool willRespondToMouseMoveEvents() override;
72     virtual bool willRespondToMouseClickEvents() override;
73 #endif
74
75 #if ENABLE(IOS_TOUCH_EVENTS)
76     virtual void didAttachRenderers() override;
77 #endif
78     virtual void willDetachRenderers() override;
79
80     virtual const AtomicString& shadowPseudoId() const override;
81
82     void startDragging();
83     void stopDragging();
84
85 #if ENABLE(IOS_TOUCH_EVENTS)
86     unsigned exclusiveTouchIdentifier() const;
87     void setExclusiveTouchIdentifier(unsigned);
88     void clearExclusiveTouchIdentifier();
89
90     void handleTouchStart(TouchEvent*);
91     void handleTouchMove(TouchEvent*);
92     void handleTouchEndAndCancel(TouchEvent*);
93
94     bool shouldAcceptTouchEvents();
95     void registerForTouchEvents();
96     void unregisterForTouchEvents();
97 #endif
98
99     bool m_inDragMode;
100
101 #if ENABLE(IOS_TOUCH_EVENTS)
102     // FIXME: Currently it is safe to use 0, but this may need to change
103     // if touch identifiers change in the future and can be 0.
104     static const unsigned NoIdentifier = 0;
105     unsigned m_exclusiveTouchIdentifier;
106     bool m_isRegisteredAsTouchEventListener;
107 #endif
108 };
109
110 inline Ref<SliderThumbElement> SliderThumbElement::create(Document& document)
111 {
112     return adoptRef(*new SliderThumbElement(document));
113 }
114
115 // --------------------------------
116
117 class RenderSliderThumb final : public RenderBlockFlow {
118 public:
119     RenderSliderThumb(SliderThumbElement&, Ref<RenderStyle>&&);
120     void updateAppearance(RenderStyle* parentStyle);
121
122 private:
123     virtual bool isSliderThumb() const override;
124 };
125
126 // --------------------------------
127
128 class SliderContainerElement final : public HTMLDivElement {
129 public:
130     static Ref<SliderContainerElement> create(Document&);
131
132 private:
133     SliderContainerElement(Document&);
134     virtual RenderPtr<RenderElement> createElementRenderer(Ref<RenderStyle>&&, const RenderTreePosition&) override;
135     virtual const AtomicString& shadowPseudoId() const override;
136 };
137
138 }
139
140 #endif