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 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 "bindings/v8/ScriptWrappable.h" 28 #include "core/dom/DOMTimeStamp.h" 29 #include "core/events/EventContext.h" 30 #include "core/events/EventPath.h" 31 #include "wtf/RefCounted.h" 32 #include "wtf/text/AtomicString.h" 33 34 namespace WebCore { 35 36 class Clipboard; 37 class EventTarget; 38 class EventDispatcher; 39 class HTMLIFrameElement; 40 41 struct EventInit { 42 EventInit(); 43 44 bool bubbles; 45 bool cancelable; 46 }; 47 48 class Event : public ScriptWrappable, public RefCounted<Event> { 49 public: 50 enum PhaseType { 51 NONE = 0, 52 CAPTURING_PHASE = 1, 53 AT_TARGET = 2, 54 BUBBLING_PHASE = 3 55 }; 56 57 enum EventType { 58 MOUSEDOWN = 1, 59 MOUSEUP = 2, 60 MOUSEOVER = 4, 61 MOUSEOUT = 8, 62 MOUSEMOVE = 16, 63 MOUSEDRAG = 32, 64 CLICK = 64, 65 DBLCLICK = 128, 66 KEYDOWN = 256, 67 KEYUP = 512, 68 KEYPRESS = 1024, 69 DRAGDROP = 2048, 70 FOCUS = 4096, 71 BLUR = 8192, 72 SELECT = 16384, 73 CHANGE = 32768 74 }; 75 create()76 static PassRefPtr<Event> create() 77 { 78 return adoptRef(new Event); 79 } 80 81 // A factory for a simple event. The event doesn't bubble, and isn't 82 // cancelable. 83 // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#fire-a-simple-event create(const AtomicString & type)84 static PassRefPtr<Event> create(const AtomicString& type) 85 { 86 return adoptRef(new Event(type, false, false)); 87 } createCancelable(const AtomicString & type)88 static PassRefPtr<Event> createCancelable(const AtomicString& type) 89 { 90 return adoptRef(new Event(type, false, true)); 91 } createBubble(const AtomicString & type)92 static PassRefPtr<Event> createBubble(const AtomicString& type) 93 { 94 return adoptRef(new Event(type, true, false)); 95 } createCancelableBubble(const AtomicString & type)96 static PassRefPtr<Event> createCancelableBubble(const AtomicString& type) 97 { 98 return adoptRef(new Event(type, true, true)); 99 } 100 create(const AtomicString & type,const EventInit & initializer)101 static PassRefPtr<Event> create(const AtomicString& type, const EventInit& initializer) 102 { 103 return adoptRef(new Event(type, initializer)); 104 } 105 106 virtual ~Event(); 107 108 void initEvent(const AtomicString& type, bool canBubble, bool cancelable); 109 type()110 const AtomicString& type() const { return m_type; } setType(const AtomicString & type)111 void setType(const AtomicString& type) { m_type = type; } 112 target()113 EventTarget* target() const { return m_target.get(); } 114 void setTarget(PassRefPtr<EventTarget>); 115 currentTarget()116 EventTarget* currentTarget() const { return m_currentTarget; } setCurrentTarget(EventTarget * currentTarget)117 void setCurrentTarget(EventTarget* currentTarget) { m_currentTarget = currentTarget; } 118 eventPhase()119 unsigned short eventPhase() const { return m_eventPhase; } setEventPhase(unsigned short eventPhase)120 void setEventPhase(unsigned short eventPhase) { m_eventPhase = eventPhase; } 121 bubbles()122 bool bubbles() const { return m_canBubble; } cancelable()123 bool cancelable() const { return m_cancelable; } timeStamp()124 DOMTimeStamp timeStamp() const { return m_createTime; } 125 stopPropagation()126 void stopPropagation() { m_propagationStopped = true; } stopImmediatePropagation()127 void stopImmediatePropagation() { m_immediatePropagationStopped = true; } 128 129 // IE Extensions srcElement()130 EventTarget* srcElement() const { return target(); } // MSIE extension - "the object that fired the event" 131 legacyReturnValue()132 bool legacyReturnValue() const { return !defaultPrevented(); } setLegacyReturnValue(bool returnValue)133 void setLegacyReturnValue(bool returnValue) { setDefaultPrevented(!returnValue); } 134 clipboardData()135 Clipboard* clipboardData() const { return isClipboardEvent() ? clipboard() : 0; } 136 137 virtual const AtomicString& interfaceName() const; 138 bool hasInterface(const AtomicString&) const; 139 140 // These events are general classes of events. 141 virtual bool isUIEvent() const; 142 virtual bool isMouseEvent() const; 143 virtual bool isFocusEvent() const; 144 virtual bool isKeyboardEvent() const; 145 virtual bool isTouchEvent() const; 146 virtual bool isGestureEvent() const; 147 virtual bool isWheelEvent() const; 148 149 // Drag events are a subset of mouse events. 150 virtual bool isDragEvent() const; 151 152 // These events lack a DOM interface. 153 virtual bool isClipboardEvent() const; 154 virtual bool isBeforeTextInsertedEvent() const; 155 156 virtual bool isBeforeUnloadEvent() const; 157 propagationStopped()158 bool propagationStopped() const { return m_propagationStopped || m_immediatePropagationStopped; } immediatePropagationStopped()159 bool immediatePropagationStopped() const { return m_immediatePropagationStopped; } 160 defaultPrevented()161 bool defaultPrevented() const { return m_defaultPrevented; } preventDefault()162 void preventDefault() 163 { 164 if (m_cancelable) 165 m_defaultPrevented = true; 166 } setDefaultPrevented(bool defaultPrevented)167 void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; } 168 defaultHandled()169 bool defaultHandled() const { return m_defaultHandled; } setDefaultHandled()170 void setDefaultHandled() { m_defaultHandled = true; } 171 cancelBubble()172 bool cancelBubble() const { return m_cancelBubble; } setCancelBubble(bool cancel)173 void setCancelBubble(bool cancel) { m_cancelBubble = cancel; } 174 underlyingEvent()175 Event* underlyingEvent() const { return m_underlyingEvent.get(); } 176 void setUnderlyingEvent(PassRefPtr<Event>); 177 eventPath()178 EventPath& eventPath() { return m_eventPath; } 179 PassRefPtr<NodeList> path() const; 180 clipboard()181 virtual Clipboard* clipboard() const { return 0; } 182 isBeingDispatched()183 bool isBeingDispatched() const { return eventPhase(); } 184 185 protected: 186 Event(); 187 Event(const AtomicString& type, bool canBubble, bool cancelable); 188 Event(const AtomicString& type, const EventInit&); 189 190 virtual void receivedTarget(); dispatched()191 bool dispatched() const { return m_target; } 192 193 private: 194 AtomicString m_type; 195 bool m_canBubble; 196 bool m_cancelable; 197 198 bool m_propagationStopped; 199 bool m_immediatePropagationStopped; 200 bool m_defaultPrevented; 201 bool m_defaultHandled; 202 bool m_cancelBubble; 203 204 unsigned short m_eventPhase; 205 EventTarget* m_currentTarget; 206 RefPtr<EventTarget> m_target; 207 DOMTimeStamp m_createTime; 208 RefPtr<Event> m_underlyingEvent; 209 EventPath m_eventPath; 210 }; 211 212 #define DEFINE_EVENT_TYPE_CASTS(typeName) \ 213 DEFINE_TYPE_CASTS(typeName, Event, event, event->is##typeName(), event.is##typeName()) 214 215 } // namespace WebCore 216 217 #endif // Event_h 218