mshtml: Added IDispatchEx support to HTMLTableRow.
[wine] / dlls / mshtml / htmlelem2.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29 #include "wine/unicode.h"
30
31 #include "mshtml_private.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34
35 #define HTMLELEM2_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement2, iface)
36
37 static HRESULT WINAPI HTMLElement2_QueryInterface(IHTMLElement2 *iface,
38                                                   REFIID riid, void **ppv)
39 {
40     HTMLElement *This = HTMLELEM2_THIS(iface);
41     return IHTMLElement_QueryInterface(HTMLELEM(This), riid, ppv);
42 }
43
44 static ULONG WINAPI HTMLElement2_AddRef(IHTMLElement2 *iface)
45 {
46     HTMLElement *This = HTMLELEM2_THIS(iface);
47     return IHTMLElement_AddRef(HTMLELEM(This));
48 }
49
50 static ULONG WINAPI HTMLElement2_Release(IHTMLElement2 *iface)
51 {
52     HTMLElement *This = HTMLELEM2_THIS(iface);
53     return IHTMLElement_Release(HTMLELEM(This));
54 }
55
56 static HRESULT WINAPI HTMLElement2_GetTypeInfoCount(IHTMLElement2 *iface, UINT *pctinfo)
57 {
58     HTMLElement *This = HTMLELEM2_THIS(iface);
59     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->node.dispex), pctinfo);
60 }
61
62 static HRESULT WINAPI HTMLElement2_GetTypeInfo(IHTMLElement2 *iface, UINT iTInfo,
63                                                LCID lcid, ITypeInfo **ppTInfo)
64 {
65     HTMLElement *This = HTMLELEM2_THIS(iface);
66     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->node.dispex), iTInfo, lcid, ppTInfo);
67 }
68
69 static HRESULT WINAPI HTMLElement2_GetIDsOfNames(IHTMLElement2 *iface, REFIID riid,
70                                                 LPOLESTR *rgszNames, UINT cNames,
71                                                 LCID lcid, DISPID *rgDispId)
72 {
73     HTMLElement *This = HTMLELEM2_THIS(iface);
74     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
75 }
76
77 static HRESULT WINAPI HTMLElement2_Invoke(IHTMLElement2 *iface, DISPID dispIdMember,
78                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
79                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
80 {
81     HTMLElement *This = HTMLELEM2_THIS(iface);
82     return IDispatchEx_Invoke(DISPATCHEX(&This->node.dispex), dispIdMember, riid, lcid,
83             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
84 }
85
86 static HRESULT WINAPI HTMLElement2_get_scopeName(IHTMLElement2 *iface, BSTR *p)
87 {
88     HTMLElement *This = HTMLELEM2_THIS(iface);
89     FIXME("(%p)->(%p)\n", This, p);
90     return E_NOTIMPL;
91 }
92
93 static HRESULT WINAPI HTMLElement2_setCapture(IHTMLElement2 *iface, VARIANT_BOOL containerCapture)
94 {
95     HTMLElement *This = HTMLELEM2_THIS(iface);
96     FIXME("(%p)->(%x)\n", This, containerCapture);
97     return E_NOTIMPL;
98 }
99
100 static HRESULT WINAPI HTMLElement2_releaseCapture(IHTMLElement2 *iface)
101 {
102     HTMLElement *This = HTMLELEM2_THIS(iface);
103     FIXME("(%p)\n", This);
104     return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI HTMLElement2_put_onlosecapture(IHTMLElement2 *iface, VARIANT v)
108 {
109     HTMLElement *This = HTMLELEM2_THIS(iface);
110     FIXME("(%p)->()\n", This);
111     return E_NOTIMPL;
112 }
113
114 static HRESULT WINAPI HTMLElement2_get_onlosecapture(IHTMLElement2 *iface, VARIANT *p)
115 {
116     HTMLElement *This = HTMLELEM2_THIS(iface);
117     FIXME("(%p)->(%p)\n", This, p);
118     return E_NOTIMPL;
119 }
120
121 static HRESULT WINAPI HTMLElement2_componentFromPoint(IHTMLElement2 *iface,
122                                                       long x, long y, BSTR *component)
123 {
124     HTMLElement *This = HTMLELEM2_THIS(iface);
125     FIXME("(%p)->(%ld %ld %p)\n", This, x, y, component);
126     return E_NOTIMPL;
127 }
128
129 static HRESULT WINAPI HTMLElement2_doScroll(IHTMLElement2 *iface, VARIANT component)
130 {
131     HTMLElement *This = HTMLELEM2_THIS(iface);
132     FIXME("(%p)->()\n", This);
133     return E_NOTIMPL;
134 }
135
136 static HRESULT WINAPI HTMLElement2_put_onscroll(IHTMLElement2 *iface, VARIANT v)
137 {
138     HTMLElement *This = HTMLELEM2_THIS(iface);
139     FIXME("(%p)->()\n", This);
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI HTMLElement2_get_onscroll(IHTMLElement2 *iface, VARIANT *p)
144 {
145     HTMLElement *This = HTMLELEM2_THIS(iface);
146     FIXME("(%p)->(%p)\n", This, p);
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI HTMLElement2_put_ondrag(IHTMLElement2 *iface, VARIANT v)
151 {
152     HTMLElement *This = HTMLELEM2_THIS(iface);
153     FIXME("(%p)->()\n", This);
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI HTMLElement2_get_ondrag(IHTMLElement2 *iface, VARIANT *p)
158 {
159     HTMLElement *This = HTMLELEM2_THIS(iface);
160     FIXME("(%p)->(%p)\n", This, p);
161     return E_NOTIMPL;
162 }
163
164 static HRESULT WINAPI HTMLElement2_put_ondragend(IHTMLElement2 *iface, VARIANT v)
165 {
166     HTMLElement *This = HTMLELEM2_THIS(iface);
167     FIXME("(%p)->()\n", This);
168     return E_NOTIMPL;
169 }
170
171 static HRESULT WINAPI HTMLElement2_get_ondragend(IHTMLElement2 *iface, VARIANT *p)
172 {
173     HTMLElement *This = HTMLELEM2_THIS(iface);
174     FIXME("(%p)->(%p)\n", This, p);
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI HTMLElement2_put_ondragenter(IHTMLElement2 *iface, VARIANT v)
179 {
180     HTMLElement *This = HTMLELEM2_THIS(iface);
181     FIXME("(%p)->()\n", This);
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI HTMLElement2_get_ondragenter(IHTMLElement2 *iface, VARIANT *p)
186 {
187     HTMLElement *This = HTMLELEM2_THIS(iface);
188     FIXME("(%p)->(%p)\n", This, p);
189     return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI HTMLElement2_put_ondragover(IHTMLElement2 *iface, VARIANT v)
193 {
194     HTMLElement *This = HTMLELEM2_THIS(iface);
195     FIXME("(%p)->()\n", This);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI HTMLElement2_get_ondragover(IHTMLElement2 *iface, VARIANT *p)
200 {
201     HTMLElement *This = HTMLELEM2_THIS(iface);
202     FIXME("(%p)->(%p)\n", This, p);
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI HTMLElement2_put_ondragleave(IHTMLElement2 *iface, VARIANT v)
207 {
208     HTMLElement *This = HTMLELEM2_THIS(iface);
209     FIXME("(%p)->()\n", This);
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI HTMLElement2_get_ondragleave(IHTMLElement2 *iface, VARIANT *p)
214 {
215     HTMLElement *This = HTMLELEM2_THIS(iface);
216     FIXME("(%p)->(%p)\n", This, p);
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI HTMLElement2_put_ondrop(IHTMLElement2 *iface, VARIANT v)
221 {
222     HTMLElement *This = HTMLELEM2_THIS(iface);
223     FIXME("(%p)->()\n", This);
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI HTMLElement2_get_ondrop(IHTMLElement2 *iface, VARIANT *p)
228 {
229     HTMLElement *This = HTMLELEM2_THIS(iface);
230     FIXME("(%p)->(%p)\n", This, p);
231     return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI HTMLElement2_put_onbeforecut(IHTMLElement2 *iface, VARIANT v)
235 {
236     HTMLElement *This = HTMLELEM2_THIS(iface);
237     FIXME("(%p)->()\n", This);
238     return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI HTMLElement2_get_onbeforecut(IHTMLElement2 *iface, VARIANT *p)
242 {
243     HTMLElement *This = HTMLELEM2_THIS(iface);
244     FIXME("(%p)->(%p)\n", This, p);
245     return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI HTMLElement2_put_oncut(IHTMLElement2 *iface, VARIANT v)
249 {
250     HTMLElement *This = HTMLELEM2_THIS(iface);
251     FIXME("(%p)->()\n", This);
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI HTMLElement2_get_oncut(IHTMLElement2 *iface, VARIANT *p)
256 {
257     HTMLElement *This = HTMLELEM2_THIS(iface);
258     FIXME("(%p)->(%p)\n", This, p);
259     return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI HTMLElement2_put_onbeforecopy(IHTMLElement2 *iface, VARIANT v)
263 {
264     HTMLElement *This = HTMLELEM2_THIS(iface);
265     FIXME("(%p)->()\n", This);
266     return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI HTMLElement2_get_onbeforecopy(IHTMLElement2 *iface, VARIANT *p)
270 {
271     HTMLElement *This = HTMLELEM2_THIS(iface);
272     FIXME("(%p)->(%p)\n", This, p);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI HTMLElement2_put_oncopy(IHTMLElement2 *iface, VARIANT v)
277 {
278     HTMLElement *This = HTMLELEM2_THIS(iface);
279     FIXME("(%p)->()\n", This);
280     return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI HTMLElement2_get_oncopy(IHTMLElement2 *iface, VARIANT *p)
284 {
285     HTMLElement *This = HTMLELEM2_THIS(iface);
286     FIXME("(%p)->(%p)\n", This, p);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI HTMLElement2_put_onbeforepaste(IHTMLElement2 *iface, VARIANT v)
291 {
292     HTMLElement *This = HTMLELEM2_THIS(iface);
293     FIXME("(%p)->()\n", This);
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI HTMLElement2_get_onbeforepaste(IHTMLElement2 *iface, VARIANT *p)
298 {
299     HTMLElement *This = HTMLELEM2_THIS(iface);
300     FIXME("(%p)->(%p)\n", This, p);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI HTMLElement2_put_onpaste(IHTMLElement2 *iface, VARIANT v)
305 {
306     HTMLElement *This = HTMLELEM2_THIS(iface);
307     FIXME("(%p)->()\n", This);
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI HTMLElement2_get_onpaste(IHTMLElement2 *iface, VARIANT *p)
312 {
313     HTMLElement *This = HTMLELEM2_THIS(iface);
314     FIXME("(%p)->(%p)\n", This, p);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLElement2_get_currentStyle(IHTMLElement2 *iface, IHTMLCurrentStyle **p)
319 {
320     HTMLElement *This = HTMLELEM2_THIS(iface);
321     FIXME("(%p)->(%p)\n", This, p);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI HTMLElement2_put_onpropertychange(IHTMLElement2 *iface, VARIANT v)
326 {
327     HTMLElement *This = HTMLELEM2_THIS(iface);
328     FIXME("(%p)->()\n", This);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI HTMLElement2_get_onpropertychange(IHTMLElement2 *iface, VARIANT *p)
333 {
334     HTMLElement *This = HTMLELEM2_THIS(iface);
335     FIXME("(%p)->(%p)\n", This, p);
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI HTMLElement2_getClientRects(IHTMLElement2 *iface, IHTMLRectCollection **pRectCol)
340 {
341     HTMLElement *This = HTMLELEM2_THIS(iface);
342     FIXME("(%p)->(%p)\n", This, pRectCol);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI HTMLElement2_getBoundingClientRect(IHTMLElement2 *iface, IHTMLRect **pRect)
347 {
348     HTMLElement *This = HTMLELEM2_THIS(iface);
349     FIXME("(%p)->(%p)\n", This, pRect);
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI HTMLElement2_setExpression(IHTMLElement2 *iface, BSTR propname,
354                                                  BSTR expression, BSTR language)
355 {
356     HTMLElement *This = HTMLELEM2_THIS(iface);
357     FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(propname), debugstr_w(expression),
358           debugstr_w(language));
359     return E_NOTIMPL;
360 }
361
362 static HRESULT WINAPI HTMLElement2_getExpression(IHTMLElement2 *iface, BSTR propname,
363                                                  VARIANT *expression)
364 {
365     HTMLElement *This = HTMLELEM2_THIS(iface);
366     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), expression);
367     return E_NOTIMPL;
368 }
369
370 static HRESULT WINAPI HTMLElement2_removeExpression(IHTMLElement2 *iface, BSTR propname,
371                                                     VARIANT_BOOL *pfSuccess)
372 {
373     HTMLElement *This = HTMLELEM2_THIS(iface);
374     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), pfSuccess);
375     return E_NOTIMPL;
376 }
377
378 static HRESULT WINAPI HTMLElement2_put_tabIndex(IHTMLElement2 *iface, short v)
379 {
380     HTMLElement *This = HTMLELEM2_THIS(iface);
381     nsIDOMNSHTMLElement *nselem;
382     nsresult nsres;
383
384     TRACE("(%p)->(%d)\n", This, v);
385
386     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
387     if(NS_FAILED(nsres)) {
388         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
389         return S_OK;
390     }
391
392     nsres = nsIDOMNSHTMLElement_SetTabIndex(nselem, v);
393     nsIDOMNSHTMLElement_Release(nselem);
394     if(NS_FAILED(nsres))
395         ERR("GetTabIndex failed: %08x\n", nsres);
396
397     return S_OK;
398 }
399
400 static HRESULT WINAPI HTMLElement2_get_tabIndex(IHTMLElement2 *iface, short *p)
401 {
402     HTMLElement *This = HTMLELEM2_THIS(iface);
403     nsIDOMNSHTMLElement *nselem;
404     PRInt32 index = 0;
405     nsresult nsres;
406
407     TRACE("(%p)->(%p)\n", This, p);
408
409     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
410     if(NS_FAILED(nsres)) {
411         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
412         return E_FAIL;
413     }
414
415     nsres = nsIDOMNSHTMLElement_GetTabIndex(nselem, &index);
416     nsIDOMNSHTMLElement_Release(nselem);
417     if(NS_FAILED(nsres)) {
418         ERR("GetTabIndex failed: %08x\n", nsres);
419         return E_FAIL;
420     }
421
422     *p = index;
423     return S_OK;
424 }
425
426 static HRESULT WINAPI HTMLElement2_focus(IHTMLElement2 *iface)
427 {
428     HTMLElement *This = HTMLELEM2_THIS(iface);
429     nsIDOMNSHTMLElement *nselem;
430     nsresult nsres;
431
432     TRACE("(%p)\n", This);
433
434     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
435     if(NS_SUCCEEDED(nsres)) {
436         nsIDOMNSHTMLElement_focus(nselem);
437         nsIDOMNSHTMLElement_Release(nselem);
438     }else {
439         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
440     }
441
442     return S_OK;
443 }
444
445 static HRESULT WINAPI HTMLElement2_put_accessKey(IHTMLElement2 *iface, BSTR v)
446 {
447     HTMLElement *This = HTMLELEM2_THIS(iface);
448     VARIANT var;
449
450     static WCHAR accessKeyW[] = {'a','c','c','e','s','s','K','e','y',0};
451
452     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
453
454     V_VT(&var) = VT_BSTR;
455     V_BSTR(&var) = v;
456     return IHTMLElement_setAttribute(HTMLELEM(This), accessKeyW, var, 0);
457 }
458
459 static HRESULT WINAPI HTMLElement2_get_accessKey(IHTMLElement2 *iface, BSTR *p)
460 {
461     HTMLElement *This = HTMLELEM2_THIS(iface);
462     FIXME("(%p)->(%p)\n", This, p);
463     return E_NOTIMPL;
464 }
465
466 static HRESULT WINAPI HTMLElement2_put_onblur(IHTMLElement2 *iface, VARIANT v)
467 {
468     HTMLElement *This = HTMLELEM2_THIS(iface);
469     FIXME("(%p)->()\n", This);
470     return E_NOTIMPL;
471 }
472
473 static HRESULT WINAPI HTMLElement2_get_onblur(IHTMLElement2 *iface, VARIANT *p)
474 {
475     HTMLElement *This = HTMLELEM2_THIS(iface);
476     FIXME("(%p)->(%p)\n", This, p);
477     return E_NOTIMPL;
478 }
479
480 static HRESULT WINAPI HTMLElement2_put_onfocus(IHTMLElement2 *iface, VARIANT v)
481 {
482     HTMLElement *This = HTMLELEM2_THIS(iface);
483     FIXME("(%p)->()\n", This);
484     return E_NOTIMPL;
485 }
486
487 static HRESULT WINAPI HTMLElement2_get_onfocus(IHTMLElement2 *iface, VARIANT *p)
488 {
489     HTMLElement *This = HTMLELEM2_THIS(iface);
490     FIXME("(%p)->(%p)\n", This, p);
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI HTMLElement2_put_onresize(IHTMLElement2 *iface, VARIANT v)
495 {
496     HTMLElement *This = HTMLELEM2_THIS(iface);
497     FIXME("(%p)->()\n", This);
498     return E_NOTIMPL;
499 }
500
501 static HRESULT WINAPI HTMLElement2_get_onresize(IHTMLElement2 *iface, VARIANT *p)
502 {
503     HTMLElement *This = HTMLELEM2_THIS(iface);
504     FIXME("(%p)->(%p)\n", This, p);
505     return E_NOTIMPL;
506 }
507
508 static HRESULT WINAPI HTMLElement2_blur(IHTMLElement2 *iface)
509 {
510     HTMLElement *This = HTMLELEM2_THIS(iface);
511     FIXME("(%p)\n", This);
512     return E_NOTIMPL;
513 }
514
515 static HRESULT WINAPI HTMLElement2_addFilter(IHTMLElement2 *iface, IUnknown *pUnk)
516 {
517     HTMLElement *This = HTMLELEM2_THIS(iface);
518     FIXME("(%p)->(%p)\n", This, pUnk);
519     return E_NOTIMPL;
520 }
521
522 static HRESULT WINAPI HTMLElement2_removeFilter(IHTMLElement2 *iface, IUnknown *pUnk)
523 {
524     HTMLElement *This = HTMLELEM2_THIS(iface);
525     FIXME("(%p)->(%p)\n", This, pUnk);
526     return E_NOTIMPL;
527 }
528
529 static HRESULT WINAPI HTMLElement2_get_clientHeight(IHTMLElement2 *iface, long *p)
530 {
531     HTMLElement *This = HTMLELEM2_THIS(iface);
532     nsIDOMNSHTMLElement *nselem;
533     PRInt32 height=0;
534     nsresult nsres;
535
536     TRACE("(%p)->(%p)\n", This, p);
537
538     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
539     if(NS_SUCCEEDED(nsres)) {
540         nsIDOMNSHTMLElement_GetClientHeight(nselem, &height);
541         nsIDOMNSHTMLElement_Release(nselem);
542     }else {
543         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
544     }
545
546     *p = height;
547     return S_OK;
548 }
549
550 static HRESULT WINAPI HTMLElement2_get_clientWidth(IHTMLElement2 *iface, long *p)
551 {
552     HTMLElement *This = HTMLELEM2_THIS(iface);
553     nsIDOMNSHTMLElement *nselem;
554     PRInt32 width=0;
555     nsresult nsres;
556
557     TRACE("(%p)->(%p)\n", This, p);
558
559     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
560     if(NS_SUCCEEDED(nsres)) {
561         nsIDOMNSHTMLElement_GetClientWidth(nselem, &width);
562         nsIDOMNSHTMLElement_Release(nselem);
563     }else {
564         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
565     }
566
567     *p = width;
568     return S_OK;
569 }
570
571 static HRESULT WINAPI HTMLElement2_get_clientTop(IHTMLElement2 *iface, long *p)
572 {
573     HTMLElement *This = HTMLELEM2_THIS(iface);
574     FIXME("(%p)->(%p)\n", This, p);
575     return E_NOTIMPL;
576 }
577
578 static HRESULT WINAPI HTMLElement2_get_clientLeft(IHTMLElement2 *iface, long *p)
579 {
580     HTMLElement *This = HTMLELEM2_THIS(iface);
581     FIXME("(%p)->(%p)\n", This, p);
582     return E_NOTIMPL;
583 }
584
585 static HRESULT WINAPI HTMLElement2_attachEvent(IHTMLElement2 *iface, BSTR event,
586                                                IDispatch *pDisp, VARIANT_BOOL *pfResult)
587 {
588     HTMLElement *This = HTMLELEM2_THIS(iface);
589     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
590     return E_NOTIMPL;
591 }
592
593 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
594 {
595     HTMLElement *This = HTMLELEM2_THIS(iface);
596     FIXME("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp);
597     return E_NOTIMPL;
598 }
599
600 static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p)
601 {
602     HTMLElement *This = HTMLELEM2_THIS(iface);
603     FIXME("(%p)->(%p)\n", This, p);
604     return E_NOTIMPL;
605 }
606
607 static HRESULT WINAPI HTMLElement2_put_onreadystatechange(IHTMLElement2 *iface, VARIANT v)
608 {
609     HTMLElement *This = HTMLELEM2_THIS(iface);
610     FIXME("(%p)->()\n", This);
611     return E_NOTIMPL;
612 }
613
614 static HRESULT WINAPI HTMLElement2_get_onreadystatechange(IHTMLElement2 *iface, VARIANT *p)
615 {
616     HTMLElement *This = HTMLELEM2_THIS(iface);
617     FIXME("(%p)->(%p)\n", This, p);
618     return E_NOTIMPL;
619 }
620
621 static HRESULT WINAPI HTMLElement2_put_onrowsdelete(IHTMLElement2 *iface, VARIANT v)
622 {
623     HTMLElement *This = HTMLELEM2_THIS(iface);
624     FIXME("(%p)->()\n", This);
625     return E_NOTIMPL;
626 }
627
628 static HRESULT WINAPI HTMLElement2_get_onrowsdelete(IHTMLElement2 *iface, VARIANT *p)
629 {
630     HTMLElement *This = HTMLELEM2_THIS(iface);
631     FIXME("(%p)->(%p)\n", This, p);
632     return E_NOTIMPL;
633 }
634
635 static HRESULT WINAPI HTMLElement2_put_onrowsinserted(IHTMLElement2 *iface, VARIANT v)
636 {
637     HTMLElement *This = HTMLELEM2_THIS(iface);
638     FIXME("(%p)->()\n", This);
639     return E_NOTIMPL;
640 }
641
642 static HRESULT WINAPI HTMLElement2_get_onrowsinserted(IHTMLElement2 *iface, VARIANT *p)
643 {
644     HTMLElement *This = HTMLELEM2_THIS(iface);
645     FIXME("(%p)->(%p)\n", This, p);
646     return E_NOTIMPL;
647 }
648
649 static HRESULT WINAPI HTMLElement2_put_oncellchange(IHTMLElement2 *iface, VARIANT v)
650 {
651     HTMLElement *This = HTMLELEM2_THIS(iface);
652     FIXME("(%p)->()\n", This);
653     return E_NOTIMPL;
654 }
655
656 static HRESULT WINAPI HTMLElement2_get_oncellchange(IHTMLElement2 *iface, VARIANT *p)
657 {
658     HTMLElement *This = HTMLELEM2_THIS(iface);
659     FIXME("(%p)->(%p)\n", This, p);
660     return E_NOTIMPL;
661 }
662
663 static HRESULT WINAPI HTMLElement2_put_dir(IHTMLElement2 *iface, BSTR v)
664 {
665     HTMLElement *This = HTMLELEM2_THIS(iface);
666     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
667     return E_NOTIMPL;
668 }
669
670 static HRESULT WINAPI HTMLElement2_get_dir(IHTMLElement2 *iface, BSTR *p)
671 {
672     HTMLElement *This = HTMLELEM2_THIS(iface);
673
674     TRACE("(%p)->(%p)\n", This, p);
675
676     *p = NULL;
677
678     if(This->nselem) {
679         nsAString dir_str;
680         nsresult nsres;
681
682         nsAString_Init(&dir_str, NULL);
683
684         nsres = nsIDOMHTMLElement_GetDir(This->nselem, &dir_str);
685         if(NS_SUCCEEDED(nsres)) {
686             const PRUnichar *dir;
687             nsAString_GetData(&dir_str, &dir);
688             if(*dir)
689                 *p = SysAllocString(dir);
690         }else {
691             ERR("GetDir failed: %08x\n", nsres);
692         }
693
694         nsAString_Finish(&dir_str);
695     }
696
697     TRACE("ret %s\n", debugstr_w(*p));
698     return S_OK;
699 }
700
701 static HRESULT WINAPI HTMLElement2_createControlRange(IHTMLElement2 *iface, IDispatch **range)
702 {
703     HTMLElement *This = HTMLELEM2_THIS(iface);
704     FIXME("(%p)->(%p)\n", This, range);
705     return E_NOTIMPL;
706 }
707
708 static HRESULT WINAPI HTMLElement2_get_scrollHeight(IHTMLElement2 *iface, long *p)
709 {
710     HTMLElement *This = HTMLELEM2_THIS(iface);
711     nsIDOMNSHTMLElement *nselem;
712     PRInt32 height = 0;
713     nsresult nsres;
714
715     TRACE("(%p)->(%p)\n", This, p);
716
717     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
718     if(NS_SUCCEEDED(nsres)) {
719         nsres = nsIDOMNSHTMLElement_GetScrollHeight(nselem, &height);
720         nsIDOMNSHTMLElement_Release(nselem);
721         if(NS_FAILED(nsres))
722             ERR("GetScrollHeight failed: %08x\n", nsres);
723     }else {
724         ERR("Could not get nsIDOMNSHTMLElement interface: %08x\n", nsres);
725     }
726
727     *p = height;
728     TRACE("*p = %ld\n", *p);
729
730     return S_OK;
731 }
732
733 static HRESULT WINAPI HTMLElement2_get_scrollWidth(IHTMLElement2 *iface, long *p)
734 {
735     HTMLElement *This = HTMLELEM2_THIS(iface);
736     nsIDOMNSHTMLElement *nselem;
737     PRInt32 width = 0;
738     nsresult nsres;
739
740     TRACE("(%p)->(%p)\n", This, p);
741
742     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
743     if(NS_SUCCEEDED(nsres)) {
744         nsres = nsIDOMNSHTMLElement_GetScrollWidth(nselem, &width);
745         nsIDOMNSHTMLElement_Release(nselem);
746         if(NS_FAILED(nsres))
747             ERR("GetScrollWidth failed: %08x\n", nsres);
748     }else {
749         ERR("Could not get nsIDOMNSHTMLElement interface: %08x\n", nsres);
750     }
751
752     *p = width;
753     TRACE("*p = %ld\n", *p);
754
755     return S_OK;
756 }
757
758 static HRESULT WINAPI HTMLElement2_put_scrollTop(IHTMLElement2 *iface, long v)
759 {
760     HTMLElement *This = HTMLELEM2_THIS(iface);
761     nsIDOMNSHTMLElement *nselem;
762     nsresult nsres;
763
764     TRACE("(%p)->(%ld)\n", This, v);
765
766     if(!This->nselem) {
767         FIXME("NULL nselem\n");
768         return E_NOTIMPL;
769     }
770
771     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
772     if(NS_SUCCEEDED(nsres)) {
773         nsIDOMNSHTMLElement_SetScrollTop(nselem, v);
774         nsIDOMNSHTMLElement_Release(nselem);
775     }else {
776         ERR("Could not get nsIDOMNSHTMLElement interface: %08x\n", nsres);
777     }
778
779     return S_OK;
780 }
781
782 static HRESULT WINAPI HTMLElement2_get_scrollTop(IHTMLElement2 *iface, long *p)
783 {
784     HTMLElement *This = HTMLELEM2_THIS(iface);
785     nsIDOMNSHTMLElement *nselem;
786     PRInt32 top = 0;
787     nsresult nsres;
788
789     TRACE("(%p)->(%p)\n", This, p);
790
791     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
792     if(NS_SUCCEEDED(nsres)) {
793         nsres = nsIDOMNSHTMLElement_GetScrollTop(nselem, &top);
794         nsIDOMNSHTMLElement_Release(nselem);
795         if(NS_FAILED(nsres))
796             ERR("GetScrollTop failed: %08x\n", nsres);
797     }else {
798         ERR("Could not get nsIDOMNSHTMLElement interface: %08x\n", nsres);
799     }
800
801     *p = top;
802     TRACE("*p = %ld\n", *p);
803
804     return S_OK;
805 }
806
807 static HRESULT WINAPI HTMLElement2_put_scrollLeft(IHTMLElement2 *iface, long v)
808 {
809     HTMLElement *This = HTMLELEM2_THIS(iface);
810     nsIDOMNSHTMLElement *nselem;
811     nsresult nsres;
812
813     TRACE("(%p)->(%ld)\n", This, v);
814
815     if(!This->nselem) {
816         FIXME("NULL nselem\n");
817         return E_NOTIMPL;
818     }
819
820     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
821     if(NS_SUCCEEDED(nsres)) {
822         nsIDOMNSHTMLElement_SetScrollLeft(nselem, v);
823         nsIDOMNSHTMLElement_Release(nselem);
824     }else {
825         ERR("Could not get nsIDOMNSHTMLElement interface: %08x\n", nsres);
826     }
827
828     return S_OK;
829 }
830
831 static HRESULT WINAPI HTMLElement2_get_scrollLeft(IHTMLElement2 *iface, long *p)
832 {
833     HTMLElement *This = HTMLELEM2_THIS(iface);
834     nsIDOMNSHTMLElement *nselem;
835     PRInt32 left = 0;
836     nsresult nsres;
837
838     TRACE("(%p)->(%p)\n", This, p);
839
840     if(!p)
841         return E_INVALIDARG;
842
843     if(!This->nselem)
844     {
845         FIXME("NULL nselem\n");
846         return E_NOTIMPL;
847     }
848
849     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
850     if(NS_SUCCEEDED(nsres))
851     {
852         nsres = nsIDOMNSHTMLElement_GetScrollLeft(nselem, &left);
853         nsIDOMNSHTMLElement_Release(nselem);
854         if(NS_FAILED(nsres))
855             left = 0;
856     }
857
858     *p = left;
859     TRACE("*p = %ld\n", *p);
860
861     return S_OK;
862 }
863
864 static HRESULT WINAPI HTMLElement2_clearAttributes(IHTMLElement2 *iface)
865 {
866     HTMLElement *This = HTMLELEM2_THIS(iface);
867     FIXME("(%p)\n", This);
868     return E_NOTIMPL;
869 }
870
871 static HRESULT WINAPI HTMLElement2_mergeAttributes(IHTMLElement2 *iface, IHTMLElement *mergeThis)
872 {
873     HTMLElement *This = HTMLELEM2_THIS(iface);
874     FIXME("(%p)->(%p)\n", This, mergeThis);
875     return E_NOTIMPL;
876 }
877
878 static HRESULT WINAPI HTMLElement2_put_oncontextmenu(IHTMLElement2 *iface, VARIANT v)
879 {
880     HTMLElement *This = HTMLELEM2_THIS(iface);
881     FIXME("(%p)->()\n", This);
882     return E_NOTIMPL;
883 }
884
885 static HRESULT WINAPI HTMLElement2_get_oncontextmenu(IHTMLElement2 *iface, VARIANT *p)
886 {
887     HTMLElement *This = HTMLELEM2_THIS(iface);
888     FIXME("(%p)->(%p)\n", This, p);
889     return E_NOTIMPL;
890 }
891
892 static HRESULT WINAPI HTMLElement2_insertAdjecentElement(IHTMLElement2 *iface, BSTR where,
893         IHTMLElement *insertedElement, IHTMLElement **inserted)
894 {
895     HTMLElement *This = HTMLELEM2_THIS(iface);
896     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(where), insertedElement, inserted);
897     return E_NOTIMPL;
898 }
899
900 static HRESULT WINAPI HTMLElement2_applyElement(IHTMLElement2 *iface, IHTMLElement *apply,
901                                                 BSTR where, IHTMLElement **applied)
902 {
903     HTMLElement *This = HTMLELEM2_THIS(iface);
904     FIXME("(%p)->(%p %s %p)\n", This, apply, debugstr_w(where), applied);
905     return E_NOTIMPL;
906 }
907
908 static HRESULT WINAPI HTMLElement2_getAdjecentText(IHTMLElement2 *iface, BSTR where, BSTR *text)
909 {
910     HTMLElement *This = HTMLELEM2_THIS(iface);
911     FIXME("(%p)->(%s %p)\n", This, debugstr_w(where), text);
912     return E_NOTIMPL;
913 }
914
915 static HRESULT WINAPI HTMLElement2_replaceAdjecentText(IHTMLElement2 *iface, BSTR where,
916                                                        BSTR newText, BSTR *oldText)
917 {
918     HTMLElement *This = HTMLELEM2_THIS(iface);
919     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(where), debugstr_w(newText), oldText);
920     return E_NOTIMPL;
921 }
922
923 static HRESULT WINAPI HTMLElement2_get_canHandleChildren(IHTMLElement2 *iface, VARIANT_BOOL *p)
924 {
925     HTMLElement *This = HTMLELEM2_THIS(iface);
926     FIXME("(%p)->(%p)\n", This, p);
927     return E_NOTIMPL;
928 }
929
930 static HRESULT WINAPI HTMLElement2_addBehavior(IHTMLElement2 *iface, BSTR bstrUrl,
931                                                VARIANT *pvarFactory, long *pCookie)
932 {
933     HTMLElement *This = HTMLELEM2_THIS(iface);
934     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrUrl), pvarFactory, pCookie);
935     return E_NOTIMPL;
936 }
937
938 static HRESULT WINAPI HTMLElement2_removeBehavior(IHTMLElement2 *iface, long cookie,
939                                                   VARIANT_BOOL *pfResult)
940 {
941     HTMLElement *This = HTMLELEM2_THIS(iface);
942     FIXME("(%p)->(%ld %p)\n", This, cookie, pfResult);
943     return E_NOTIMPL;
944 }
945
946 static HRESULT WINAPI HTMLElement2_get_runtimeStyle(IHTMLElement2 *iface, IHTMLStyle **p)
947 {
948     HTMLElement *This = HTMLELEM2_THIS(iface);
949     FIXME("(%p)->(%p)\n", This, p);
950     return E_NOTIMPL;
951 }
952
953 static HRESULT WINAPI HTMLElement2_get_behaviorUrns(IHTMLElement2 *iface, IDispatch **p)
954 {
955     HTMLElement *This = HTMLELEM2_THIS(iface);
956     FIXME("(%p)->(%p)\n", This, p);
957     return E_NOTIMPL;
958 }
959
960 static HRESULT WINAPI HTMLElement2_put_tagUrn(IHTMLElement2 *iface, BSTR v)
961 {
962     HTMLElement *This = HTMLELEM2_THIS(iface);
963     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
964     return E_NOTIMPL;
965 }
966
967 static HRESULT WINAPI HTMLElement2_get_tagUrn(IHTMLElement2 *iface, BSTR *p)
968 {
969     HTMLElement *This = HTMLELEM2_THIS(iface);
970     FIXME("(%p)->(%p)\n", This, p);
971     return E_NOTIMPL;
972 }
973
974 static HRESULT WINAPI HTMLElement2_put_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT vv)
975 {
976     HTMLElement *This = HTMLELEM2_THIS(iface);
977     FIXME("(%p)->()\n", This);
978     return E_NOTIMPL;
979 }
980
981 static HRESULT WINAPI HTMLElement2_get_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT *p)
982 {
983     HTMLElement *This = HTMLELEM2_THIS(iface);
984     FIXME("(%p)->(%p)\n", This, p);
985     return E_NOTIMPL;
986 }
987
988 static HRESULT WINAPI HTMLElement2_get_readyStateValue(IHTMLElement2 *iface, long *p)
989 {
990     HTMLElement *This = HTMLELEM2_THIS(iface);
991     FIXME("(%p)->(%p)\n", This, p);
992     return E_NOTIMPL;
993 }
994
995 static HRESULT WINAPI HTMLElement2_getElementsByTagName(IHTMLElement2 *iface, BSTR v,
996                                                        IHTMLElementCollection **pelColl)
997 {
998     HTMLElement *This = HTMLELEM2_THIS(iface);
999     nsIDOMNodeList *nslist;
1000     nsAString tag_str;
1001     nsresult nsres;
1002
1003     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl);
1004
1005     nsAString_Init(&tag_str, v);
1006     nsres = nsIDOMHTMLElement_GetElementsByTagName(This->nselem, &tag_str, &nslist);
1007     nsAString_Finish(&tag_str);
1008     if(NS_FAILED(nsres)) {
1009         ERR("GetElementByTagName failed: %08x\n", nsres);
1010         return E_FAIL;
1011     }
1012
1013     *pelColl = create_collection_from_nodelist(This->node.doc, (IUnknown*)HTMLELEM(This), nslist);
1014     nsIDOMNodeList_Release(nslist);
1015     return S_OK;
1016 }
1017
1018 #undef HTMLELEM2_THIS
1019
1020 static const IHTMLElement2Vtbl HTMLElement2Vtbl = {
1021     HTMLElement2_QueryInterface,
1022     HTMLElement2_AddRef,
1023     HTMLElement2_Release,
1024     HTMLElement2_GetTypeInfoCount,
1025     HTMLElement2_GetTypeInfo,
1026     HTMLElement2_GetIDsOfNames,
1027     HTMLElement2_Invoke,
1028     HTMLElement2_get_scopeName,
1029     HTMLElement2_setCapture,
1030     HTMLElement2_releaseCapture,
1031     HTMLElement2_put_onlosecapture,
1032     HTMLElement2_get_onlosecapture,
1033     HTMLElement2_componentFromPoint,
1034     HTMLElement2_doScroll,
1035     HTMLElement2_put_onscroll,
1036     HTMLElement2_get_onscroll,
1037     HTMLElement2_put_ondrag,
1038     HTMLElement2_get_ondrag,
1039     HTMLElement2_put_ondragend,
1040     HTMLElement2_get_ondragend,
1041     HTMLElement2_put_ondragenter,
1042     HTMLElement2_get_ondragenter,
1043     HTMLElement2_put_ondragover,
1044     HTMLElement2_get_ondragover,
1045     HTMLElement2_put_ondragleave,
1046     HTMLElement2_get_ondragleave,
1047     HTMLElement2_put_ondrop,
1048     HTMLElement2_get_ondrop,
1049     HTMLElement2_put_onbeforecut,
1050     HTMLElement2_get_onbeforecut,
1051     HTMLElement2_put_oncut,
1052     HTMLElement2_get_oncut,
1053     HTMLElement2_put_onbeforecopy,
1054     HTMLElement2_get_onbeforecopy,
1055     HTMLElement2_put_oncopy,
1056     HTMLElement2_get_oncopy,
1057     HTMLElement2_put_onbeforepaste,
1058     HTMLElement2_get_onbeforepaste,
1059     HTMLElement2_put_onpaste,
1060     HTMLElement2_get_onpaste,
1061     HTMLElement2_get_currentStyle,
1062     HTMLElement2_put_onpropertychange,
1063     HTMLElement2_get_onpropertychange,
1064     HTMLElement2_getClientRects,
1065     HTMLElement2_getBoundingClientRect,
1066     HTMLElement2_setExpression,
1067     HTMLElement2_getExpression,
1068     HTMLElement2_removeExpression,
1069     HTMLElement2_put_tabIndex,
1070     HTMLElement2_get_tabIndex,
1071     HTMLElement2_focus,
1072     HTMLElement2_put_accessKey,
1073     HTMLElement2_get_accessKey,
1074     HTMLElement2_put_onblur,
1075     HTMLElement2_get_onblur,
1076     HTMLElement2_put_onfocus,
1077     HTMLElement2_get_onfocus,
1078     HTMLElement2_put_onresize,
1079     HTMLElement2_get_onresize,
1080     HTMLElement2_blur,
1081     HTMLElement2_addFilter,
1082     HTMLElement2_removeFilter,
1083     HTMLElement2_get_clientHeight,
1084     HTMLElement2_get_clientWidth,
1085     HTMLElement2_get_clientTop,
1086     HTMLElement2_get_clientLeft,
1087     HTMLElement2_attachEvent,
1088     HTMLElement2_detachEvent,
1089     HTMLElement2_get_readyState,
1090     HTMLElement2_put_onreadystatechange,
1091     HTMLElement2_get_onreadystatechange,
1092     HTMLElement2_put_onrowsdelete,
1093     HTMLElement2_get_onrowsdelete,
1094     HTMLElement2_put_onrowsinserted,
1095     HTMLElement2_get_onrowsinserted,
1096     HTMLElement2_put_oncellchange,
1097     HTMLElement2_get_oncellchange,
1098     HTMLElement2_put_dir,
1099     HTMLElement2_get_dir,
1100     HTMLElement2_createControlRange,
1101     HTMLElement2_get_scrollHeight,
1102     HTMLElement2_get_scrollWidth,
1103     HTMLElement2_put_scrollTop,
1104     HTMLElement2_get_scrollTop,
1105     HTMLElement2_put_scrollLeft,
1106     HTMLElement2_get_scrollLeft,
1107     HTMLElement2_clearAttributes,
1108     HTMLElement2_mergeAttributes,
1109     HTMLElement2_put_oncontextmenu,
1110     HTMLElement2_get_oncontextmenu,
1111     HTMLElement2_insertAdjecentElement,
1112     HTMLElement2_applyElement,
1113     HTMLElement2_getAdjecentText,
1114     HTMLElement2_replaceAdjecentText,
1115     HTMLElement2_get_canHandleChildren,
1116     HTMLElement2_addBehavior,
1117     HTMLElement2_removeBehavior,
1118     HTMLElement2_get_runtimeStyle,
1119     HTMLElement2_get_behaviorUrns,
1120     HTMLElement2_put_tagUrn,
1121     HTMLElement2_get_tagUrn,
1122     HTMLElement2_put_onbeforeeditfocus,
1123     HTMLElement2_get_onbeforeeditfocus,
1124     HTMLElement2_get_readyStateValue,
1125     HTMLElement2_getElementsByTagName,
1126 };
1127
1128 void HTMLElement2_Init(HTMLElement *This)
1129 {
1130     This->lpHTMLElement2Vtbl = &HTMLElement2Vtbl;
1131 }