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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 Node* EventTarget::toNode() | 61 Node* EventTarget::toNode() |
62 { | 62 { |
63 return 0; | 63 return 0; |
64 } | 64 } |
65 | 65 |
66 DOMWindow* EventTarget::toDOMWindow() | 66 DOMWindow* EventTarget::toDOMWindow() |
67 { | 67 { |
68 return 0; | 68 return 0; |
69 } | 69 } |
70 | 70 |
| 71 inline DOMWindow* EventTarget::executingWindow() |
| 72 { |
| 73 if (ScriptExecutionContext* context = scriptExecutionContext()) |
| 74 return context->executingWindow(); |
| 75 return 0; |
| 76 } |
| 77 |
71 bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<Eve
ntListener> listener, bool useCapture) | 78 bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<Eve
ntListener> listener, bool useCapture) |
72 { | 79 { |
73 EventTargetData* d = ensureEventTargetData(); | 80 EventTargetData* d = ensureEventTargetData(); |
74 return d->eventListenerMap.add(eventType, listener, useCapture); | 81 return d->eventListenerMap.add(eventType, listener, useCapture); |
75 } | 82 } |
76 | 83 |
77 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen
er* listener, bool useCapture) | 84 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen
er* listener, bool useCapture) |
78 { | 85 { |
79 EventTargetData* d = eventTargetData(); | 86 EventTargetData* d = eventTargetData(); |
80 if (!d) | 87 if (!d) |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 if (listenerUnprefixedVector) | 203 if (listenerUnprefixedVector) |
197 fireEventListeners(event, d, *listenerUnprefixedVector); | 204 fireEventListeners(event, d, *listenerUnprefixedVector); |
198 else if (listenerPrefixedVector) { | 205 else if (listenerPrefixedVector) { |
199 AtomicString unprefixedTypeName = event->type(); | 206 AtomicString unprefixedTypeName = event->type(); |
200 event->setType(prefixedTypeName); | 207 event->setType(prefixedTypeName); |
201 fireEventListeners(event, d, *listenerPrefixedVector); | 208 fireEventListeners(event, d, *listenerPrefixedVector); |
202 event->setType(unprefixedTypeName); | 209 event->setType(unprefixedTypeName); |
203 } | 210 } |
204 | 211 |
205 if (!prefixedTypeName.isEmpty()) { | 212 if (!prefixedTypeName.isEmpty()) { |
206 ScriptExecutionContext* context = scriptExecutionContext(); | 213 if (DOMWindow* executingWindow = this->executingWindow()) { |
207 if (context && context->isDocument()) { | 214 if (listenerPrefixedVector) { |
208 Document* document = toDocument(context); | 215 if (listenerUnprefixedVector) |
209 if (document->domWindow()) { | 216 UseCounter::count(executingWindow, UseCounter::PrefixedAndUn
prefixedTransitionEndEvent); |
210 if (listenerPrefixedVector) | 217 else |
211 if (listenerUnprefixedVector) | 218 UseCounter::count(executingWindow, UseCounter::PrefixedTrans
itionEndEvent); |
212 UseCounter::count(document->domWindow(), UseCounter::Pre
fixedAndUnprefixedTransitionEndEvent); | 219 } else if (listenerUnprefixedVector) { |
213 else | 220 UseCounter::count(executingWindow, UseCounter::UnprefixedTransit
ionEndEvent); |
214 UseCounter::count(document->domWindow(), UseCounter::Pre
fixedTransitionEndEvent); | |
215 else if (listenerUnprefixedVector) | |
216 UseCounter::count(document->domWindow(), UseCounter::Unprefi
xedTransitionEndEvent); | |
217 } | 221 } |
218 } | 222 } |
219 } | 223 } |
220 | 224 |
221 return !event->defaultPrevented(); | 225 return !event->defaultPrevented(); |
222 } | 226 } |
223 | 227 |
224 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) | 228 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) |
225 { | 229 { |
226 RefPtr<EventTarget> protect = this; | 230 RefPtr<EventTarget> protect = this; |
227 | 231 |
228 // Fire all listeners registered for this event. Don't fire listeners remove
d | 232 // Fire all listeners registered for this event. Don't fire listeners remove
d |
229 // during event dispatch. Also, don't fire event listeners added during even
t | 233 // during event dispatch. Also, don't fire event listeners added during even
t |
230 // dispatch. Conveniently, all new event listeners will be added after or at | 234 // dispatch. Conveniently, all new event listeners will be added after or at |
231 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes | 235 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes |
232 // new event listeners. | 236 // new event listeners. |
233 | 237 |
234 ScriptExecutionContext* context = scriptExecutionContext(); | 238 if (event->type() == eventNames().beforeunloadEvent) { |
235 if (context && context->isDocument() && event->type() == eventNames().before
unloadEvent) { | 239 if (DOMWindow* executingWindow = this->executingWindow()) { |
236 Document* document = toDocument(context); | 240 if (executingWindow->top()) |
237 if (DOMWindow* domWindow = document->domWindow()) { | 241 UseCounter::count(executingWindow, UseCounter::SubFrameBeforeUnl
oadFired); |
238 if (domWindow != domWindow->top()) | |
239 UseCounter::count(domWindow, UseCounter::SubFrameBeforeUnloadFir
ed); | |
240 } | 242 } |
241 } | 243 } |
242 | 244 |
243 bool userEventWasHandled = false; | 245 bool userEventWasHandled = false; |
244 size_t i = 0; | 246 size_t i = 0; |
245 size_t size = entry.size(); | 247 size_t size = entry.size(); |
246 if (!d->firingEventIterators) | 248 if (!d->firingEventIterators) |
247 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); | 249 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); |
248 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; | 250 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; |
249 for ( ; i < size; ++i) { | 251 for ( ; i < size; ++i) { |
(...skipping 12 matching lines...) Expand all Loading... |
262 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willHa
ndleEvent(context, event); | 264 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willHa
ndleEvent(context, event); |
263 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng | 265 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng |
264 // event listeners, even though that violates some versions of the DOM s
pec. | 266 // event listeners, even though that violates some versions of the DOM s
pec. |
265 registeredListener.listener->handleEvent(context, event); | 267 registeredListener.listener->handleEvent(context, event); |
266 if (!userEventWasHandled && ScriptController::processingUserGesture()) | 268 if (!userEventWasHandled && ScriptController::processingUserGesture()) |
267 userEventWasHandled = true; | 269 userEventWasHandled = true; |
268 InspectorInstrumentation::didHandleEvent(cookie); | 270 InspectorInstrumentation::didHandleEvent(cookie); |
269 } | 271 } |
270 d->firingEventIterators->removeLast(); | 272 d->firingEventIterators->removeLast(); |
271 if (userEventWasHandled) { | 273 if (userEventWasHandled) { |
272 ScriptExecutionContext* context = scriptExecutionContext(); | 274 if (ScriptExecutionContext* context = scriptExecutionContext()) |
273 if (context && context->isDocument()) { | 275 context->userEventWasHandled(); |
274 Document* document = toDocument(context); | |
275 document->resetLastHandledUserGestureTimestamp(); | |
276 } | |
277 } | 276 } |
278 } | 277 } |
279 | 278 |
280 const EventListenerVector& EventTarget::getEventListeners(const AtomicString& ev
entType) | 279 const EventListenerVector& EventTarget::getEventListeners(const AtomicString& ev
entType) |
281 { | 280 { |
282 DEFINE_STATIC_LOCAL(EventListenerVector, emptyVector, ()); | 281 DEFINE_STATIC_LOCAL(EventListenerVector, emptyVector, ()); |
283 | 282 |
284 EventTargetData* d = eventTargetData(); | 283 EventTargetData* d = eventTargetData(); |
285 if (!d) | 284 if (!d) |
286 return emptyVector; | 285 return emptyVector; |
(...skipping 16 matching lines...) Expand all Loading... |
303 // they have one less listener to invoke. | 302 // they have one less listener to invoke. |
304 if (d->firingEventIterators) { | 303 if (d->firingEventIterators) { |
305 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 304 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
306 d->firingEventIterators->at(i).iterator = 0; | 305 d->firingEventIterators->at(i).iterator = 0; |
307 d->firingEventIterators->at(i).end = 0; | 306 d->firingEventIterators->at(i).end = 0; |
308 } | 307 } |
309 } | 308 } |
310 } | 309 } |
311 | 310 |
312 } // namespace WebCore | 311 } // namespace WebCore |
OLD | NEW |