15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventTarget.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8DOMActivityLogger.h"
37521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/dom/ExceptionCode.h"
385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/editing/Editor.h"
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/events/Event.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
4176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/frame/UseCounter.h"
43e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "platform/EventDispatchForbiddenScope.h"
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/StdLibExtras.h"
46591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventTargetData::EventTargetData()
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventTargetData::~EventTargetData()
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60197021e6b966cfb06891637935ef33fff06433d1Ben MurdochEventTarget::EventTarget()
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventTarget::~EventTarget()
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* EventTarget::toNode()
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)LocalDOMWindow* EventTarget::toDOMWindow()
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)MessagePort* EventTarget::toMessagePort()
79e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
80e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return 0;
81e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
82e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
8376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)inline LocalDOMWindow* EventTarget::executingWindow()
843c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{
851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (ExecutionContext* context = executionContext())
863c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        return context->executingWindow();
873c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return 0;
883c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch}
893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // FIXME: listener null check should throw TypeError (and be done in
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // generated bindings), but breaks legacy content. http://crbug.com/249598
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!listener)
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return false;
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld();
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (activityLogger) {
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        Vector<String> argv;
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        argv.append(toNode() ? toNode()->nodeName() : interfaceName());
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        argv.append(eventType);
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        activityLogger->logEvent("blinkAddEventListener", argv.size(), argv.data());
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return ensureEventTargetData().eventListenerMap.add(eventType, listener, useCapture);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool EventTarget::removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: listener null check should throw TypeError (and be done in
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // generated bindings), but breaks legacy content. http://crbug.com/249598
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!listener)
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTargetData* d = eventTargetData();
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t indexOfRemovedListener;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!d->eventListenerMap.remove(eventType, listener.get(), useCapture, indexOfRemovedListener))
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Notify firing events planning to invoke the listener at 'index' that
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // they have one less listener to invoke.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d->firingEventIterators)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < d->firingEventIterators->size(); ++i) {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FiringEventIterator& firingIterator = d->firingEventIterators->at(i);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (eventType != firingIterator.eventType)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (indexOfRemovedListener >= firingIterator.end)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        --firingIterator.end;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (indexOfRemovedListener <= firingIterator.iterator)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            --firingIterator.iterator;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    clearAttributeEventListener(eventType);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!listener)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return addEventListener(eventType, listener, false);
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const EventListenerVector& entry = getEventListeners(eventType);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < entry.size(); ++i) {
156521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        EventListener* listener = entry[i].listener.get();
15709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (listener->isAttribute() && listener->belongsToTheCurrentWorld())
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return listener;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool EventTarget::clearAttributeEventListener(const AtomicString& eventType)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EventListener* listener = getAttributeEventListener(eventType);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!listener)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return removeEventListener(eventType, listener, false);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool EventTarget::dispatchEvent(PassRefPtrWillBeRawPtr<Event> event, ExceptionState& exceptionState)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
173f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!event) {
174a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The event provided is null.");
175f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return false;
176f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
177f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (event->type().isEmpty()) {
178a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The event provided is uninitialized.");
179f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return false;
180f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
181f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (event->isBeingDispatched()) {
182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The event is already being dispatched.");
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!executionContext())
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return dispatchEvent(event);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
192a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool EventTarget::dispatchEvent(PassRefPtrWillBeRawPtr<Event> event)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setTarget(this);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setCurrentTarget(this);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setEventPhase(Event::AT_TARGET);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool defaultPrevented = fireEventListeners(event.get());
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setEventPhase(0);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return defaultPrevented;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventTarget::uncaughtExceptionInEventHandler()
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const AtomicString& legacyType(const Event* event)
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::transitionend)
2091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::webkitTransitionEnd;
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::animationstart)
2121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::webkitAnimationStart;
213c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::animationend)
2151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::webkitAnimationEnd;
216c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::animationiteration)
2181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::webkitAnimationIteration;
219c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::wheel)
2211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::mousewheel;
222e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return emptyAtom;
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
226c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void EventTarget::countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVector* listenersVector, EventListenerVector* legacyListenersVector)
227c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
228c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    UseCounter::Feature unprefixedFeature;
229c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    UseCounter::Feature prefixedFeature;
230c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    UseCounter::Feature prefixedAndUnprefixedFeature;
2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (legacyTypeName == EventTypeNames::webkitTransitionEnd) {
232c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedFeature = UseCounter::PrefixedTransitionEndEvent;
233c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        unprefixedFeature = UseCounter::UnprefixedTransitionEndEvent;
234c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedAndUnprefixedFeature = UseCounter::PrefixedAndUnprefixedTransitionEndEvent;
2351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (legacyTypeName == EventTypeNames::webkitAnimationEnd) {
236c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedFeature = UseCounter::PrefixedAnimationEndEvent;
237c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        unprefixedFeature = UseCounter::UnprefixedAnimationEndEvent;
238c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedAndUnprefixedFeature = UseCounter::PrefixedAndUnprefixedAnimationEndEvent;
2391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (legacyTypeName == EventTypeNames::webkitAnimationStart) {
240c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedFeature = UseCounter::PrefixedAnimationStartEvent;
241c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        unprefixedFeature = UseCounter::UnprefixedAnimationStartEvent;
242c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedAndUnprefixedFeature = UseCounter::PrefixedAndUnprefixedAnimationStartEvent;
2431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (legacyTypeName == EventTypeNames::webkitAnimationIteration) {
244c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedFeature = UseCounter::PrefixedAnimationIterationEvent;
245c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        unprefixedFeature = UseCounter::UnprefixedAnimationIterationEvent;
246c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        prefixedAndUnprefixedFeature = UseCounter::PrefixedAndUnprefixedAnimationIterationEvent;
247197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else {
248197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
249c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
250c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
251197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (LocalDOMWindow* executingWindow = this->executingWindow()) {
252197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (legacyListenersVector) {
253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (listenersVector)
254197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                UseCounter::count(executingWindow->document(), prefixedAndUnprefixedFeature);
255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            else
256197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                UseCounter::count(executingWindow->document(), prefixedFeature);
257197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else if (listenersVector) {
258197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            UseCounter::count(executingWindow->document(), unprefixedFeature);
259c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        }
260c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
261c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
262c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventTarget::fireEventListeners(Event* event)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
265e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden());
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(event && !event->type().isEmpty());
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTargetData* d = eventTargetData();
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
272e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    EventListenerVector* legacyListenersVector = 0;
273e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    AtomicString legacyTypeName = legacyType(event);
274e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!legacyTypeName.isEmpty())
275e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        legacyListenersVector = d->eventListenerMap.find(legacyTypeName);
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
277e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    EventListenerVector* listenersVector = d->eventListenerMap.find(event->type());
2781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled() && (event->type() == EventTypeNames::animationiteration || event->type() == EventTypeNames::animationend
279f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        || event->type() == EventTypeNames::animationstart)
280f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // Some code out-there uses custom events to dispatch unprefixed animation events manually,
281f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // we can safely remove all this block when cssAnimationUnprefixedEnabled is always on, this
282f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // is really a special case. DO NOT ADD MORE EVENTS HERE.
283f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        && event->interfaceName() != EventNames::CustomEvent)
284c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        listenersVector = 0;
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
286e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (listenersVector) {
287e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        fireEventListeners(event, d, *listenersVector);
288e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else if (legacyListenersVector) {
28993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        AtomicString unprefixedTypeName = event->type();
290e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        event->setType(legacyTypeName);
291e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        fireEventListeners(event, d, *legacyListenersVector);
29293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        event->setType(unprefixedTypeName);
29393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Editor::countEvent(executionContext(), event);
296c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !event->defaultPrevented();
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventListenerVector& entry)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
302f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeRawPtr<EventTarget> protect(this);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fire all listeners registered for this event. Don't fire listeners removed
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // during event dispatch. Also, don't fire event listeners added during event
306f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // dispatch. Conveniently, all new event listeners will be added after or at
307f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // index |size|, so iterating up to (but not including) |size| naturally excludes
308f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // new event listeners.
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::beforeunload) {
31176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        if (LocalDOMWindow* executingWindow = this->executingWindow()) {
3123c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (executingWindow->top())
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                UseCounter::count(executingWindow->document(), UseCounter::SubFrameBeforeUnloadFired);
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            UseCounter::count(executingWindow->document(), UseCounter::DocumentBeforeUnloadFired);
3151fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        }
31651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else if (event->type() == EventTypeNames::unload) {
31776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        if (LocalDOMWindow* executingWindow = this->executingWindow())
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            UseCounter::count(executingWindow->document(), UseCounter::DocumentUnloadFired);
319f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    } else if (event->type() == EventTypeNames::DOMFocusIn || event->type() == EventTypeNames::DOMFocusOut) {
32076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        if (LocalDOMWindow* executingWindow = this->executingWindow())
321f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            UseCounter::count(executingWindow->document(), UseCounter::DOMFocusInOutEvent);
322f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    } else if (event->type() == EventTypeNames::focusin || event->type() == EventTypeNames::focusout) {
32376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        if (LocalDOMWindow* executingWindow = this->executingWindow())
324f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            UseCounter::count(executingWindow->document(), UseCounter::FocusInOutEvent);
3251fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    }
3261fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t i = 0;
328f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    size_t size = entry.size();
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d->firingEventIterators)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        d->firingEventIterators = adoptPtr(new FiringEventIteratorVector);
331f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    d->firingEventIterators->append(FiringEventIterator(event->type(), i, size));
332f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for ( ; i < size; ++i) {
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RegisteredEventListener& registeredListener = entry[i];
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener.useCapture)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.useCapture)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If stopImmediatePropagation has been called, we just break out immediately, without
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // handling any more events on this target.
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->immediatePropagationStopped())
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        ExecutionContext* context = executionContext();
3458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!context)
3468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            break;
3478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorInstrumentationCookie cookie = InspectorInstrumentation::willHandleEvent(this, event, registeredListener.listener.get(), registeredListener.useCapture);
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // To match Mozilla, the AT_TARGET phase fires both capturing and bubbling
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // event listeners, even though that violates some versions of the DOM spec.
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        registeredListener.listener->handleEvent(context, event);
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InspectorInstrumentation::didHandleEvent(cookie);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    d->firingEventIterators->removeLast();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const EventListenerVector& EventTarget::getEventListeners(const AtomicString& eventType)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(EventListenerVector, emptyVector, ());
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTargetData* d = eventTargetData();
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return emptyVector;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventListenerVector* listenerVector = d->eventListenerMap.find(eventType);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!listenerVector)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return emptyVector;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *listenerVector;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Vector<AtomicString> EventTarget::eventTypes()
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EventTargetData* d = eventTargetData();
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return d ? d->eventListenerMap.eventTypes() : Vector<AtomicString>();
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventTarget::removeAllEventListeners()
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTargetData* d = eventTargetData();
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!d)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    d->eventListenerMap.clear();
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Notify firing events planning to invoke the listener at 'index' that
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // they have one less listener to invoke.
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (d->firingEventIterators) {
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < d->firingEventIterators->size(); ++i) {
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            d->firingEventIterators->at(i).iterator = 0;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            d->firingEventIterators->at(i).end = 0;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
396