Update CustomEvent to stop using legacy [ConstructorTemplate=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 "EventInit.h"
29 #include "EventInterfaces.h"
30 #include "ScriptWrappable.h"
31 #include <wtf/RefCounted.h>
32 #include <wtf/TypeCasts.h>
33 #include <wtf/text/AtomicString.h>
34
35 namespace WebCore {
36
37 class DataTransfer;
38 class EventPath;
39 class EventTarget;
40 class HTMLIFrameElement;
41
42 enum EventInterface {
43
44 #define DOM_EVENT_INTERFACE_DECLARE(name) name##InterfaceType,
45 DOM_EVENT_INTERFACES_FOR_EACH(DOM_EVENT_INTERFACE_DECLARE)
46 #undef DOM_EVENT_INTERFACE_DECLARE
47
48 };
49
50 class Event : public ScriptWrappable, public RefCounted<Event> {
51 public:
52     enum class IsTrusted { No, Yes };
53
54     enum PhaseType { 
55         NONE                = 0,
56         CAPTURING_PHASE     = 1, 
57         AT_TARGET           = 2,
58         BUBBLING_PHASE      = 3 
59     };
60
61     enum EventType {
62         MOUSEDOWN           = 1,
63         MOUSEUP             = 2,
64         MOUSEOVER           = 4,
65         MOUSEOUT            = 8,
66         MOUSEMOVE           = 16,
67         MOUSEDRAG           = 32,
68         CLICK               = 64,
69         DBLCLICK            = 128,
70         KEYDOWN             = 256,
71         KEYUP               = 512,
72         KEYPRESS            = 1024,
73         DRAGDROP            = 2048,
74         FOCUS               = 4096,
75         BLUR                = 8192,
76         SELECT              = 16384,
77         CHANGE              = 32768
78     };
79
80     static Ref<Event> create(const AtomicString& type, bool canBubble, bool cancelable)
81     {
82         return adoptRef(*new Event(type, canBubble, cancelable));
83     }
84
85     static Ref<Event> createForBindings()
86     {
87         return adoptRef(*new Event);
88     }
89
90     static Ref<Event> createForBindings(const AtomicString& type, const EventInit& initializer)
91     {
92         return adoptRef(*new Event(type, initializer));
93     }
94
95     virtual ~Event();
96
97     WEBCORE_EXPORT void initEvent(const AtomicString& type, bool canBubble, bool cancelable);
98     bool isInitialized() const { return m_isInitialized; }
99
100     const AtomicString& type() const { return m_type; }
101     void setType(const AtomicString& type) { m_type = type; }
102     
103     EventTarget* target() const { return m_target.get(); }
104     void setTarget(RefPtr<EventTarget>&&);
105
106     EventTarget* currentTarget() const { return m_currentTarget; }
107     void setCurrentTarget(EventTarget* currentTarget) { m_currentTarget = currentTarget; }
108
109     unsigned short eventPhase() const { return m_eventPhase; }
110     void setEventPhase(unsigned short eventPhase) { m_eventPhase = eventPhase; }
111
112     bool bubbles() const { return m_canBubble; }
113     bool cancelable() const { return m_cancelable; }
114     WEBCORE_EXPORT bool composed() const;
115
116     DOMTimeStamp timeStamp() const { return m_createTime; }
117
118     void setEventPath(const EventPath& path) { m_eventPath = &path; }
119     void clearEventPath() { m_eventPath = nullptr; }
120     Vector<EventTarget*> composedPath() const;
121
122     void stopPropagation() { m_propagationStopped = true; }
123     void stopImmediatePropagation() { m_immediatePropagationStopped = true; }
124
125     bool isTrusted() const { return m_isTrusted; }
126     void setUntrusted() { m_isTrusted = false; }
127     
128     // IE Extensions
129     EventTarget* srcElement() const { return target(); } // MSIE extension - "the object that fired the event"
130
131     bool legacyReturnValue() const { return !defaultPrevented(); }
132     void setLegacyReturnValue(bool returnValue) { setDefaultPrevented(!returnValue); }
133
134     virtual EventInterface eventInterface() const;
135
136     // These events are general classes of events.
137     virtual bool isUIEvent() const;
138     virtual bool isMouseEvent() const;
139     virtual bool isFocusEvent() const;
140     virtual bool isKeyboardEvent() const;
141     virtual bool isInputEvent() const;
142     virtual bool isCompositionEvent() const;
143     virtual bool isTouchEvent() const;
144
145     // Drag events are a subset of mouse events.
146     virtual bool isDragEvent() const;
147
148     // These events lack a DOM interface.
149     virtual bool isClipboardEvent() const;
150     virtual bool isBeforeTextInsertedEvent() const;
151
152     virtual bool isBeforeUnloadEvent() const;
153
154     virtual bool isErrorEvent() const;
155     virtual bool isTextEvent() const;
156     virtual bool isWheelEvent() const;
157
158 #if ENABLE(INDEXED_DATABASE)
159     virtual bool isVersionChangeEvent() const { return false; }
160 #endif
161
162     bool propagationStopped() const { return m_propagationStopped || m_immediatePropagationStopped; }
163     bool immediatePropagationStopped() const { return m_immediatePropagationStopped; }
164
165     void resetPropagationFlags();
166
167     bool defaultPrevented() const { return m_defaultPrevented; }
168     void preventDefault()
169     {
170         if (m_cancelable && !m_isExecutingPassiveEventListener)
171             m_defaultPrevented = true;
172     }
173     void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; }
174
175     bool defaultHandled() const { return m_defaultHandled; }
176     void setDefaultHandled() { m_defaultHandled = true; }
177
178     void setInPassiveListener(bool value) { m_isExecutingPassiveEventListener = value; }
179
180     bool cancelBubble() const { return m_cancelBubble; }
181     void setCancelBubble(bool cancel) { m_cancelBubble = cancel; }
182
183     Event* underlyingEvent() const { return m_underlyingEvent.get(); }
184     void setUnderlyingEvent(Event*);
185
186     bool isBeingDispatched() const { return eventPhase(); }
187
188     virtual Ref<Event> cloneFor(HTMLIFrameElement*) const;
189
190     virtual EventTarget* relatedTarget() const { return nullptr; }
191
192 protected:
193     Event(IsTrusted = IsTrusted::No);
194     WEBCORE_EXPORT Event(const AtomicString& type, bool canBubble, bool cancelable);
195     Event(const AtomicString& type, bool canBubble, bool cancelable, double timestamp);
196     Event(const AtomicString& type, const EventInit&, IsTrusted = IsTrusted::No);
197
198     virtual void receivedTarget();
199     bool dispatched() const { return m_target; }
200
201 private:
202     AtomicString m_type;
203
204     bool m_isInitialized { false };
205     bool m_canBubble { false };
206     bool m_cancelable { false };
207     bool m_composed { false };
208
209     bool m_propagationStopped { false };
210     bool m_immediatePropagationStopped { false };
211     bool m_defaultPrevented { false };
212     bool m_defaultHandled { false };
213     bool m_cancelBubble { false };
214     bool m_isTrusted { false };
215     bool m_isExecutingPassiveEventListener { false };
216
217     unsigned short m_eventPhase { 0 };
218     EventTarget* m_currentTarget { nullptr };
219     const EventPath* m_eventPath { nullptr };
220     RefPtr<EventTarget> m_target;
221     DOMTimeStamp m_createTime;
222
223     RefPtr<Event> m_underlyingEvent;
224 };
225
226 inline void Event::resetPropagationFlags()
227 {
228     m_propagationStopped = false;
229     m_immediatePropagationStopped = false;
230 }
231
232 } // namespace WebCore
233
234 #define SPECIALIZE_TYPE_TRAITS_EVENT(ToValueTypeName) \
235 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
236     static bool isType(const WebCore::Event& event) { return event.is##ToValueTypeName(); } \
237 SPECIALIZE_TYPE_TRAITS_END()
238
239 #endif // Event_h