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