| 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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 return false; | 153 return false; |
| 154 | 154 |
| 155 V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLo
ggerIfIsolatedWorld(); | 155 V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLo
ggerIfIsolatedWorld(); |
| 156 if (activityLogger) { | 156 if (activityLogger) { |
| 157 Vector<String> argv; | 157 Vector<String> argv; |
| 158 argv.append(toNode() ? toNode()->nodeName() : interfaceName()); | 158 argv.append(toNode() ? toNode()->nodeName() : interfaceName()); |
| 159 argv.append(eventType); | 159 argv.append(eventType); |
| 160 activityLogger->logEvent("blinkAddEventListener", argv.size(), argv.data
()); | 160 activityLogger->logEvent("blinkAddEventListener", argv.size(), argv.data
()); |
| 161 } | 161 } |
| 162 | 162 |
| 163 return ensureEventTargetData().eventListenerMap.add(eventType, listener, opt
ions); | 163 RegisteredEventListener registeredListener; |
| 164 bool added = ensureEventTargetData().eventListenerMap.add(eventType, listene
r, options, ®isteredListener); |
| 165 if (added) |
| 166 addedEventListener(eventType, registeredListener); |
| 167 return added; |
| 164 } | 168 } |
| 165 | 169 |
| 166 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen
er* listener, bool useCapture) | 170 void EventTarget::addedEventListener(const AtomicString& eventType, RegisteredEv
entListener& registeredListener) |
| 171 { |
| 172 } |
| 173 |
| 174 bool EventTarget::removeEventListener(const AtomicString& eventType, const Event
Listener* listener, bool useCapture) |
| 167 { | 175 { |
| 168 EventListenerOptions options; | 176 EventListenerOptions options; |
| 169 setDefaultEventListenerOptionsLegacy(options, useCapture); | 177 setDefaultEventListenerOptionsLegacy(options, useCapture); |
| 170 return removeEventListenerInternal(eventType, listener, options); | 178 return removeEventListenerInternal(eventType, listener, options); |
| 171 } | 179 } |
| 172 | 180 |
| 173 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen
er* listener, const EventListenerOptionsOrBoolean& optionsUnion) | 181 bool EventTarget::removeEventListener(const AtomicString& eventType, const Event
Listener* listener, const EventListenerOptionsOrBoolean& optionsUnion) |
| 174 { | 182 { |
| 175 if (optionsUnion.isBoolean()) | 183 if (optionsUnion.isBoolean()) |
| 176 return removeEventListener(eventType, listener, optionsUnion.getAsBoolea
n()); | 184 return removeEventListener(eventType, listener, optionsUnion.getAsBoolea
n()); |
| 177 if (optionsUnion.isEventListenerOptions()) { | 185 if (optionsUnion.isEventListenerOptions()) { |
| 178 EventListenerOptions options = optionsUnion.getAsEventListenerOptions(); | 186 EventListenerOptions options = optionsUnion.getAsEventListenerOptions(); |
| 179 return removeEventListener(eventType, listener, options); | 187 return removeEventListener(eventType, listener, options); |
| 180 } | 188 } |
| 181 return removeEventListener(eventType, listener); | 189 return removeEventListener(eventType, listener); |
| 182 } | 190 } |
| 183 | 191 |
| 184 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen
er* listener, EventListenerOptions& options) | 192 bool EventTarget::removeEventListener(const AtomicString& eventType, const Event
Listener* listener, EventListenerOptions& options) |
| 185 { | 193 { |
| 186 setDefaultEventListenerOptions(options); | 194 setDefaultEventListenerOptions(options); |
| 187 return removeEventListenerInternal(eventType, listener, options); | 195 return removeEventListenerInternal(eventType, listener, options); |
| 188 } | 196 } |
| 189 | 197 |
| 190 bool EventTarget::removeEventListenerInternal(const AtomicString& eventType, Eve
ntListener* listener, const EventListenerOptions& options) | 198 bool EventTarget::removeEventListenerInternal(const AtomicString& eventType, con
st EventListener* listener, const EventListenerOptions& options) |
| 191 { | 199 { |
| 192 if (!listener) | 200 if (!listener) |
| 193 return false; | 201 return false; |
| 194 | 202 |
| 195 EventTargetData* d = eventTargetData(); | 203 EventTargetData* d = eventTargetData(); |
| 196 if (!d) | 204 if (!d) |
| 197 return false; | 205 return false; |
| 198 | 206 |
| 199 size_t indexOfRemovedListener; | 207 size_t indexOfRemovedListener; |
| 208 RegisteredEventListener registeredListener; |
| 200 | 209 |
| 201 if (!d->eventListenerMap.remove(eventType, listener, options, indexOfRemoved
Listener)) | 210 if (!d->eventListenerMap.remove(eventType, listener, options, &indexOfRemove
dListener, ®isteredListener)) |
| 202 return false; | 211 return false; |
| 203 | 212 |
| 204 // Notify firing events planning to invoke the listener at 'index' that | 213 // Notify firing events planning to invoke the listener at 'index' that |
| 205 // they have one less listener to invoke. | 214 // they have one less listener to invoke. |
| 206 if (!d->firingEventIterators) | 215 if (d->firingEventIterators) { |
| 207 return true; | 216 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
| 208 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 217 FiringEventIterator& firingIterator = d->firingEventIterators->at(i)
; |
| 209 FiringEventIterator& firingIterator = d->firingEventIterators->at(i); | 218 if (eventType != firingIterator.eventType) |
| 210 if (eventType != firingIterator.eventType) | 219 continue; |
| 211 continue; | |
| 212 | 220 |
| 213 if (indexOfRemovedListener >= firingIterator.end) | 221 if (indexOfRemovedListener >= firingIterator.end) |
| 214 continue; | 222 continue; |
| 215 | 223 |
| 216 --firingIterator.end; | 224 --firingIterator.end; |
| 217 // Note that when firing an event listener, | 225 // Note that when firing an event listener, |
| 218 // firingIterator.iterator indicates the next event listener | 226 // firingIterator.iterator indicates the next event listener |
| 219 // that would fire, not the currently firing event | 227 // that would fire, not the currently firing event |
| 220 // listener. See EventTarget::fireEventListeners. | 228 // listener. See EventTarget::fireEventListeners. |
| 221 if (indexOfRemovedListener < firingIterator.iterator) | 229 if (indexOfRemovedListener < firingIterator.iterator) |
| 222 --firingIterator.iterator; | 230 --firingIterator.iterator; |
| 231 } |
| 223 } | 232 } |
| 233 removedEventListener(eventType, registeredListener); |
| 234 return true; |
| 235 } |
| 224 | 236 |
| 225 return true; | 237 void EventTarget::removedEventListener(const AtomicString& eventType, const Regi
steredEventListener& registeredListener) |
| 238 { |
| 226 } | 239 } |
| 227 | 240 |
| 228 bool EventTarget::setAttributeEventListener(const AtomicString& eventType, Event
Listener* listener) | 241 bool EventTarget::setAttributeEventListener(const AtomicString& eventType, Event
Listener* listener) |
| 229 { | 242 { |
| 230 clearAttributeEventListener(eventType); | 243 clearAttributeEventListener(eventType); |
| 231 if (!listener) | 244 if (!listener) |
| 232 return false; | 245 return false; |
| 233 return addEventListener(eventType, listener, false); | 246 return addEventListener(eventType, listener, false); |
| 234 } | 247 } |
| 235 | 248 |
| 236 EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventT
ype) | 249 EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventT
ype) |
| 237 { | 250 { |
| 238 EventListenerVector* listenerVector = getEventListeners(eventType); | 251 EventListenerVector* listenerVector = getEventListeners(eventType); |
| 239 if (!listenerVector) | 252 if (!listenerVector) |
| 240 return nullptr; | 253 return nullptr; |
| 241 for (const auto& eventListener : *listenerVector) { | 254 for (auto& eventListener : *listenerVector) { |
| 242 EventListener* listener = eventListener.listener.get(); | 255 EventListener* listener = eventListener.listener(); |
| 243 if (listener->isAttribute() && listener->belongsToTheCurrentWorld()) | 256 if (listener->isAttribute() && listener->belongsToTheCurrentWorld()) |
| 244 return listener; | 257 return listener; |
| 245 } | 258 } |
| 246 return nullptr; | 259 return nullptr; |
| 247 } | 260 } |
| 248 | 261 |
| 249 bool EventTarget::clearAttributeEventListener(const AtomicString& eventType) | 262 bool EventTarget::clearAttributeEventListener(const AtomicString& eventType) |
| 250 { | 263 { |
| 251 EventListener* listener = getAttributeEventListener(eventType); | 264 EventListener* listener = getAttributeEventListener(eventType); |
| 252 if (!listener) | 265 if (!listener) |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); | 435 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); |
| 423 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; | 436 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; |
| 424 while (i < size) { | 437 while (i < size) { |
| 425 RegisteredEventListener& registeredListener = entry[i]; | 438 RegisteredEventListener& registeredListener = entry[i]; |
| 426 | 439 |
| 427 // Move the iterator past this event listener. This must match | 440 // Move the iterator past this event listener. This must match |
| 428 // the handling of the FiringEventIterator::iterator in | 441 // the handling of the FiringEventIterator::iterator in |
| 429 // EventTarget::removeEventListener. | 442 // EventTarget::removeEventListener. |
| 430 ++i; | 443 ++i; |
| 431 | 444 |
| 432 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener
.useCapture) | 445 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener
.capture()) |
| 433 continue; | 446 continue; |
| 434 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.u
seCapture) | 447 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.c
apture()) |
| 435 continue; | 448 continue; |
| 436 | 449 |
| 437 // If stopImmediatePropagation has been called, we just break out immedi
ately, without | 450 // If stopImmediatePropagation has been called, we just break out immedi
ately, without |
| 438 // handling any more events on this target. | 451 // handling any more events on this target. |
| 439 if (event->immediatePropagationStopped()) | 452 if (event->immediatePropagationStopped()) |
| 440 break; | 453 break; |
| 441 | 454 |
| 442 ExecutionContext* context = getExecutionContext(); | 455 ExecutionContext* context = getExecutionContext(); |
| 443 if (!context) | 456 if (!context) |
| 444 break; | 457 break; |
| 445 | 458 |
| 446 event->setHandlingPassive(registeredListener.passive); | 459 event->setHandlingPassive(registeredListener.passive()); |
| 447 | 460 |
| 448 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi
s, event); | 461 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi
s, event); |
| 449 | 462 |
| 450 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng | 463 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng |
| 451 // event listeners, even though that violates some versions of the DOM s
pec. | 464 // event listeners, even though that violates some versions of the DOM s
pec. |
| 452 registeredListener.listener->handleEvent(context, event); | 465 registeredListener.listener()->handleEvent(context, event); |
| 453 event->setHandlingPassive(false); | 466 event->setHandlingPassive(false); |
| 454 | 467 |
| 455 RELEASE_ASSERT(i <= size); | 468 RELEASE_ASSERT(i <= size); |
| 456 } | 469 } |
| 457 d->firingEventIterators->removeLast(); | 470 d->firingEventIterators->removeLast(); |
| 458 } | 471 } |
| 459 | 472 |
| 460 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) | 473 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) |
| 461 { | 474 { |
| 462 if (event.defaultPrevented()) | 475 if (event.defaultPrevented()) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 491 // they have one less listener to invoke. | 504 // they have one less listener to invoke. |
| 492 if (d->firingEventIterators) { | 505 if (d->firingEventIterators) { |
| 493 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 506 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
| 494 d->firingEventIterators->at(i).iterator = 0; | 507 d->firingEventIterators->at(i).iterator = 0; |
| 495 d->firingEventIterators->at(i).end = 0; | 508 d->firingEventIterators->at(i).end = 0; |
| 496 } | 509 } |
| 497 } | 510 } |
| 498 } | 511 } |
| 499 | 512 |
| 500 } // namespace blink | 513 } // namespace blink |
| OLD | NEW |