Index: Source/core/events/EventTarget.h |
diff --git a/Source/core/events/EventTarget.h b/Source/core/events/EventTarget.h |
index 423015163d4b1137aea235cd58d5d82c78ab57b9..bca1c6ca6a5c4cbdaa9567e750d084ba2a20da83 100644 |
--- a/Source/core/events/EventTarget.h |
+++ b/Source/core/events/EventTarget.h |
@@ -63,12 +63,15 @@ struct FiringEventIterator { |
}; |
typedef Vector<FiringEventIterator, 1> FiringEventIteratorVector; |
-struct CORE_EXPORT EventTargetData { |
- WTF_MAKE_NONCOPYABLE(EventTargetData); WTF_MAKE_FAST_ALLOCATED(EventTargetData); |
+class CORE_EXPORT EventTargetData final : public NoBaseWillBeGarbageCollectedFinalized<EventTargetData> { |
+ WTF_MAKE_NONCOPYABLE(EventTargetData); |
+ WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED(EventTargetData); |
public: |
EventTargetData(); |
~EventTargetData(); |
+ DECLARE_TRACE(); |
+ |
EventListenerMap eventListenerMap; |
OwnPtr<FiringEventIteratorVector> firingEventIterators; |
}; |
@@ -122,8 +125,8 @@ public: |
virtual LocalDOMWindow* toDOMWindow(); |
virtual MessagePort* toMessagePort(); |
- virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); |
- virtual bool removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); |
+ virtual bool addEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener>, bool useCapture); |
+ virtual bool removeEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener>, bool useCapture); |
virtual void removeAllEventListeners(); |
bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>); |
@@ -135,13 +138,13 @@ public: |
virtual void uncaughtExceptionInEventHandler(); |
// Used for legacy "onEvent" attribute APIs. |
- bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>); |
+ bool setAttributeEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener>); |
EventListener* getAttributeEventListener(const AtomicString& eventType); |
bool hasEventListeners() const; |
bool hasEventListeners(const AtomicString& eventType) const; |
bool hasCapturingEventListeners(const AtomicString& eventType); |
- const EventListenerVector& getEventListeners(const AtomicString& eventType); |
+ EventListenerVector* getEventListeners(const AtomicString& eventType); |
Vector<AtomicString> eventTypes(); |
bool fireEventListeners(Event*); |
@@ -175,10 +178,22 @@ private: |
friend class EventListenerIterator; |
}; |
-class CORE_EXPORT EventTargetWithInlineData : public EventTarget { |
+// EventTargetData is a GCed object, so it should not be used as a part of |
+// object. However, we intentionally use it as a part of object for performance, |
+// assuming that no one extracts a pointer of |
+// EventTargetWithInlineData::m_eventTargetData and store it to a Member etc. |
+class GC_PLUGIN_IGNORE("513199") CORE_EXPORT EventTargetWithInlineData : public EventTarget { |
+public: |
+ DEFINE_INLINE_VIRTUAL_TRACE() |
+ { |
+ visitor->trace(m_eventTargetData); |
+ EventTarget::trace(visitor); |
+ } |
+ |
protected: |
EventTargetData* eventTargetData() final { return &m_eventTargetData; } |
EventTargetData& ensureEventTargetData() final { return m_eventTargetData; } |
+ |
private: |
EventTargetData m_eventTargetData; |
}; |
@@ -204,6 +219,11 @@ public: |
// EventTarget is not eagerly finalized. |
return allocateObject(size, IsEagerlyFinalizedType<T>::value); |
} |
+ |
+ DEFINE_INLINE_VIRTUAL_TRACE() |
+ { |
+ EventTargetWithInlineData::trace(visitor); |
+ } |
}; |
#else |
template <typename T> |
@@ -217,15 +237,15 @@ public: |
// macros to avoid causing so many header includes. |
#define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
EventListener* on##attribute() { return getAttributeEventListener(EventTypeNames::attribute); } \ |
- void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEventListener(EventTypeNames::attribute, listener); } \ |
+ void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { setAttributeEventListener(EventTypeNames::attribute, listener); } \ |
#define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
static EventListener* on##attribute(EventTarget& eventTarget) { return eventTarget.getAttributeEventListener(EventTypeNames::attribute); } \ |
- static void setOn##attribute(EventTarget& eventTarget, PassRefPtr<EventListener> listener) { eventTarget.setAttributeEventListener(EventTypeNames::attribute, listener); } \ |
+ static void setOn##attribute(EventTarget& eventTarget, PassRefPtrWillBeRawPtr<EventListener> listener) { eventTarget.setAttributeEventListener(EventTypeNames::attribute, listener); } \ |
#define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
EventListener* on##attribute() { return document().getWindowAttributeEventListener(EventTypeNames::attribute); } \ |
- void setOn##attribute(PassRefPtr<EventListener> listener) { document().setWindowAttributeEventListener(EventTypeNames::attribute, listener); } \ |
+ void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { document().setWindowAttributeEventListener(EventTypeNames::attribute, listener); } \ |
#define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \ |
static EventListener* on##attribute(EventTarget& eventTarget) { \ |
@@ -234,7 +254,7 @@ public: |
ASSERT(eventTarget.toDOMWindow()); \ |
return eventTarget.getAttributeEventListener(EventTypeNames::attribute); \ |
} \ |
- static void setOn##attribute(EventTarget& eventTarget, PassRefPtr<EventListener> listener) { \ |
+ static void setOn##attribute(EventTarget& eventTarget, PassRefPtrWillBeRawPtr<EventListener> listener) { \ |
if (Node* node = eventTarget.toNode()) \ |
node->document().setWindowAttributeEventListener(EventTypeNames::attribute, listener); \ |
else { \ |
@@ -245,15 +265,15 @@ public: |
#define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \ |
EventListener* on##attribute() { return getAttributeEventListener(EventTypeNames::eventName); } \ |
- void setOn##attribute(PassRefPtr<EventListener> listener) { setAttributeEventListener(EventTypeNames::eventName, listener); } \ |
+ void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) { setAttributeEventListener(EventTypeNames::eventName, listener); } \ |
#define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \ |
EventListener* on##attribute(); \ |
- void setOn##attribute(PassRefPtr<EventListener> listener); |
+ void setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener); |
#define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \ |
EventListener* type::on##attribute() { return recipient ? recipient->getAttributeEventListener(EventTypeNames::attribute) : 0; } \ |
- void type::setOn##attribute(PassRefPtr<EventListener> listener) \ |
+ void type::setOn##attribute(PassRefPtrWillBeRawPtr<EventListener> listener) \ |
{ \ |
if (recipient) \ |
recipient->setAttributeEventListener(EventTypeNames::attribute, listener); \ |