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

Side by Side Diff: Source/core/events/EventTarget.h

Issue 1238083002: Oilpan: Move the EventListener hierarchy to Oilpan's heap (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 , end(end) 56 , end(end)
57 { 57 {
58 } 58 }
59 59
60 const AtomicString& eventType; 60 const AtomicString& eventType;
61 size_t& iterator; 61 size_t& iterator;
62 size_t& end; 62 size_t& end;
63 }; 63 };
64 typedef Vector<FiringEventIterator, 1> FiringEventIteratorVector; 64 typedef Vector<FiringEventIterator, 1> FiringEventIteratorVector;
65 65
66 struct CORE_EXPORT EventTargetData { 66 class CORE_EXPORT EventTargetData final : public NoBaseWillBeGarbageCollectedFin alized<EventTargetData> {
67 WTF_MAKE_NONCOPYABLE(EventTargetData); WTF_MAKE_FAST_ALLOCATED(EventTargetDa ta); 67 WTF_MAKE_NONCOPYABLE(EventTargetData);
68 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED(EventTargetData);
68 public: 69 public:
69 EventTargetData(); 70 EventTargetData();
70 ~EventTargetData(); 71 ~EventTargetData();
71 72
73 DECLARE_TRACE();
74
72 EventListenerMap eventListenerMap; 75 EventListenerMap eventListenerMap;
73 OwnPtr<FiringEventIteratorVector> firingEventIterators; 76 OwnPtr<FiringEventIteratorVector> firingEventIterators;
74 }; 77 };
75 78
76 // This is the base class for all DOM event targets. To make your class an 79 // This is the base class for all DOM event targets. To make your class an
77 // EventTarget, follow these steps: 80 // EventTarget, follow these steps:
78 // - Make your IDL interface inherit from EventTarget. 81 // - Make your IDL interface inherit from EventTarget.
79 // Optionally add "attribute EventHandler onfoo;" attributes. 82 // Optionally add "attribute EventHandler onfoo;" attributes.
80 // - Inherit from EventTargetWithInlineData (only in rare cases should you use 83 // - Inherit from EventTargetWithInlineData (only in rare cases should you use
81 // EventTarget directly); or, if you want YourClass to be inherited from 84 // EventTarget directly); or, if you want YourClass to be inherited from
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 void deref() { derefEventTarget(); } 118 void deref() { derefEventTarget(); }
116 #endif 119 #endif
117 120
118 virtual const AtomicString& interfaceName() const = 0; 121 virtual const AtomicString& interfaceName() const = 0;
119 virtual ExecutionContext* executionContext() const = 0; 122 virtual ExecutionContext* executionContext() const = 0;
120 123
121 virtual Node* toNode(); 124 virtual Node* toNode();
122 virtual LocalDOMWindow* toDOMWindow(); 125 virtual LocalDOMWindow* toDOMWindow();
123 virtual MessagePort* toMessagePort(); 126 virtual MessagePort* toMessagePort();
124 127
125 virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<Even tListener>, bool useCapture); 128 virtual bool addEventListener(const AtomicString& eventType, PassRefPtrWillB eRawPtr<EventListener>, bool useCapture);
126 virtual bool removeEventListener(const AtomicString& eventType, PassRefPtr<E ventListener>, bool useCapture); 129 virtual bool removeEventListener(const AtomicString& eventType, PassRefPtrWi llBeRawPtr<EventListener>, bool useCapture);
127 virtual void removeAllEventListeners(); 130 virtual void removeAllEventListeners();
128 131
129 bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>); 132 bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>);
130 133
131 // dispatchEventForBindings is intended to only be called from 134 // dispatchEventForBindings is intended to only be called from
132 // javascript originated calls. This method will validate and may adjust 135 // javascript originated calls. This method will validate and may adjust
133 // the Event object before dispatching. 136 // the Event object before dispatching.
134 bool dispatchEventForBindings(PassRefPtrWillBeRawPtr<Event>, ExceptionState& ); 137 bool dispatchEventForBindings(PassRefPtrWillBeRawPtr<Event>, ExceptionState& );
135 virtual void uncaughtExceptionInEventHandler(); 138 virtual void uncaughtExceptionInEventHandler();
136 139
137 // Used for legacy "onEvent" attribute APIs. 140 // Used for legacy "onEvent" attribute APIs.
138 bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<Eve ntListener>); 141 bool setAttributeEventListener(const AtomicString& eventType, PassRefPtrWill BeRawPtr<EventListener>);
139 EventListener* getAttributeEventListener(const AtomicString& eventType); 142 EventListener* getAttributeEventListener(const AtomicString& eventType);
140 143
141 bool hasEventListeners() const; 144 bool hasEventListeners() const;
142 bool hasEventListeners(const AtomicString& eventType) const; 145 bool hasEventListeners(const AtomicString& eventType) const;
143 bool hasCapturingEventListeners(const AtomicString& eventType); 146 bool hasCapturingEventListeners(const AtomicString& eventType);
144 const EventListenerVector& getEventListeners(const AtomicString& eventType); 147 EventListenerVector* getEventListeners(const AtomicString& eventType);
145 Vector<AtomicString> eventTypes(); 148 Vector<AtomicString> eventTypes();
146 149
147 bool fireEventListeners(Event*); 150 bool fireEventListeners(Event*);
148 151
149 DEFINE_INLINE_VIRTUAL_TRACE() { } 152 DEFINE_INLINE_VIRTUAL_TRACE() { }
150 153
151 virtual bool keepEventInNode(Event*) { return false; } 154 virtual bool keepEventInNode(Event*) { return false; }
152 155
153 protected: 156 protected:
154 EventTarget(); 157 EventTarget();
(...skipping 13 matching lines...) Expand all
168 171
169 LocalDOMWindow* executingWindow(); 172 LocalDOMWindow* executingWindow();
170 void fireEventListeners(Event*, EventTargetData*, EventListenerVector&); 173 void fireEventListeners(Event*, EventTargetData*, EventListenerVector&);
171 void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVect or*, EventListenerVector*); 174 void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVect or*, EventListenerVector*);
172 175
173 bool clearAttributeEventListener(const AtomicString& eventType); 176 bool clearAttributeEventListener(const AtomicString& eventType);
174 177
175 friend class EventListenerIterator; 178 friend class EventListenerIterator;
176 }; 179 };
177 180
178 class CORE_EXPORT EventTargetWithInlineData : public EventTarget { 181 // EventTargetData is a GCed object, so it should not be used as a part of
182 // object. However, we intentionally use it as a part of object for performance,
183 // assuming that no one extracts a pointer of
184 // EventTargetWithInlineData::m_eventTargetData and store it to a Member etc.
185 class GC_PLUGIN_IGNORE("513199") CORE_EXPORT EventTargetWithInlineData : public EventTarget {
186 public:
187 DEFINE_INLINE_VIRTUAL_TRACE()
188 {
189 visitor->trace(m_eventTargetData);
190 EventTarget::trace(visitor);
191 }
192
179 protected: 193 protected:
180 EventTargetData* eventTargetData() final { return &m_eventTargetData; } 194 EventTargetData* eventTargetData() final { return &m_eventTargetData; }
181 EventTargetData& ensureEventTargetData() final { return m_eventTargetData; } 195 EventTargetData& ensureEventTargetData() final { return m_eventTargetData; }
196
182 private: 197 private:
183 EventTargetData m_eventTargetData; 198 EventTargetData m_eventTargetData;
184 }; 199 };
185 200
186 // Base class for classes that wish to inherit from RefCountedGarbageCollected ( in non-Oilpan world) and 201 // Base class for classes that wish to inherit from RefCountedGarbageCollected ( in non-Oilpan world) and
187 // EventTargetWithInlineData (in both worlds). For details about how to use this class template, see the comments for 202 // EventTargetWithInlineData (in both worlds). For details about how to use this class template, see the comments for
188 // EventTargetWithInlineData above. 203 // EventTargetWithInlineData above.
189 // 204 //
190 // This class template exists to circumvent Oilpan's "leftmost class rule", wher e the Oilpan classes must come first in 205 // This class template exists to circumvent Oilpan's "leftmost class rule", wher e the Oilpan classes must come first in
191 // the base class list to avoid memory offset adjustment. In non-Oilpan world, R efCountedGarbageCollected<T> must come 206 // the base class list to avoid memory offset adjustment. In non-Oilpan world, R efCountedGarbageCollected<T> must come
192 // first, but in Oilpan world EventTargetWithInlineData needs to come first. Thi s class templates does the required 207 // first, but in Oilpan world EventTargetWithInlineData needs to come first. Thi s class templates does the required
193 // #if-switch here, in order to avoid a lot of "#if ENABLE(OILPAN)"-s sprinkled in the derived classes. 208 // #if-switch here, in order to avoid a lot of "#if ENABLE(OILPAN)"-s sprinkled in the derived classes.
194 #if ENABLE(OILPAN) 209 #if ENABLE(OILPAN)
195 template <typename T> 210 template <typename T>
196 class RefCountedGarbageCollectedEventTargetWithInlineData : public EventTargetWi thInlineData { 211 class RefCountedGarbageCollectedEventTargetWithInlineData : public EventTargetWi thInlineData {
197 public: 212 public:
198 GC_PLUGIN_IGNORE("491488") 213 GC_PLUGIN_IGNORE("491488")
199 void* operator new(size_t size) 214 void* operator new(size_t size)
200 { 215 {
201 // If T is eagerly finalized, it needs to be allocated accordingly. 216 // If T is eagerly finalized, it needs to be allocated accordingly.
202 // Redefinition of the operator is needed to accomplish that, as otherwi se 217 // Redefinition of the operator is needed to accomplish that, as otherwi se
203 // it would be allocated using GarbageCollected<EventTarget>'s operator new. 218 // it would be allocated using GarbageCollected<EventTarget>'s operator new.
204 // EventTarget is not eagerly finalized. 219 // EventTarget is not eagerly finalized.
205 return allocateObject(size, IsEagerlyFinalizedType<T>::value); 220 return allocateObject(size, IsEagerlyFinalizedType<T>::value);
206 } 221 }
222
223 DEFINE_INLINE_VIRTUAL_TRACE()
224 {
225 EventTargetWithInlineData::trace(visitor);
226 }
207 }; 227 };
208 #else 228 #else
209 template <typename T> 229 template <typename T>
210 class RefCountedGarbageCollectedEventTargetWithInlineData : public RefCountedGar bageCollected<T>, public EventTargetWithInlineData { 230 class RefCountedGarbageCollectedEventTargetWithInlineData : public RefCountedGar bageCollected<T>, public EventTargetWithInlineData {
211 public: 231 public:
212 DEFINE_INLINE_VIRTUAL_TRACE() { EventTargetWithInlineData::trace(visitor); } 232 DEFINE_INLINE_VIRTUAL_TRACE() { EventTargetWithInlineData::trace(visitor); }
213 }; 233 };
214 #endif 234 #endif
215 235
216 // FIXME: These macros should be split into separate DEFINE and DECLARE 236 // FIXME: These macros should be split into separate DEFINE and DECLARE
217 // macros to avoid causing so many header includes. 237 // macros to avoid causing so many header includes.
218 #define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \ 238 #define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \
219 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN ames::attribute); } \ 239 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN ames::attribute); } \
220 void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEven tListener(EventTypeNames::attribute, listener); } \ 240 void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { setA ttributeEventListener(EventTypeNames::attribute, listener); } \
221 241
222 #define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \ 242 #define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \
223 static EventListener* on##attribute(EventTarget& eventTarget) { return event Target.getAttributeEventListener(EventTypeNames::attribute); } \ 243 static EventListener* on##attribute(EventTarget& eventTarget) { return event Target.getAttributeEventListener(EventTypeNames::attribute); } \
224 static void setOn##attribute(EventTarget& eventTarget, PassRefPtr<EventListe ner> listener) { eventTarget.setAttributeEventListener(EventTypeNames::attribute , listener); } \ 244 static void setOn##attribute(EventTarget& eventTarget, PassRefPtrWillBeRawPt r<EventListener> listener) { eventTarget.setAttributeEventListener(EventTypeName s::attribute, listener); } \
225 245
226 #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ 246 #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \
227 EventListener* on##attribute() { return document().getWindowAttributeEventLi stener(EventTypeNames::attribute); } \ 247 EventListener* on##attribute() { return document().getWindowAttributeEventLi stener(EventTypeNames::attribute); } \
228 void setOn##attribute(PassRefPtr<EventListener> listener) { document().setWi ndowAttributeEventListener(EventTypeNames::attribute, listener); } \ 248 void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { docu ment().setWindowAttributeEventListener(EventTypeNames::attribute, listener); } \
229 249
230 #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ 250 #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \
231 static EventListener* on##attribute(EventTarget& eventTarget) { \ 251 static EventListener* on##attribute(EventTarget& eventTarget) { \
232 if (Node* node = eventTarget.toNode()) \ 252 if (Node* node = eventTarget.toNode()) \
233 return node->document().getWindowAttributeEventListener(EventTypeNam es::attribute); \ 253 return node->document().getWindowAttributeEventListener(EventTypeNam es::attribute); \
234 ASSERT(eventTarget.toDOMWindow()); \ 254 ASSERT(eventTarget.toDOMWindow()); \
235 return eventTarget.getAttributeEventListener(EventTypeNames::attribute); \ 255 return eventTarget.getAttributeEventListener(EventTypeNames::attribute); \
236 } \ 256 } \
237 static void setOn##attribute(EventTarget& eventTarget, PassRefPtr<EventListe ner> listener) { \ 257 static void setOn##attribute(EventTarget& eventTarget, PassRefPtrWillBeRawPt r<EventListener> listener) { \
238 if (Node* node = eventTarget.toNode()) \ 258 if (Node* node = eventTarget.toNode()) \
239 node->document().setWindowAttributeEventListener(EventTypeNames::att ribute, listener); \ 259 node->document().setWindowAttributeEventListener(EventTypeNames::att ribute, listener); \
240 else { \ 260 else { \
241 ASSERT(eventTarget.toDOMWindow()); \ 261 ASSERT(eventTarget.toDOMWindow()); \
242 eventTarget.setAttributeEventListener(EventTypeNames::attribute, lis tener); \ 262 eventTarget.setAttributeEventListener(EventTypeNames::attribute, lis tener); \
243 } \ 263 } \
244 } 264 }
245 265
246 #define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \ 266 #define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \
247 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN ames::eventName); } \ 267 EventListener* on##attribute() { return getAttributeEventListener(EventTypeN ames::eventName); } \
248 void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEven tListener(EventTypeNames::eventName, listener); } \ 268 void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { setA ttributeEventListener(EventTypeNames::eventName, listener); } \
249 269
250 #define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \ 270 #define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \
251 EventListener* on##attribute(); \ 271 EventListener* on##attribute(); \
252 void setOn##attribute(PassRefPtr<EventListener> listener); 272 void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener);
253 273
254 #define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \ 274 #define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \
255 EventListener* type::on##attribute() { return recipient ? recipient->getAttr ibuteEventListener(EventTypeNames::attribute) : 0; } \ 275 EventListener* type::on##attribute() { return recipient ? recipient->getAttr ibuteEventListener(EventTypeNames::attribute) : 0; } \
256 void type::setOn##attribute(PassRefPtr<EventListener> listener) \ 276 void type::setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) \
257 { \ 277 { \
258 if (recipient) \ 278 if (recipient) \
259 recipient->setAttributeEventListener(EventTypeNames::attribute, list ener); \ 279 recipient->setAttributeEventListener(EventTypeNames::attribute, list ener); \
260 } 280 }
261 281
262 inline bool EventTarget::hasEventListeners() const 282 inline bool EventTarget::hasEventListeners() const
263 { 283 {
264 // FIXME: We should have a const version of eventTargetData. 284 // FIXME: We should have a const version of eventTargetData.
265 if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetDa ta()) 285 if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetDa ta())
266 return !d->eventListenerMap.isEmpty(); 286 return !d->eventListenerMap.isEmpty();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 using baseClass::deref; \ 320 using baseClass::deref; \
301 private: \ 321 private: \
302 void refEventTarget() final { ref(); } \ 322 void refEventTarget() final { ref(); } \
303 void derefEventTarget() final { deref(); } \ 323 void derefEventTarget() final { deref(); } \
304 typedef int thisIsHereToForceASemiColonAfterThisEventTargetMacro 324 typedef int thisIsHereToForceASemiColonAfterThisEventTargetMacro
305 #define REFCOUNTED_EVENT_TARGET(baseClass) DEFINE_EVENT_TARGET_REFCOUNTING(RefCo unted<baseClass>) 325 #define REFCOUNTED_EVENT_TARGET(baseClass) DEFINE_EVENT_TARGET_REFCOUNTING(RefCo unted<baseClass>)
306 #define REFCOUNTED_GARBAGE_COLLECTED_EVENT_TARGET(baseClass) DEFINE_EVENT_TARGET _REFCOUNTING(RefCountedGarbageCollected<baseClass>) 326 #define REFCOUNTED_GARBAGE_COLLECTED_EVENT_TARGET(baseClass) DEFINE_EVENT_TARGET _REFCOUNTING(RefCountedGarbageCollected<baseClass>)
307 #endif // ENABLE(OILPAN) 327 #endif // ENABLE(OILPAN)
308 328
309 #endif // EventTarget_h 329 #endif // EventTarget_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698