OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
6 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 6 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
7 * (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 7 * (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
8 * | 8 * |
9 * Redistribution and use in source and binary forms, with or without | 9 * Redistribution and use in source and binary forms, with or without |
10 * modification, are permitted provided that the following conditions | 10 * modification, are permitted provided that the following conditions |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 } | 257 } |
258 if (event->isBeingDispatched()) { | 258 if (event->isBeingDispatched()) { |
259 exceptionState.throwDOMException(InvalidStateError, "The event is alread
y being dispatched."); | 259 exceptionState.throwDOMException(InvalidStateError, "The event is alread
y being dispatched."); |
260 return false; | 260 return false; |
261 } | 261 } |
262 | 262 |
263 if (!executionContext()) | 263 if (!executionContext()) |
264 return false; | 264 return false; |
265 | 265 |
266 event->setTrusted(false); | 266 event->setTrusted(false); |
267 return dispatchEventInternal(event); | 267 |
| 268 // Return whether the event was cancelled or not to JS not that it |
| 269 // might have actually been default handled; so check only against |
| 270 // CanceledByEventHandler. |
| 271 return dispatchEventInternal(event) != DispatchEventResult::CanceledByEventH
andler; |
268 } | 272 } |
269 | 273 |
270 bool EventTarget::dispatchEvent(PassRefPtrWillBeRawPtr<Event> event) | 274 DispatchEventResult EventTarget::dispatchEvent(PassRefPtrWillBeRawPtr<Event> eve
nt) |
271 { | 275 { |
272 event->setTrusted(true); | 276 event->setTrusted(true); |
273 return dispatchEventInternal(event); | 277 return dispatchEventInternal(event); |
274 } | 278 } |
275 | 279 |
276 bool EventTarget::dispatchEventInternal(PassRefPtrWillBeRawPtr<Event> event) | 280 DispatchEventResult EventTarget::dispatchEventInternal(PassRefPtrWillBeRawPtr<Ev
ent> event) |
277 { | 281 { |
278 event->setTarget(this); | 282 event->setTarget(this); |
279 event->setCurrentTarget(this); | 283 event->setCurrentTarget(this); |
280 event->setEventPhase(Event::AT_TARGET); | 284 event->setEventPhase(Event::AT_TARGET); |
281 bool defaultWasNotPrevented = fireEventListeners(event.get()); | 285 DispatchEventResult dispatchResult = fireEventListeners(event.get()); |
282 event->setEventPhase(0); | 286 event->setEventPhase(0); |
283 return defaultWasNotPrevented; | 287 return dispatchResult; |
284 } | 288 } |
285 | 289 |
286 void EventTarget::uncaughtExceptionInEventHandler() | 290 void EventTarget::uncaughtExceptionInEventHandler() |
287 { | 291 { |
288 } | 292 } |
289 | 293 |
290 static const AtomicString& legacyType(const Event* event) | 294 static const AtomicString& legacyType(const Event* event) |
291 { | 295 { |
292 if (event->type() == EventTypeNames::transitionend) | 296 if (event->type() == EventTypeNames::transitionend) |
293 return EventTypeNames::webkitTransitionEnd; | 297 return EventTypeNames::webkitTransitionEnd; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 if (listenersVector) | 345 if (listenersVector) |
342 UseCounter::count(executingWindow->document(), prefixedAndUnpref
ixedFeature); | 346 UseCounter::count(executingWindow->document(), prefixedAndUnpref
ixedFeature); |
343 else | 347 else |
344 UseCounter::count(executingWindow->document(), prefixedFeature); | 348 UseCounter::count(executingWindow->document(), prefixedFeature); |
345 } else if (listenersVector) { | 349 } else if (listenersVector) { |
346 UseCounter::count(executingWindow->document(), unprefixedFeature); | 350 UseCounter::count(executingWindow->document(), unprefixedFeature); |
347 } | 351 } |
348 } | 352 } |
349 } | 353 } |
350 | 354 |
351 bool EventTarget::fireEventListeners(Event* event) | 355 DispatchEventResult EventTarget::fireEventListeners(Event* event) |
352 { | 356 { |
353 ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden()); | 357 ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden()); |
354 ASSERT(event && !event->type().isEmpty()); | 358 ASSERT(event && !event->type().isEmpty()); |
355 | 359 |
356 EventTargetData* d = eventTargetData(); | 360 EventTargetData* d = eventTargetData(); |
357 if (!d) | 361 if (!d) |
358 return true; | 362 return DispatchEventResult::NotCanceled; |
359 | 363 |
360 EventListenerVector* legacyListenersVector = nullptr; | 364 EventListenerVector* legacyListenersVector = nullptr; |
361 AtomicString legacyTypeName = legacyType(event); | 365 AtomicString legacyTypeName = legacyType(event); |
362 if (!legacyTypeName.isEmpty()) | 366 if (!legacyTypeName.isEmpty()) |
363 legacyListenersVector = d->eventListenerMap.find(legacyTypeName); | 367 legacyListenersVector = d->eventListenerMap.find(legacyTypeName); |
364 | 368 |
365 EventListenerVector* listenersVector = d->eventListenerMap.find(event->type(
)); | 369 EventListenerVector* listenersVector = d->eventListenerMap.find(event->type(
)); |
366 | 370 |
367 if (listenersVector) { | 371 if (listenersVector) { |
368 fireEventListeners(event, d, *listenersVector); | 372 fireEventListeners(event, d, *listenersVector); |
369 } else if (legacyListenersVector) { | 373 } else if (legacyListenersVector) { |
370 AtomicString unprefixedTypeName = event->type(); | 374 AtomicString unprefixedTypeName = event->type(); |
371 event->setType(legacyTypeName); | 375 event->setType(legacyTypeName); |
372 fireEventListeners(event, d, *legacyListenersVector); | 376 fireEventListeners(event, d, *legacyListenersVector); |
373 event->setType(unprefixedTypeName); | 377 event->setType(unprefixedTypeName); |
374 } | 378 } |
375 | 379 |
376 Editor::countEvent(executionContext(), event); | 380 Editor::countEvent(executionContext(), event); |
377 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); | 381 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); |
378 return !event->defaultPrevented(); | 382 return dispatchEventResult(*event); |
379 } | 383 } |
380 | 384 |
381 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) | 385 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) |
382 { | 386 { |
383 RefPtrWillBeRawPtr<EventTarget> protect(this); | 387 RefPtrWillBeRawPtr<EventTarget> protect(this); |
384 | 388 |
385 // Fire all listeners registered for this event. Don't fire listeners remove
d | 389 // Fire all listeners registered for this event. Don't fire listeners remove
d |
386 // during event dispatch. Also, don't fire event listeners added during even
t | 390 // during event dispatch. Also, don't fire event listeners added during even
t |
387 // dispatch. Conveniently, all new event listeners will be added after or at | 391 // dispatch. Conveniently, all new event listeners will be added after or at |
388 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes | 392 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 registeredListener.listener->handleEvent(context, event); | 448 registeredListener.listener->handleEvent(context, event); |
445 event->setHandlingPassive(false); | 449 event->setHandlingPassive(false); |
446 | 450 |
447 RELEASE_ASSERT(i <= size); | 451 RELEASE_ASSERT(i <= size); |
448 | 452 |
449 InspectorInstrumentation::didHandleEvent(cookie); | 453 InspectorInstrumentation::didHandleEvent(cookie); |
450 } | 454 } |
451 d->firingEventIterators->removeLast(); | 455 d->firingEventIterators->removeLast(); |
452 } | 456 } |
453 | 457 |
| 458 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) |
| 459 { |
| 460 if (event.defaultPrevented()) |
| 461 return DispatchEventResult::CanceledByEventHandler; |
| 462 if (event.defaultHandled()) |
| 463 return DispatchEventResult::CanceledByDefaultEventHandler; |
| 464 return DispatchEventResult::NotCanceled; |
| 465 } |
| 466 |
454 EventListenerVector* EventTarget::getEventListeners(const AtomicString& eventTyp
e) | 467 EventListenerVector* EventTarget::getEventListeners(const AtomicString& eventTyp
e) |
455 { | 468 { |
456 EventTargetData* data = eventTargetData(); | 469 EventTargetData* data = eventTargetData(); |
457 if (!data) | 470 if (!data) |
458 return nullptr; | 471 return nullptr; |
459 return data->eventListenerMap.find(eventType); | 472 return data->eventListenerMap.find(eventType); |
460 } | 473 } |
461 | 474 |
462 Vector<AtomicString> EventTarget::eventTypes() | 475 Vector<AtomicString> EventTarget::eventTypes() |
463 { | 476 { |
(...skipping 12 matching lines...) Expand all Loading... |
476 // they have one less listener to invoke. | 489 // they have one less listener to invoke. |
477 if (d->firingEventIterators) { | 490 if (d->firingEventIterators) { |
478 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 491 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
479 d->firingEventIterators->at(i).iterator = 0; | 492 d->firingEventIterators->at(i).iterator = 0; |
480 d->firingEventIterators->at(i).end = 0; | 493 d->firingEventIterators->at(i).end = 0; |
481 } | 494 } |
482 } | 495 } |
483 } | 496 } |
484 | 497 |
485 } // namespace blink | 498 } // namespace blink |
OLD | NEW |