2 * Copyright 2008 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 EVENTID_INVALID_ID
= -1,
21 EVENTID_DOMCONTENTLOADED
,
25 EVENTID_ANIMATIONSTART
,
26 EVENTID_BEFOREACTIVATE
,
33 EVENTID_DATAAVAILABLE
,
56 EVENTID_MSTHUMBNAILCLICK
,
61 EVENTID_READYSTATECHANGE
,
64 EVENTID_SELECTIONCHANGE
,
67 EVENTID_STORAGECOMMIT
,
71 EVENTID_VISIBILITYCHANGE
,
75 typedef struct DOMEvent
{
77 IDOMEvent IDOMEvent_iface
;
84 EventTarget
*current_target
;
89 BOOL stop_propagation
;
90 BOOL stop_immediate_propagation
;
92 DOM_EVENT_PHASE phase
;
94 IHTMLEventObj
*event_obj
;
98 const WCHAR
*get_event_name(eventid_t
);
99 void check_event_attr(HTMLDocumentNode
*,nsIDOMElement
*);
100 void traverse_event_target(EventTarget
*,nsCycleCollectionTraversalCallback
*);
101 void release_event_target(EventTarget
*);
102 HRESULT
set_event_handler(EventTarget
*,eventid_t
,VARIANT
*);
103 HRESULT
get_event_handler(EventTarget
*,eventid_t
,VARIANT
*);
104 HRESULT
attach_event(EventTarget
*,BSTR
,IDispatch
*,VARIANT_BOOL
*);
105 HRESULT
detach_event(EventTarget
*,BSTR
,IDispatch
*);
106 HRESULT
fire_event(HTMLDOMNode
*,const WCHAR
*,VARIANT
*,VARIANT_BOOL
*);
107 void update_doc_cp_events(HTMLDocumentNode
*,cp_static_data_t
*);
108 HRESULT
doc_init_events(HTMLDocumentNode
*);
109 void detach_events(HTMLDocumentNode
*doc
);
110 HRESULT
create_event_obj(compat_mode_t
,IHTMLEventObj
**);
111 void bind_target_event(HTMLDocumentNode
*,EventTarget
*,const WCHAR
*,IDispatch
*);
112 HRESULT
ensure_doc_nsevent_handler(HTMLDocumentNode
*,nsIDOMNode
*,eventid_t
);
114 void dispatch_event(EventTarget
*,DOMEvent
*);
116 HRESULT
create_document_event(HTMLDocumentNode
*,eventid_t
,DOMEvent
**);
117 HRESULT
create_document_event_str(HTMLDocumentNode
*,const WCHAR
*,IDOMEvent
**);
118 HRESULT
create_event_from_nsevent(nsIDOMEvent
*,compat_mode_t
,DOMEvent
**);
119 HRESULT
create_message_event(HTMLDocumentNode
*,VARIANT
*,DOMEvent
**);
120 HRESULT
create_storage_event(HTMLDocumentNode
*,BSTR
,BSTR
,BSTR
,const WCHAR
*,BOOL
,DOMEvent
**);
122 void init_nsevents(HTMLDocumentNode
*);
123 void release_nsevents(HTMLDocumentNode
*);
124 void add_nsevent_listener(HTMLDocumentNode
*,nsIDOMNode
*,LPCWSTR
);
125 void detach_nsevent(HTMLDocumentNode
*,const WCHAR
*);
127 /* We extend dispex vtbl for EventTarget functions to avoid separated vtbl. */
129 dispex_static_data_vtbl_t dispex_vtbl
;
130 IDispatch
*(*get_dispatch_this
)(DispatchEx
*);
131 nsISupports
*(*get_gecko_target
)(DispatchEx
*);
132 void (*bind_event
)(DispatchEx
*,eventid_t
);
133 EventTarget
*(*get_parent_event_target
)(DispatchEx
*);
134 HRESULT (*handle_event
)(DispatchEx
*,eventid_t
,nsIDOMEvent
*,BOOL
*);
135 ConnectionPointContainer
*(*get_cp_container
)(DispatchEx
*);
136 IHTMLEventObj
*(*set_current_event
)(DispatchEx
*,IHTMLEventObj
*);
137 } event_target_vtbl_t
;
139 IHTMLEventObj
*default_set_current_event(HTMLInnerWindow
*,IHTMLEventObj
*);
141 nsISupports
*HTMLElement_get_gecko_target(DispatchEx
*);
142 void HTMLElement_bind_event(DispatchEx
*,eventid_t
);
143 EventTarget
*HTMLElement_get_parent_event_target(DispatchEx
*);
144 HRESULT
HTMLElement_handle_event(DispatchEx
*,eventid_t
,nsIDOMEvent
*,BOOL
*);
145 ConnectionPointContainer
*HTMLElement_get_cp_container(DispatchEx
*);
146 IHTMLEventObj
*HTMLElement_set_current_event(DispatchEx
*,IHTMLEventObj
*);
148 #define HTMLELEMENT_DISPEX_VTBL_ENTRIES \
149 .populate_props = HTMLElement_populate_props
151 #define HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES \
152 .get_gecko_target = HTMLElement_get_gecko_target, \
153 .bind_event = HTMLElement_bind_event, \
154 .get_parent_event_target = HTMLElement_get_parent_event_target, \
155 .get_cp_container = HTMLElement_get_cp_container, \
156 .set_current_event = HTMLElement_set_current_event
158 static inline EventTarget
*get_node_event_prop_target(HTMLDOMNode
*node
, eventid_t eid
)
160 return node
->vtbl
->get_event_prop_target
? node
->vtbl
->get_event_prop_target(node
, eid
) : &node
->event_target
;
163 static inline HRESULT
set_node_event(HTMLDOMNode
*node
, eventid_t eid
, VARIANT
*var
)
165 return set_event_handler(get_node_event_prop_target(node
, eid
), eid
, var
);
168 static inline HRESULT
get_node_event(HTMLDOMNode
*node
, eventid_t eid
, VARIANT
*var
)
170 return get_event_handler(get_node_event_prop_target(node
, eid
), eid
, var
);
173 static inline HRESULT
set_doc_event(HTMLDocumentNode
*doc
, eventid_t eid
, VARIANT
*var
)
175 return set_event_handler(&doc
->node
.event_target
, eid
, var
);
178 static inline HRESULT
get_doc_event(HTMLDocumentNode
*doc
, eventid_t eid
, VARIANT
*var
)
180 return get_event_handler(&doc
->node
.event_target
, eid
, var
);