Add checked casts for Event.
[WebKit-https.git] / Source / WebCore / dom / Event.h
1 /*
2  * Copyright (C) 2001 Peter Kelly (pmk@post.com)
3  * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
4  * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2013 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef Event_h
25 #define Event_h
26
27 #include "DOMTimeStamp.h"
28 #include "EventInterfaces.h"
29 #include "ScriptWrappable.h"
30 #include <wtf/HashMap.h>
31 #include <wtf/ListHashSet.h>
32 #include <wtf/RefCounted.h>
33 #include <wtf/text/AtomicString.h>
34
35 namespace WebCore {
36
37 class Clipboard;
38 class EventTarget;
39 class HTMLIFrameElement;
40
41 struct EventInit {
42     EventInit();
43     EventInit(bool bubbles, bool cancelable);
44
45     bool bubbles;
46     bool cancelable;
47 };
48
49 enum EventInterface {
50
51 #define DOM_EVENT_INTERFACE_DECLARE(name) name##InterfaceType,
52 DOM_EVENT_INTERFACES_FOR_EACH(DOM_EVENT_INTERFACE_DECLARE)
53 #undef DOM_EVENT_INTERFACE_DECLARE
54
55 };
56
57 class Event : public ScriptWrappable, public RefCounted<Event> {
58 public:
59     enum PhaseType { 
60         NONE                = 0,
61         CAPTURING_PHASE     = 1, 
62         AT_TARGET           = 2,
63         BUBBLING_PHASE      = 3 
64     };
65
66     enum EventType {
67         MOUSEDOWN           = 1,
68         MOUSEUP             = 2,
69         MOUSEOVER           = 4,
70         MOUSEOUT            = 8,
71         MOUSEMOVE           = 16,
72         MOUSEDRAG           = 32,
73         CLICK               = 64,
74         DBLCLICK            = 128,
75         KEYDOWN             = 256,
76         KEYUP               = 512,
77         KEYPRESS            = 1024,
78         DRAGDROP            = 2048,
79         FOCUS               = 4096,
80         BLUR                = 8192,
81         SELECT              = 16384,
82         CHANGE              = 32768
83     };
84
85     static PassRefPtr<Event> create()
86     {
87         return adoptRef(new Event);
88     }
89     static PassRefPtr<Event> create(const AtomicString& type, bool canBubble, bool cancelable)
90     {
91         return adoptRef(new Event(type, canBubble, cancelable));
92     }
93
94     static PassRefPtr<Event> create(const AtomicString& type, const EventInit& initializer)
95     {
96         return adoptRef(new Event(type, initializer));
97     }
98
99     virtual ~Event();
100
101     void initEvent(const AtomicString& type, bool canBubble, bool cancelable);
102
103     const AtomicString& type() const { return m_type; }
104     void setType(const AtomicString& type) { m_type = type; }
105     
106     EventTarget* target() const { return m_target.get(); }
107     void setTarget(PassRefPtr<EventTarget>);
108
109     EventTarget* currentTarget() const { return m_currentTarget; }
110     void setCurrentTarget(EventTarget* currentTarget) { m_currentTarget = currentTarget; }
111
112     unsigned short eventPhase() const { return m_eventPhase; }
113     void setEventPhase(unsigned short eventPhase) { m_eventPhase = eventPhase; }
114
115     bool bubbles() const { return m_canBubble; }
116     bool cancelable() const { return m_cancelable; }
117     DOMTimeStamp timeStamp() const { return m_createTime; }
118
119     void stopPropagation() { m_propagationStopped = true; }
120     void stopImmediatePropagation() { m_immediatePropagationStopped = true; }
121     
122     // IE Extensions
123     EventTarget* srcElement() const { return target(); } // MSIE extension - "the object that fired the event"
124
125     bool legacyReturnValue() const { return !defaultPrevented(); }
126     void setLegacyReturnValue(bool returnValue) { setDefaultPrevented(!returnValue); }
127
128     Clipboard* clipboardData() const { return isClipboardEvent() ? clipboard() : 0; }
129
130     virtual EventInterface eventInterface() const;
131
132     // These events are general classes of events.
133     virtual bool isUIEvent() const;
134     virtual bool isMouseEvent() const;
135     virtual bool isFocusEvent() const;
136     virtual bool isKeyboardEvent() const;
137     virtual bool isTouchEvent() const;
138
139     // Drag events are a subset of mouse events.
140     virtual bool isDragEvent() const;
141
142     // These events lack a DOM interface.
143     virtual bool isClipboardEvent() const;
144     virtual bool isBeforeTextInsertedEvent() const;
145
146     virtual bool isBeforeUnloadEvent() const;
147
148     virtual bool isErrorEvent() const;
149     virtual bool isTextEvent() const;
150     virtual bool isWheelEvent() const;
151
152     bool propagationStopped() const { return m_propagationStopped || m_immediatePropagationStopped; }
153     bool immediatePropagationStopped() const { return m_immediatePropagationStopped; }
154
155     bool defaultPrevented() const { return m_defaultPrevented; }
156     void preventDefault()
157     {
158         if (m_cancelable)
159             m_defaultPrevented = true;
160     }
161     void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; }
162
163     bool defaultHandled() const { return m_defaultHandled; }
164     void setDefaultHandled() { m_defaultHandled = true; }
165
166     bool cancelBubble() const { return m_cancelBubble; }
167     void setCancelBubble(bool cancel) { m_cancelBubble = cancel; }
168
169     Event* underlyingEvent() const { return m_underlyingEvent.get(); }
170     void setUnderlyingEvent(PassRefPtr<Event>);
171
172     virtual Clipboard* clipboard() const { return 0; }
173
174     bool isBeingDispatched() const { return eventPhase(); }
175
176     virtual PassRefPtr<Event> cloneFor(HTMLIFrameElement*) const;
177
178     virtual EventTarget* relatedTarget() const { return nullptr; }
179
180 protected:
181     Event();
182     Event(const AtomicString& type, bool canBubble, bool cancelable);
183     Event(const AtomicString& type, bool canBubble, bool cancelable, double timestamp);
184     Event(const AtomicString& type, const EventInit&);
185
186     virtual void receivedTarget();
187     bool dispatched() const { return m_target; }
188
189 private:
190     AtomicString m_type;
191     bool m_canBubble;
192     bool m_cancelable;
193
194     bool m_propagationStopped;
195     bool m_immediatePropagationStopped;
196     bool m_defaultPrevented;
197     bool m_defaultHandled;
198     bool m_cancelBubble;
199
200     unsigned short m_eventPhase;
201     EventTarget* m_currentTarget;
202     RefPtr<EventTarget> m_target;
203     DOMTimeStamp m_createTime;
204
205     RefPtr<Event> m_underlyingEvent;
206 };
207
208 #define EVENT_TYPE_CASTS(ToValueTypeName) \
209     TYPE_CASTS_BASE(ToValueTypeName, Event, event, event->is##ToValueTypeName(), event.is##ToValueTypeName())
210
211
212 } // namespace WebCore
213
214 #endif // Event_h