2 * Copyright 2006 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
28 #include "wine/debug.h"
30 #include "mshtml_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
34 #define NSSUPPORTS(x) ((nsISupports*) &(x)->lpSupportsVtbl)
36 #define HTMLDOMNODE_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode, iface)
38 static HRESULT WINAPI
HTMLDOMNode_QueryInterface(IHTMLDOMNode
*iface
,
39 REFIID riid
, void **ppv
)
41 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
43 return This
->vtbl
->qi(This
, riid
, ppv
);
46 static ULONG WINAPI
HTMLDOMNode_AddRef(IHTMLDOMNode
*iface
)
48 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
49 LONG ref
= InterlockedIncrement(&This
->ref
);
51 TRACE("(%p) ref=%d\n", This
, ref
);
56 static ULONG WINAPI
HTMLDOMNode_Release(IHTMLDOMNode
*iface
)
58 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
59 LONG ref
= InterlockedDecrement(&This
->ref
);
61 TRACE("(%p) ref=%d\n", This
, ref
);
64 This
->vtbl
->destructor(This
);
71 static HRESULT WINAPI
HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode
*iface
, UINT
*pctinfo
)
73 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
74 FIXME("(%p)->(%p)\n", This
, pctinfo
);
78 static HRESULT WINAPI
HTMLDOMNode_GetTypeInfo(IHTMLDOMNode
*iface
, UINT iTInfo
,
79 LCID lcid
, ITypeInfo
**ppTInfo
)
81 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
82 FIXME("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
86 static HRESULT WINAPI
HTMLDOMNode_GetIDsOfNames(IHTMLDOMNode
*iface
, REFIID riid
,
87 LPOLESTR
*rgszNames
, UINT cNames
,
88 LCID lcid
, DISPID
*rgDispId
)
90 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
91 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
96 static HRESULT WINAPI
HTMLDOMNode_Invoke(IHTMLDOMNode
*iface
, DISPID dispIdMember
,
97 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
98 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
100 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
101 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
102 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
106 static HRESULT WINAPI
HTMLDOMNode_get_nodeType(IHTMLDOMNode
*iface
, long *p
)
108 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
109 FIXME("(%p)->(%p)\n", This
, p
);
113 static HRESULT WINAPI
HTMLDOMNode_get_parentNode(IHTMLDOMNode
*iface
, IHTMLDOMNode
**p
)
115 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
116 FIXME("(%p)->(%p)\n", This
, p
);
120 static HRESULT WINAPI
HTMLDOMNode_hasChildNodes(IHTMLDOMNode
*iface
, VARIANT_BOOL
*fChildren
)
122 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
123 FIXME("(%p)->(%p)\n", This
, fChildren
);
127 static HRESULT WINAPI
HTMLDOMNode_get_childNodes(IHTMLDOMNode
*iface
, IDispatch
**p
)
129 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
130 FIXME("(%p)->(%p)\n", This
, p
);
134 static HRESULT WINAPI
HTMLDOMNode_get_attributes(IHTMLDOMNode
*iface
, IDispatch
**p
)
136 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
137 FIXME("(%p)->(%p)\n", This
, p
);
141 static HRESULT WINAPI
HTMLDOMNode_insertBefore(IHTMLDOMNode
*iface
, IHTMLDOMNode
*newChild
,
142 VARIANT refChild
, IHTMLDOMNode
**node
)
144 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
145 FIXME("(%p)->(%p v %p)\n", This
, newChild
, node
);
149 static HRESULT WINAPI
HTMLDOMNode_removeChild(IHTMLDOMNode
*iface
, IHTMLDOMNode
*newChild
,
152 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
153 FIXME("(%p)->(%p %p)\n", This
, newChild
, node
);
157 static HRESULT WINAPI
HTMLDOMNode_replaceChild(IHTMLDOMNode
*iface
, IHTMLDOMNode
*newChild
,
158 IHTMLDOMNode
*oldChild
, IHTMLDOMNode
**node
)
160 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
161 FIXME("(%p)->(%p %p %p)\n", This
, newChild
, oldChild
, node
);
165 static HRESULT WINAPI
HTMLDOMNode_cloneNode(IHTMLDOMNode
*iface
, VARIANT_BOOL fDeep
,
166 IHTMLDOMNode
**clonedNode
)
168 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
169 FIXME("(%p)->(%x %p)\n", This
, fDeep
, clonedNode
);
173 static HRESULT WINAPI
HTMLDOMNode_removeNode(IHTMLDOMNode
*iface
, VARIANT_BOOL fDeep
,
174 IHTMLDOMNode
**removed
)
176 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
177 FIXME("(%p)->(%x %p)\n", This
, fDeep
, removed
);
181 static HRESULT WINAPI
HTMLDOMNode_swapNode(IHTMLDOMNode
*iface
, IHTMLDOMNode
*otherNode
,
182 IHTMLDOMNode
**swappedNode
)
184 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
185 FIXME("(%p)->(%p %p)\n", This
, otherNode
, swappedNode
);
189 static HRESULT WINAPI
HTMLDOMNode_replaceNode(IHTMLDOMNode
*iface
, IHTMLDOMNode
*replacement
,
190 IHTMLDOMNode
**replaced
)
192 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
193 FIXME("(%p)->(%p %p)\n", This
, replacement
, replaced
);
197 static HRESULT WINAPI
HTMLDOMNode_appendChild(IHTMLDOMNode
*iface
, IHTMLDOMNode
*newChild
,
200 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
201 FIXME("(%p)->(%p %p)\n", This
, newChild
, node
);
205 static HRESULT WINAPI
HTMLDOMNode_get_nodeName(IHTMLDOMNode
*iface
, BSTR
*p
)
207 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
209 TRACE("(%p)->(%p)\n", This
, p
);
215 const PRUnichar
*name
;
218 nsAString_Init(&name_str
, NULL
);
219 nsres
= nsIDOMNode_GetNodeName(This
->nsnode
, &name_str
);
221 if(NS_SUCCEEDED(nsres
)) {
222 nsAString_GetData(&name_str
, &name
);
223 *p
= SysAllocString(name
);
225 ERR("GetNodeName failed: %08x\n", nsres
);
228 nsAString_Finish(&name_str
);
234 static HRESULT WINAPI
HTMLDOMNode_put_nodeValue(IHTMLDOMNode
*iface
, VARIANT v
)
236 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
237 FIXME("(%p)->()\n", This
);
241 static HRESULT WINAPI
HTMLDOMNode_get_nodeValue(IHTMLDOMNode
*iface
, VARIANT
*p
)
243 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
244 FIXME("(%p)->(%p)\n", This
, p
);
248 static HRESULT WINAPI
HTMLDOMNode_get_firstChild(IHTMLDOMNode
*iface
, IHTMLDOMNode
**p
)
250 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
251 FIXME("(%p)->(%p)\n", This
, p
);
255 static HRESULT WINAPI
HTMLDOMNode_get_lastChild(IHTMLDOMNode
*iface
, IHTMLDOMNode
**p
)
257 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
258 FIXME("(%p)->(%p)\n", This
, p
);
262 static HRESULT WINAPI
HTMLDOMNode_get_previousSibling(IHTMLDOMNode
*iface
, IHTMLDOMNode
**p
)
264 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
265 FIXME("(%p)->(%p)\n", This
, p
);
269 static HRESULT WINAPI
HTMLDOMNode_get_nextSibling(IHTMLDOMNode
*iface
, IHTMLDOMNode
**p
)
271 HTMLDOMNode
*This
= HTMLDOMNODE_THIS(iface
);
272 FIXME("(%p)->(%p)\n", This
, p
);
276 static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl
= {
277 HTMLDOMNode_QueryInterface
,
280 HTMLDOMNode_GetTypeInfoCount
,
281 HTMLDOMNode_GetTypeInfo
,
282 HTMLDOMNode_GetIDsOfNames
,
284 HTMLDOMNode_get_nodeType
,
285 HTMLDOMNode_get_parentNode
,
286 HTMLDOMNode_hasChildNodes
,
287 HTMLDOMNode_get_childNodes
,
288 HTMLDOMNode_get_attributes
,
289 HTMLDOMNode_insertBefore
,
290 HTMLDOMNode_removeChild
,
291 HTMLDOMNode_replaceChild
,
292 HTMLDOMNode_cloneNode
,
293 HTMLDOMNode_removeNode
,
294 HTMLDOMNode_swapNode
,
295 HTMLDOMNode_replaceNode
,
296 HTMLDOMNode_appendChild
,
297 HTMLDOMNode_get_nodeName
,
298 HTMLDOMNode_put_nodeValue
,
299 HTMLDOMNode_get_nodeValue
,
300 HTMLDOMNode_get_firstChild
,
301 HTMLDOMNode_get_lastChild
,
302 HTMLDOMNode_get_previousSibling
,
303 HTMLDOMNode_get_nextSibling
306 HRESULT
HTMLDOMNode_QI(HTMLDOMNode
*This
, REFIID riid
, void **ppv
)
310 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
311 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
312 *ppv
= HTMLDOMNODE(This
);
313 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
314 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
315 *ppv
= HTMLDOMNODE(This
);
316 }else if(IsEqualGUID(&IID_IHTMLDOMNode
, riid
)) {
317 TRACE("(%p)->(IID_IHTMLDOMNode %p)\n", This
, ppv
);
318 *ppv
= HTMLDOMNODE(This
);
322 IUnknown_AddRef((IUnknown
*)*ppv
);
326 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
327 return E_NOINTERFACE
;
330 void HTMLDOMNode_destructor(HTMLDOMNode
*This
)
333 nsIDOMNode_Release(This
->nsnode
);
334 if(This
->event_target
)
335 release_event_target(This
->event_target
);
338 static const NodeImplVtbl HTMLDOMNodeImplVtbl
= {
340 HTMLDOMNode_destructor
343 static HTMLDOMNode
*create_node(HTMLDocument
*doc
, nsIDOMNode
*nsnode
)
348 nsIDOMNode_GetNodeType(nsnode
, &node_type
);
352 ret
= &HTMLElement_Create(nsnode
)->node
;
355 ret
= heap_alloc(sizeof(HTMLDOMNode
));
356 ret
->vtbl
= &HTMLDOMNodeImplVtbl
;
359 ret
->lpHTMLDOMNodeVtbl
= &HTMLDOMNodeVtbl
;
362 ret
->event_target
= NULL
;
364 nsIDOMNode_AddRef(nsnode
);
365 ret
->nsnode
= nsnode
;
372 * List looks really ugly here. We should use a better data structure or
373 * (better) find a way to store HTMLDOMelement pointer in nsIDOMNode.
376 HTMLDOMNode
*get_node(HTMLDocument
*This
, nsIDOMNode
*nsnode
, BOOL create
)
378 HTMLDOMNode
*iter
= This
->nodes
, *ret
;
381 if(iter
->nsnode
== nsnode
)
389 ret
= create_node(This
, nsnode
);
391 ret
->next
= This
->nodes
;
397 void release_nodes(HTMLDocument
*This
)
399 HTMLDOMNode
*iter
, *next
;
404 for(iter
= This
->nodes
; iter
; iter
= next
) {
407 IHTMLDOMNode_Release(HTMLDOMNODE(iter
));