1 /* 2 * Copyright (C) 2001 Peter Kelly (pmk (at) post.com) 3 * Copyright (C) 2001 Tobias Anton (anton (at) stud.fbi.fh-darmstadt.de) 4 * Copyright (C) 2006 Samuel Weinig (sam.weinig (at) gmail.com) 5 * Copyright (C) 2003, 2005, 2006, 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 #include "config.h" 24 #include "Event.h" 25 #include "EventDispatcher.h" 26 #include "EventTarget.h" 27 28 #include "UserGestureIndicator.h" 29 #include <wtf/CurrentTime.h> 30 #include <wtf/text/AtomicString.h> 31 32 namespace WebCore { 33 34 Event::Event() 35 : m_canBubble(false) 36 , m_cancelable(false) 37 , m_propagationStopped(false) 38 , m_immediatePropagationStopped(false) 39 , m_defaultPrevented(false) 40 , m_defaultHandled(false) 41 , m_cancelBubble(false) 42 , m_eventPhase(0) 43 , m_currentTarget(0) 44 , m_createTime(convertSecondsToDOMTimeStamp(currentTime())) 45 { 46 } 47 48 Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableArg) 49 : m_type(eventType) 50 , m_canBubble(canBubbleArg) 51 , m_cancelable(cancelableArg) 52 , m_propagationStopped(false) 53 , m_immediatePropagationStopped(false) 54 , m_defaultPrevented(false) 55 , m_defaultHandled(false) 56 , m_cancelBubble(false) 57 , m_eventPhase(0) 58 , m_currentTarget(0) 59 , m_createTime(convertSecondsToDOMTimeStamp(currentTime())) 60 { 61 } 62 63 Event::~Event() 64 { 65 } 66 67 void Event::initEvent(const AtomicString& eventTypeArg, bool canBubbleArg, bool cancelableArg) 68 { 69 if (dispatched()) 70 return; 71 72 m_type = eventTypeArg; 73 m_canBubble = canBubbleArg; 74 m_cancelable = cancelableArg; 75 } 76 77 bool Event::isCustomEvent() const 78 { 79 return false; 80 } 81 82 bool Event::isUIEvent() const 83 { 84 return false; 85 } 86 87 bool Event::isMouseEvent() const 88 { 89 return false; 90 } 91 92 bool Event::isMutationEvent() const 93 { 94 return false; 95 } 96 97 bool Event::isKeyboardEvent() const 98 { 99 return false; 100 } 101 102 bool Event::isTextEvent() const 103 { 104 return false; 105 } 106 107 bool Event::isCompositionEvent() const 108 { 109 return false; 110 } 111 112 bool Event::isDragEvent() const 113 { 114 return false; 115 } 116 117 bool Event::isClipboardEvent() const 118 { 119 return false; 120 } 121 122 bool Event::isWheelEvent() const 123 { 124 return false; 125 } 126 127 bool Event::isMessageEvent() const 128 { 129 return false; 130 } 131 132 bool Event::isBeforeTextInsertedEvent() const 133 { 134 return false; 135 } 136 137 bool Event::isOverflowEvent() const 138 { 139 return false; 140 } 141 142 bool Event::isPageTransitionEvent() const 143 { 144 return false; 145 } 146 147 bool Event::isPopStateEvent() const 148 { 149 return false; 150 } 151 152 bool Event::isProgressEvent() const 153 { 154 return false; 155 } 156 157 bool Event::isWebKitAnimationEvent() const 158 { 159 return false; 160 } 161 162 bool Event::isWebKitTransitionEvent() const 163 { 164 return false; 165 } 166 167 bool Event::isXMLHttpRequestProgressEvent() const 168 { 169 return false; 170 } 171 172 bool Event::isBeforeLoadEvent() const 173 { 174 return false; 175 } 176 177 bool Event::isHashChangeEvent() const 178 { 179 return false; 180 } 181 182 #if ENABLE(SVG) 183 bool Event::isSVGZoomEvent() const 184 { 185 return false; 186 } 187 #endif 188 189 #if ENABLE(DOM_STORAGE) 190 bool Event::isStorageEvent() const 191 { 192 return false; 193 } 194 #endif 195 196 #if ENABLE(INDEXED_DATABASE) 197 bool Event::isIDBVersionChangeEvent() const 198 { 199 return false; 200 } 201 #endif 202 203 bool Event::isErrorEvent() const 204 { 205 return false; 206 } 207 208 #if ENABLE(TOUCH_EVENTS) 209 bool Event::isTouchEvent() const 210 { 211 return false; 212 } 213 #endif 214 215 #if ENABLE(DEVICE_ORIENTATION) 216 bool Event::isDeviceMotionEvent() const 217 { 218 return false; 219 } 220 221 bool Event::isDeviceOrientationEvent() const 222 { 223 return false; 224 } 225 #endif 226 227 #if ENABLE(WEB_AUDIO) 228 bool Event::isAudioProcessingEvent() const 229 { 230 return false; 231 } 232 233 bool Event::isOfflineAudioCompletionEvent() const 234 { 235 return false; 236 } 237 #endif 238 239 #if ENABLE(INPUT_SPEECH) 240 bool Event::isSpeechInputEvent() const 241 { 242 return false; 243 } 244 #endif 245 246 bool Event::fromUserGesture() 247 { 248 if (!UserGestureIndicator::processingUserGesture()) 249 return false; 250 251 const AtomicString& type = this->type(); 252 return 253 // mouse events 254 type == eventNames().clickEvent || type == eventNames().mousedownEvent 255 || type == eventNames().mouseupEvent || type == eventNames().dblclickEvent 256 // keyboard events 257 || type == eventNames().keydownEvent || type == eventNames().keypressEvent 258 || type == eventNames().keyupEvent 259 #if ENABLE(TOUCH_EVENTS) 260 // touch events 261 || type == eventNames().touchstartEvent || type == eventNames().touchmoveEvent 262 || type == eventNames().touchendEvent || type == eventNames().touchcancelEvent 263 #endif 264 // other accepted events 265 || type == eventNames().selectEvent || type == eventNames().changeEvent 266 || type == eventNames().focusEvent || type == eventNames().blurEvent 267 || type == eventNames().submitEvent; 268 } 269 270 bool Event::storesResultAsString() const 271 { 272 return false; 273 } 274 275 void Event::storeResult(const String&) 276 { 277 } 278 279 void Event::setTarget(PassRefPtr<EventTarget> target) 280 { 281 if (m_target == target) 282 return; 283 284 m_target = target; 285 if (m_target) 286 receivedTarget(); 287 } 288 289 void Event::receivedTarget() 290 { 291 } 292 293 void Event::setUnderlyingEvent(PassRefPtr<Event> ue) 294 { 295 // Prohibit creation of a cycle -- just do nothing in that case. 296 for (Event* e = ue.get(); e; e = e->underlyingEvent()) 297 if (e == this) 298 return; 299 m_underlyingEvent = ue; 300 } 301 302 EventDispatchMediator::EventDispatchMediator(PassRefPtr<Event> event) 303 : m_event(event) 304 { 305 } 306 307 EventDispatchMediator::~EventDispatchMediator() 308 { 309 } 310 311 bool EventDispatchMediator::dispatchEvent(EventDispatcher* dispatcher) const 312 { 313 return dispatcher->dispatchEvent(m_event.get()); 314 } 315 316 } // namespace WebCore 317