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