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
21 EVENTID_BEFOREACTIVATE
,
27 EVENTID_DATAAVAILABLE
,
29 EVENTID_DOMCONTENTLOADED
,
49 EVENTID_MSTHUMBNAILCLICK
,
51 EVENTID_READYSTATECHANGE
,
54 EVENTID_SELECTIONCHANGE
,
61 typedef struct DOMEvent
{
63 IDOMEvent IDOMEvent_iface
;
64 IDOMUIEvent IDOMUIEvent_iface
;
65 IDOMMouseEvent IDOMMouseEvent_iface
;
66 IDOMKeyboardEvent IDOMKeyboardEvent_iface
;
69 void *(*query_interface
)(struct DOMEvent
*,REFIID
);
70 void (*destroy
)(struct DOMEvent
*);
73 nsIDOMUIEvent
*ui_event
;
74 nsIDOMMouseEvent
*mouse_event
;
75 nsIDOMKeyEvent
*keyboard_event
;
80 EventTarget
*current_target
;
85 BOOL stop_propagation
;
86 BOOL stop_immediate_propagation
;
87 DOM_EVENT_PHASE phase
;
89 IHTMLEventObj
*event_obj
;
93 void check_event_attr(HTMLDocumentNode
*,nsIDOMElement
*) DECLSPEC_HIDDEN
;
94 void release_event_target(EventTarget
*) DECLSPEC_HIDDEN
;
95 HRESULT
set_event_handler(EventTarget
*,eventid_t
,VARIANT
*) DECLSPEC_HIDDEN
;
96 HRESULT
get_event_handler(EventTarget
*,eventid_t
,VARIANT
*) DECLSPEC_HIDDEN
;
97 HRESULT
attach_event(EventTarget
*,BSTR
,IDispatch
*,VARIANT_BOOL
*) DECLSPEC_HIDDEN
;
98 HRESULT
detach_event(EventTarget
*,BSTR
,IDispatch
*) DECLSPEC_HIDDEN
;
99 HRESULT
fire_event(HTMLDOMNode
*,const WCHAR
*,VARIANT
*,VARIANT_BOOL
*) DECLSPEC_HIDDEN
;
100 void update_doc_cp_events(HTMLDocumentNode
*,cp_static_data_t
*) DECLSPEC_HIDDEN
;
101 HRESULT
doc_init_events(HTMLDocumentNode
*) DECLSPEC_HIDDEN
;
102 void detach_events(HTMLDocumentNode
*doc
) DECLSPEC_HIDDEN
;
103 HRESULT
create_event_obj(IHTMLEventObj
**) DECLSPEC_HIDDEN
;
104 void bind_target_event(HTMLDocumentNode
*,EventTarget
*,const WCHAR
*,IDispatch
*) DECLSPEC_HIDDEN
;
105 HRESULT
ensure_doc_nsevent_handler(HTMLDocumentNode
*,nsIDOMNode
*,eventid_t
) DECLSPEC_HIDDEN
;
107 void dispatch_event(EventTarget
*,DOMEvent
*) DECLSPEC_HIDDEN
;
109 HRESULT
create_document_event(HTMLDocumentNode
*,eventid_t
,DOMEvent
**) DECLSPEC_HIDDEN
;
110 HRESULT
create_document_event_str(HTMLDocumentNode
*,const WCHAR
*,IDOMEvent
**) DECLSPEC_HIDDEN
;
111 HRESULT
create_event_from_nsevent(nsIDOMEvent
*,DOMEvent
**) DECLSPEC_HIDDEN
;
113 void init_nsevents(HTMLDocumentNode
*) DECLSPEC_HIDDEN
;
114 void release_nsevents(HTMLDocumentNode
*) DECLSPEC_HIDDEN
;
115 void add_nsevent_listener(HTMLDocumentNode
*,nsIDOMNode
*,LPCWSTR
) DECLSPEC_HIDDEN
;
116 void detach_nsevent(HTMLDocumentNode
*,const WCHAR
*) DECLSPEC_HIDDEN
;
118 /* We extend dispex vtbl for EventTarget functions to avoid separated vtbl. */
120 dispex_static_data_vtbl_t dispex_vtbl
;
121 nsISupports
*(*get_gecko_target
)(DispatchEx
*);
122 void (*bind_event
)(DispatchEx
*,eventid_t
);
123 EventTarget
*(*get_parent_event_target
)(DispatchEx
*);
124 HRESULT (*handle_event_default
)(DispatchEx
*,eventid_t
,nsIDOMEvent
*,BOOL
*);
125 ConnectionPointContainer
*(*get_cp_container
)(DispatchEx
*);
126 IHTMLEventObj
*(*set_current_event
)(DispatchEx
*,IHTMLEventObj
*);
127 } event_target_vtbl_t
;
129 IHTMLEventObj
*default_set_current_event(HTMLInnerWindow
*,IHTMLEventObj
*) DECLSPEC_HIDDEN
;
131 static inline EventTarget
*get_node_event_prop_target(HTMLDOMNode
*node
, eventid_t eid
)
133 return node
->vtbl
->get_event_prop_target
? node
->vtbl
->get_event_prop_target(node
, eid
) : &node
->event_target
;
136 static inline HRESULT
set_node_event(HTMLDOMNode
*node
, eventid_t eid
, VARIANT
*var
)
138 return set_event_handler(get_node_event_prop_target(node
, eid
), eid
, var
);
141 static inline HRESULT
get_node_event(HTMLDOMNode
*node
, eventid_t eid
, VARIANT
*var
)
143 return get_event_handler(get_node_event_prop_target(node
, eid
), eid
, var
);
146 static inline HRESULT
set_doc_event(HTMLDocument
*doc
, eventid_t eid
, VARIANT
*var
)
148 return set_event_handler(&doc
->doc_node
->node
.event_target
, eid
, var
);
151 static inline HRESULT
get_doc_event(HTMLDocument
*doc
, eventid_t eid
, VARIANT
*var
)
153 return get_event_handler(&doc
->doc_node
->node
.event_target
, eid
, var
);