@@ -72,6 +72,8 @@ class EventTargetData final {
7272 std::unique_ptr<FiringEventIteratorVector> firing_event_iterators;
7373};
7474
75+ class Node ;
76+
7577// All DOM event targets extend EventTarget. The spec is defined here:
7678// https://dom.spec.whatwg.org/#interface-eventtarget
7779// EventTarget objects allow us to add and remove an event
@@ -89,6 +91,8 @@ class EventTarget : public ScriptWrappable, public BindingObject {
8991 ~EventTarget ();
9092 explicit EventTarget (ExecutingContext* context);
9193
94+ virtual Node* ToNode ();
95+
9296 bool addEventListener (const AtomicString& event_type,
9397 const std::shared_ptr<EventListener>& event_listener,
9498 const std::shared_ptr<AddEventListenerOptions>& options,
@@ -183,29 +187,28 @@ class EventTargetWithInlineData : public EventTarget {
183187 eventTarget.SetAttributeEventListener (event_type_names::symbol_name, listener, exception_state); \
184188 }
185189
186- #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER (lower_name, symbol_name ) \
187- EventListener* on##lower_name() { \
188- return GetDocument ().GetWindowAttributeEventListener (event_type_names::symbol_name); \
189- } \
190- void setOn##lower_name(EventListener* listener) { \
191- GetDocument ().SetWindowAttributeEventListener (event_type_names::symbol_name, listener); \
190+ #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER (lower_name, symbol_name ) \
191+ std::shared_ptr< EventListener> on##lower_name() { \
192+ return GetDocument ().GetWindowAttributeEventListener (event_type_names::symbol_name); \
193+ } \
194+ void setOn##lower_name(const std::shared_ptr< EventListener>& listener, ExceptionState& exception_state) { \
195+ GetDocument ().SetWindowAttributeEventListener (event_type_names::symbol_name, listener, exception_state ); \
192196 }
193197
194- #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER (lower_name, symbol_name ) \
195- static EventListener* on##lower_name(EventTarget& eventTarget) { \
196- if (Node* node = eventTarget.ToNode ()) { \
197- return node->GetDocument ().GetWindowAttributeEventListener (event_type_names::symbol_name); \
198- } \
199- DCHECK (eventTarget.ToLocalDOMWindow ()); \
200- return eventTarget.GetAttributeEventListener (event_type_names::symbol_name); \
201- } \
202- static void setOn##lower_name(EventTarget& eventTarget, EventListener* listener) { \
203- if (Node* node = eventTarget.ToNode ()) { \
204- node->GetDocument ().SetWindowAttributeEventListener (event_type_names::symbol_name, listener); \
205- } else { \
206- DCHECK (eventTarget.ToLocalDOMWindow ()); \
207- eventTarget.SetAttributeEventListener (event_type_names::symbol_name, listener); \
208- } \
198+ #define DEFINE_STATIC_WINDOW_ATTRIBUTE_EVENT_LISTENER (lower_name, symbol_name ) \
199+ static std::shared_ptr<EventListener> on##lower_name(EventTarget& eventTarget) { \
200+ if (Node* node = eventTarget.ToNode ()) { \
201+ return node->GetDocument ().GetWindowAttributeEventListener (event_type_names::symbol_name); \
202+ } \
203+ return eventTarget.GetAttributeEventListener (event_type_names::symbol_name); \
204+ } \
205+ static void setOn##lower_name(EventTarget& eventTarget, const std::shared_ptr<EventListener>& listener, \
206+ ExceptionState& exception_state) { \
207+ if (Node* node = eventTarget.ToNode ()) { \
208+ node->GetDocument ().SetWindowAttributeEventListener (event_type_names::symbol_name, listener, exception_state); \
209+ } else { \
210+ eventTarget.SetAttributeEventListener (event_type_names::symbol_name, listener, exception_state); \
211+ } \
209212 }
210213
211214//
0 commit comments