Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: third_party/WebKit/Source/core/events/EventTarget.cpp

Issue 1942723004: Change EventTarget callback APIs for add/RemoveEventListenerInternal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix win32 signed/unsigned issue Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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, &registeredListener);
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, &registeredListener))
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/events/EventTarget.h ('k') | third_party/WebKit/Source/core/events/RegisteredEventListener.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698