| 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, 2008 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 virtual MessagePort* toMessagePort(); | 109 virtual MessagePort* toMessagePort(); |
| 110 | 110 |
| 111 virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<Even
tListener>, bool useCapture); | 111 virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<Even
tListener>, bool useCapture); |
| 112 virtual bool removeEventListener(const AtomicString& eventType, EventListene
r*, bool useCapture); | 112 virtual bool removeEventListener(const AtomicString& eventType, EventListene
r*, bool useCapture); |
| 113 virtual void removeAllEventListeners(); | 113 virtual void removeAllEventListeners(); |
| 114 virtual bool dispatchEvent(PassRefPtr<Event>); | 114 virtual bool dispatchEvent(PassRefPtr<Event>); |
| 115 bool dispatchEvent(PassRefPtr<Event>, ExceptionState&); // DOM API | 115 bool dispatchEvent(PassRefPtr<Event>, ExceptionState&); // DOM API |
| 116 virtual void uncaughtExceptionInEventHandler(); | 116 virtual void uncaughtExceptionInEventHandler(); |
| 117 | 117 |
| 118 // Used for legacy "onEvent" attribute APIs. | 118 // Used for legacy "onEvent" attribute APIs. |
| 119 bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<Eve
ntListener>, DOMWrapperWorld* isolatedWorld = 0); | 119 bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<Eve
ntListener>); |
| 120 EventListener* getAttributeEventListener(const AtomicString& eventType, DOMW
rapperWorld* isolatedWorld = 0); | 120 EventListener* getAttributeEventListener(const AtomicString& eventType); |
| 121 | 121 |
| 122 bool hasEventListeners() const; | 122 bool hasEventListeners() const; |
| 123 bool hasEventListeners(const AtomicString& eventType) const; | 123 bool hasEventListeners(const AtomicString& eventType) const; |
| 124 bool hasCapturingEventListeners(const AtomicString& eventType); | 124 bool hasCapturingEventListeners(const AtomicString& eventType); |
| 125 const EventListenerVector& getEventListeners(const AtomicString& eventType); | 125 const EventListenerVector& getEventListeners(const AtomicString& eventType); |
| 126 Vector<AtomicString> eventTypes(); | 126 Vector<AtomicString> eventTypes(); |
| 127 | 127 |
| 128 bool fireEventListeners(Event*); | 128 bool fireEventListeners(Event*); |
| 129 | 129 |
| 130 protected: | 130 protected: |
| 131 virtual ~EventTarget(); | 131 virtual ~EventTarget(); |
| 132 | 132 |
| 133 // Subclasses should likely not override these themselves; instead, they sho
uld subclass EventTargetWithInlineData. | 133 // Subclasses should likely not override these themselves; instead, they sho
uld subclass EventTargetWithInlineData. |
| 134 virtual EventTargetData* eventTargetData() = 0; | 134 virtual EventTargetData* eventTargetData() = 0; |
| 135 virtual EventTargetData& ensureEventTargetData() = 0; | 135 virtual EventTargetData& ensureEventTargetData() = 0; |
| 136 | 136 |
| 137 private: | 137 private: |
| 138 // Subclasses should likely not override these themselves; instead, they sho
uld use the REFCOUNTED_EVENT_TARGET() macro. | 138 // Subclasses should likely not override these themselves; instead, they sho
uld use the REFCOUNTED_EVENT_TARGET() macro. |
| 139 virtual void refEventTarget() = 0; | 139 virtual void refEventTarget() = 0; |
| 140 virtual void derefEventTarget() = 0; | 140 virtual void derefEventTarget() = 0; |
| 141 | 141 |
| 142 DOMWindow* executingWindow(); | 142 DOMWindow* executingWindow(); |
| 143 void fireEventListeners(Event*, EventTargetData*, EventListenerVector&); | 143 void fireEventListeners(Event*, EventTargetData*, EventListenerVector&); |
| 144 void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVect
or*, EventListenerVector*); | 144 void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVect
or*, EventListenerVector*); |
| 145 | 145 |
| 146 bool clearAttributeEventListener(const AtomicString& eventType, DOMWrapperWo
rld* isolatedWorld); | 146 bool clearAttributeEventListener(const AtomicString& eventType); |
| 147 | 147 |
| 148 friend class EventListenerIterator; | 148 friend class EventListenerIterator; |
| 149 }; | 149 }; |
| 150 | 150 |
| 151 class EventTargetWithInlineData : public EventTarget { | 151 class EventTargetWithInlineData : public EventTarget { |
| 152 protected: | 152 protected: |
| 153 virtual EventTargetData* eventTargetData() OVERRIDE FINAL { return &m_eventT
argetData; } | 153 virtual EventTargetData* eventTargetData() OVERRIDE FINAL { return &m_eventT
argetData; } |
| 154 virtual EventTargetData& ensureEventTargetData() OVERRIDE FINAL { return m_e
ventTargetData; } | 154 virtual EventTargetData& ensureEventTargetData() OVERRIDE FINAL { return m_e
ventTargetData; } |
| 155 private: | 155 private: |
| 156 EventTargetData m_eventTargetData; | 156 EventTargetData m_eventTargetData; |
| 157 }; | 157 }; |
| 158 | 158 |
| 159 // FIXME: These macros should be split into separate DEFINE and DECLARE | 159 // FIXME: These macros should be split into separate DEFINE and DECLARE |
| 160 // macros to avoid causing so many header includes. | 160 // macros to avoid causing so many header includes. |
| 161 #define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \ | 161 #define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
| 162 EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAtt
ributeEventListener(EventTypeNames::attribute, isolatedWorld); } \ | 162 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN
ames::attribute); } \ |
| 163 void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* i
solatedWorld = 0) { setAttributeEventListener(EventTypeNames::attribute, listene
r, isolatedWorld); } \ | 163 void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEven
tListener(EventTypeNames::attribute, listener); } \ |
| 164 | 164 |
| 165 #define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \ | 165 #define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
| 166 static EventListener* on##attribute(EventTarget* eventTarget, DOMWrapperWorl
d* isolatedWorld) { return eventTarget->getAttributeEventListener(EventTypeNames
::attribute, isolatedWorld); } \ | 166 static EventListener* on##attribute(EventTarget* eventTarget) { return event
Target->getAttributeEventListener(EventTypeNames::attribute); } \ |
| 167 static void setOn##attribute(EventTarget* eventTarget, PassRefPtr<EventListe
ner> listener, DOMWrapperWorld* isolatedWorld = 0) { eventTarget->setAttributeEv
entListener(EventTypeNames::attribute, listener, isolatedWorld); } \ | 167 static void setOn##attribute(EventTarget* eventTarget, PassRefPtr<EventListe
ner> listener) { eventTarget->setAttributeEventListener(EventTypeNames::attribut
e, listener); } \ |
| 168 | 168 |
| 169 #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ | 169 #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
| 170 EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return docume
nt().getWindowAttributeEventListener(EventTypeNames::attribute, isolatedWorld);
} \ | 170 EventListener* on##attribute() { return document().getWindowAttributeEventLi
stener(EventTypeNames::attribute); } \ |
| 171 void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* i
solatedWorld) { document().setWindowAttributeEventListener(EventTypeNames::attri
bute, listener, isolatedWorld); } \ | 171 void setOn##attribute(PassRefPtr<EventListener> listener) { document().setWi
ndowAttributeEventListener(EventTypeNames::attribute, listener); } \ |
| 172 | 172 |
| 173 #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ | 173 #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
| 174 static EventListener* on##attribute(EventTarget* eventTarget, DOMWrapperWorl
d* isolatedWorld) { \ | 174 static EventListener* on##attribute(EventTarget* eventTarget) { \ |
| 175 if (Node* node = eventTarget->toNode()) \ | 175 if (Node* node = eventTarget->toNode()) \ |
| 176 return node->document().getWindowAttributeEventListener(EventTypeNam
es::attribute, isolatedWorld); \ | 176 return node->document().getWindowAttributeEventListener(EventTypeNam
es::attribute); \ |
| 177 ASSERT(eventTarget->toDOMWindow()); \ | 177 ASSERT(eventTarget->toDOMWindow()); \ |
| 178 return eventTarget->getAttributeEventListener(EventTypeNames::attribute,
isolatedWorld); \ | 178 return eventTarget->getAttributeEventListener(EventTypeNames::attribute)
; \ |
| 179 } \ | 179 } \ |
| 180 static void setOn##attribute(EventTarget* eventTarget, PassRefPtr<EventListe
ner> listener, DOMWrapperWorld* isolatedWorld) { \ | 180 static void setOn##attribute(EventTarget* eventTarget, PassRefPtr<EventListe
ner> listener) { \ |
| 181 if (Node* node = eventTarget->toNode()) \ | 181 if (Node* node = eventTarget->toNode()) \ |
| 182 node->document().setWindowAttributeEventListener(EventTypeNames::att
ribute, listener, isolatedWorld); \ | 182 node->document().setWindowAttributeEventListener(EventTypeNames::att
ribute, listener); \ |
| 183 else { \ | 183 else { \ |
| 184 ASSERT(eventTarget->toDOMWindow()); \ | 184 ASSERT(eventTarget->toDOMWindow()); \ |
| 185 eventTarget->setAttributeEventListener(EventTypeNames::attribute, li
stener, isolatedWorld); \ | 185 eventTarget->setAttributeEventListener(EventTypeNames::attribute, li
stener); \ |
| 186 } \ | 186 } \ |
| 187 } | 187 } |
| 188 | 188 |
| 189 #define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \ | 189 #define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \ |
| 190 EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAtt
ributeEventListener(EventTypeNames::eventName, isolatedWorld); } \ | 190 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN
ames::eventName); } \ |
| 191 void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* i
solatedWorld) { setAttributeEventListener(EventTypeNames::eventName, listener, i
solatedWorld); } \ | 191 void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEven
tListener(EventTypeNames::eventName, listener); } \ |
| 192 | 192 |
| 193 #define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \ | 193 #define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \ |
| 194 EventListener* on##attribute(DOMWrapperWorld* isolatedWorld); \ | 194 EventListener* on##attribute(); \ |
| 195 void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* i
solatedWorld); | 195 void setOn##attribute(PassRefPtr<EventListener> listener); |
| 196 | 196 |
| 197 #define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \ | 197 #define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \ |
| 198 EventListener* type::on##attribute(DOMWrapperWorld* isolatedWorld) { return
recipient ? recipient->getAttributeEventListener(EventTypeNames::attribute, isol
atedWorld) : 0; } \ | 198 EventListener* type::on##attribute() { return recipient ? recipient->getAttr
ibuteEventListener(EventTypeNames::attribute) : 0; } \ |
| 199 void type::setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWo
rld* isolatedWorld) \ | 199 void type::setOn##attribute(PassRefPtr<EventListener> listener) \ |
| 200 { \ | 200 { \ |
| 201 if (recipient) \ | 201 if (recipient) \ |
| 202 recipient->setAttributeEventListener(EventTypeNames::attribute, list
ener, isolatedWorld); \ | 202 recipient->setAttributeEventListener(EventTypeNames::attribute, list
ener); \ |
| 203 } | 203 } |
| 204 | 204 |
| 205 inline bool EventTarget::hasEventListeners() const | 205 inline bool EventTarget::hasEventListeners() const |
| 206 { | 206 { |
| 207 // FIXME: We should have a const version of eventTargetData. | 207 // FIXME: We should have a const version of eventTargetData. |
| 208 if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetDa
ta()) | 208 if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetDa
ta()) |
| 209 return !d->eventListenerMap.isEmpty(); | 209 return !d->eventListenerMap.isEmpty(); |
| 210 return false; | 210 return false; |
| 211 } | 211 } |
| 212 | 212 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 236 virtual void refEventTarget() OVERRIDE FINAL { ref(); } \ | 236 virtual void refEventTarget() OVERRIDE FINAL { ref(); } \ |
| 237 virtual void derefEventTarget() OVERRIDE FINAL { deref(); } \ | 237 virtual void derefEventTarget() OVERRIDE FINAL { deref(); } \ |
| 238 typedef int thisIsHereToForceASemiColonAfterThisEventTargetMacro | 238 typedef int thisIsHereToForceASemiColonAfterThisEventTargetMacro |
| 239 | 239 |
| 240 // Use this macro if your EventTarget subclass is also a subclass of WTF::RefCou
nted. | 240 // Use this macro if your EventTarget subclass is also a subclass of WTF::RefCou
nted. |
| 241 // A ref-counted class that uses a different method of refcounting should use DE
FINE_EVENT_TARGET_REFCOUNTING directly. | 241 // A ref-counted class that uses a different method of refcounting should use DE
FINE_EVENT_TARGET_REFCOUNTING directly. |
| 242 // Both of these macros are meant to be placed just before the "public:" section
of the class declaration. | 242 // Both of these macros are meant to be placed just before the "public:" section
of the class declaration. |
| 243 #define REFCOUNTED_EVENT_TARGET(className) DEFINE_EVENT_TARGET_REFCOUNTING(RefCo
unted<className>) | 243 #define REFCOUNTED_EVENT_TARGET(className) DEFINE_EVENT_TARGET_REFCOUNTING(RefCo
unted<className>) |
| 244 | 244 |
| 245 #endif // EventTarget_h | 245 #endif // EventTarget_h |
| OLD | NEW |