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