gdi32: Avoid signed-unsigned integer comparisons.
[wine] / dlls / mshtml / htmlelem2.c
1 /*
2  * Copyright 2006-2010 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 #include <assert.h>
21 #include <math.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
29
30 #include "wine/debug.h"
31
32 #include "mshtml_private.h"
33 #include "htmlevent.h"
34 #include "htmlstyle.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37
38 typedef struct {
39     DispatchEx dispex;
40     IHTMLRect IHTMLRect_iface;
41
42     LONG ref;
43
44     nsIDOMClientRect *nsrect;
45 } HTMLRect;
46
47 static inline HTMLRect *impl_from_IHTMLRect(IHTMLRect *iface)
48 {
49     return CONTAINING_RECORD(iface, HTMLRect, IHTMLRect_iface);
50 }
51
52 static HRESULT WINAPI HTMLRect_QueryInterface(IHTMLRect *iface, REFIID riid, void **ppv)
53 {
54     HTMLRect *This = impl_from_IHTMLRect(iface);
55
56     if(IsEqualGUID(&IID_IUnknown, riid)) {
57         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
58         *ppv = &This->IHTMLRect_iface;
59     }else if(IsEqualGUID(&IID_IHTMLRect, riid)) {
60         TRACE("(%p)->(IID_IHTMLRect %p)\n", This, ppv);
61         *ppv = &This->IHTMLRect_iface;
62     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
63         return *ppv ? S_OK : E_NOINTERFACE;
64     }else {
65         FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
66         *ppv = NULL;
67         return E_NOINTERFACE;
68     }
69
70     IUnknown_AddRef((IUnknown*)*ppv);
71     return S_OK;
72 }
73
74 static ULONG WINAPI HTMLRect_AddRef(IHTMLRect *iface)
75 {
76     HTMLRect *This = impl_from_IHTMLRect(iface);
77     LONG ref = InterlockedIncrement(&This->ref);
78
79     TRACE("(%p) ref=%d\n", This, ref);
80
81     return ref;
82 }
83
84 static ULONG WINAPI HTMLRect_Release(IHTMLRect *iface)
85 {
86     HTMLRect *This = impl_from_IHTMLRect(iface);
87     LONG ref = InterlockedDecrement(&This->ref);
88
89     TRACE("(%p) ref=%d\n", This, ref);
90
91     if(!ref) {
92         if(This->nsrect)
93             nsIDOMClientRect_Release(This->nsrect);
94         heap_free(This);
95     }
96
97     return ref;
98 }
99
100 static HRESULT WINAPI HTMLRect_GetTypeInfoCount(IHTMLRect *iface, UINT *pctinfo)
101 {
102     HTMLRect *This = impl_from_IHTMLRect(iface);
103     FIXME("(%p)->(%p)\n", This, pctinfo);
104     return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI HTMLRect_GetTypeInfo(IHTMLRect *iface, UINT iTInfo,
108         LCID lcid, ITypeInfo **ppTInfo)
109 {
110     HTMLRect *This = impl_from_IHTMLRect(iface);
111
112     return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
113 }
114
115 static HRESULT WINAPI HTMLRect_GetIDsOfNames(IHTMLRect *iface, REFIID riid,
116         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
117 {
118     HTMLRect *This = impl_from_IHTMLRect(iface);
119
120     return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
121             lcid, rgDispId);
122 }
123
124 static HRESULT WINAPI HTMLRect_Invoke(IHTMLRect *iface, DISPID dispIdMember,
125         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
126         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
127 {
128     HTMLRect *This = impl_from_IHTMLRect(iface);
129
130     return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
131             pDispParams, pVarResult, pExcepInfo, puArgErr);
132 }
133
134 static HRESULT WINAPI HTMLRect_put_left(IHTMLRect *iface, LONG v)
135 {
136     HTMLRect *This = impl_from_IHTMLRect(iface);
137     FIXME("(%p)->(%d)\n", This, v);
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI HTMLRect_get_left(IHTMLRect *iface, LONG *p)
142 {
143     HTMLRect *This = impl_from_IHTMLRect(iface);
144     float left;
145     nsresult nsres;
146
147     TRACE("(%p)->(%p)\n", This, p);
148
149     nsres = nsIDOMClientRect_GetLeft(This->nsrect, &left);
150     if(NS_FAILED(nsres)) {
151         ERR("GetLeft failed: %08x\n", nsres);
152         return E_FAIL;
153     }
154
155     *p = floor(left+0.5);
156     return S_OK;
157 }
158
159 static HRESULT WINAPI HTMLRect_put_top(IHTMLRect *iface, LONG v)
160 {
161     HTMLRect *This = impl_from_IHTMLRect(iface);
162     FIXME("(%p)->(%d)\n", This, v);
163     return E_NOTIMPL;
164 }
165
166 static HRESULT WINAPI HTMLRect_get_top(IHTMLRect *iface, LONG *p)
167 {
168     HTMLRect *This = impl_from_IHTMLRect(iface);
169     float top;
170     nsresult nsres;
171
172     TRACE("(%p)->(%p)\n", This, p);
173
174     nsres = nsIDOMClientRect_GetTop(This->nsrect, &top);
175     if(NS_FAILED(nsres)) {
176         ERR("GetTop failed: %08x\n", nsres);
177         return E_FAIL;
178     }
179
180     *p = floor(top+0.5);
181     return S_OK;
182 }
183
184 static HRESULT WINAPI HTMLRect_put_right(IHTMLRect *iface, LONG v)
185 {
186     HTMLRect *This = impl_from_IHTMLRect(iface);
187     FIXME("(%p)->(%d)\n", This, v);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI HTMLRect_get_right(IHTMLRect *iface, LONG *p)
192 {
193     HTMLRect *This = impl_from_IHTMLRect(iface);
194     float right;
195     nsresult nsres;
196
197     TRACE("(%p)->(%p)\n", This, p);
198
199     nsres = nsIDOMClientRect_GetRight(This->nsrect, &right);
200     if(NS_FAILED(nsres)) {
201         ERR("GetRight failed: %08x\n", nsres);
202         return E_FAIL;
203     }
204
205     *p = floor(right+0.5);
206     return S_OK;
207 }
208
209 static HRESULT WINAPI HTMLRect_put_bottom(IHTMLRect *iface, LONG v)
210 {
211     HTMLRect *This = impl_from_IHTMLRect(iface);
212     FIXME("(%p)->(%d)\n", This, v);
213     return E_NOTIMPL;
214 }
215
216 static HRESULT WINAPI HTMLRect_get_bottom(IHTMLRect *iface, LONG *p)
217 {
218     HTMLRect *This = impl_from_IHTMLRect(iface);
219     float bottom;
220     nsresult nsres;
221
222     TRACE("(%p)->(%p)\n", This, p);
223
224     nsres = nsIDOMClientRect_GetBottom(This->nsrect, &bottom);
225     if(NS_FAILED(nsres)) {
226         ERR("GetBottom failed: %08x\n", nsres);
227         return E_FAIL;
228     }
229
230     *p = floor(bottom+0.5);
231     return S_OK;
232 }
233
234 static const IHTMLRectVtbl HTMLRectVtbl = {
235     HTMLRect_QueryInterface,
236     HTMLRect_AddRef,
237     HTMLRect_Release,
238     HTMLRect_GetTypeInfoCount,
239     HTMLRect_GetTypeInfo,
240     HTMLRect_GetIDsOfNames,
241     HTMLRect_Invoke,
242     HTMLRect_put_left,
243     HTMLRect_get_left,
244     HTMLRect_put_top,
245     HTMLRect_get_top,
246     HTMLRect_put_right,
247     HTMLRect_get_right,
248     HTMLRect_put_bottom,
249     HTMLRect_get_bottom
250 };
251
252 static const tid_t HTMLRect_iface_tids[] = {
253     IHTMLRect_tid,
254     0
255 };
256 static dispex_static_data_t HTMLRect_dispex = {
257     NULL,
258     IHTMLRect_tid,
259     NULL,
260     HTMLRect_iface_tids
261 };
262
263 static HRESULT create_html_rect(nsIDOMClientRect *nsrect, IHTMLRect **ret)
264 {
265     HTMLRect *rect;
266
267     rect = heap_alloc_zero(sizeof(HTMLRect));
268     if(!rect)
269         return E_OUTOFMEMORY;
270
271     rect->IHTMLRect_iface.lpVtbl = &HTMLRectVtbl;
272     rect->ref = 1;
273
274     init_dispex(&rect->dispex, (IUnknown*)&rect->IHTMLRect_iface, &HTMLRect_dispex);
275
276     nsIDOMClientRect_AddRef(nsrect);
277     rect->nsrect = nsrect;
278
279     *ret = &rect->IHTMLRect_iface;
280     return S_OK;
281 }
282
283 static inline HTMLElement *impl_from_IHTMLElement2(IHTMLElement2 *iface)
284 {
285     return CONTAINING_RECORD(iface, HTMLElement, IHTMLElement2_iface);
286 }
287
288 static HRESULT WINAPI HTMLElement2_QueryInterface(IHTMLElement2 *iface,
289                                                   REFIID riid, void **ppv)
290 {
291     HTMLElement *This = impl_from_IHTMLElement2(iface);
292     return IHTMLElement_QueryInterface(&This->IHTMLElement_iface, riid, ppv);
293 }
294
295 static ULONG WINAPI HTMLElement2_AddRef(IHTMLElement2 *iface)
296 {
297     HTMLElement *This = impl_from_IHTMLElement2(iface);
298     return IHTMLElement_AddRef(&This->IHTMLElement_iface);
299 }
300
301 static ULONG WINAPI HTMLElement2_Release(IHTMLElement2 *iface)
302 {
303     HTMLElement *This = impl_from_IHTMLElement2(iface);
304     return IHTMLElement_Release(&This->IHTMLElement_iface);
305 }
306
307 static HRESULT WINAPI HTMLElement2_GetTypeInfoCount(IHTMLElement2 *iface, UINT *pctinfo)
308 {
309     HTMLElement *This = impl_from_IHTMLElement2(iface);
310     return IDispatchEx_GetTypeInfoCount(&This->node.dispex.IDispatchEx_iface, pctinfo);
311 }
312
313 static HRESULT WINAPI HTMLElement2_GetTypeInfo(IHTMLElement2 *iface, UINT iTInfo,
314                                                LCID lcid, ITypeInfo **ppTInfo)
315 {
316     HTMLElement *This = impl_from_IHTMLElement2(iface);
317     return IDispatchEx_GetTypeInfo(&This->node.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
318 }
319
320 static HRESULT WINAPI HTMLElement2_GetIDsOfNames(IHTMLElement2 *iface, REFIID riid,
321                                                 LPOLESTR *rgszNames, UINT cNames,
322                                                 LCID lcid, DISPID *rgDispId)
323 {
324     HTMLElement *This = impl_from_IHTMLElement2(iface);
325     return IDispatchEx_GetIDsOfNames(&This->node.dispex.IDispatchEx_iface, riid, rgszNames, cNames,
326             lcid, rgDispId);
327 }
328
329 static HRESULT WINAPI HTMLElement2_Invoke(IHTMLElement2 *iface, DISPID dispIdMember,
330                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
331                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
332 {
333     HTMLElement *This = impl_from_IHTMLElement2(iface);
334     return IDispatchEx_Invoke(&This->node.dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
335             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
336 }
337
338 static HRESULT WINAPI HTMLElement2_get_scopeName(IHTMLElement2 *iface, BSTR *p)
339 {
340     HTMLElement *This = impl_from_IHTMLElement2(iface);
341     FIXME("(%p)->(%p)\n", This, p);
342     return E_NOTIMPL;
343 }
344
345 static HRESULT WINAPI HTMLElement2_setCapture(IHTMLElement2 *iface, VARIANT_BOOL containerCapture)
346 {
347     HTMLElement *This = impl_from_IHTMLElement2(iface);
348     FIXME("(%p)->(%x)\n", This, containerCapture);
349     return E_NOTIMPL;
350 }
351
352 static HRESULT WINAPI HTMLElement2_releaseCapture(IHTMLElement2 *iface)
353 {
354     HTMLElement *This = impl_from_IHTMLElement2(iface);
355     FIXME("(%p)\n", This);
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI HTMLElement2_put_onlosecapture(IHTMLElement2 *iface, VARIANT v)
360 {
361     HTMLElement *This = impl_from_IHTMLElement2(iface);
362     FIXME("(%p)->()\n", This);
363     return E_NOTIMPL;
364 }
365
366 static HRESULT WINAPI HTMLElement2_get_onlosecapture(IHTMLElement2 *iface, VARIANT *p)
367 {
368     HTMLElement *This = impl_from_IHTMLElement2(iface);
369     FIXME("(%p)->(%p)\n", This, p);
370     return E_NOTIMPL;
371 }
372
373 static HRESULT WINAPI HTMLElement2_componentFromPoint(IHTMLElement2 *iface,
374                                                       LONG x, LONG y, BSTR *component)
375 {
376     HTMLElement *This = impl_from_IHTMLElement2(iface);
377     FIXME("(%p)->(%d %d %p)\n", This, x, y, component);
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI HTMLElement2_doScroll(IHTMLElement2 *iface, VARIANT component)
382 {
383     HTMLElement *This = impl_from_IHTMLElement2(iface);
384
385     TRACE("(%p)->(%s)\n", This, debugstr_variant(&component));
386
387     if(!This->node.doc->content_ready
388        || !This->node.doc->basedoc.doc_obj->in_place_active)
389         return E_PENDING;
390
391     WARN("stub\n");
392     return S_OK;
393 }
394
395 static HRESULT WINAPI HTMLElement2_put_onscroll(IHTMLElement2 *iface, VARIANT v)
396 {
397     HTMLElement *This = impl_from_IHTMLElement2(iface);
398     FIXME("(%p)->()\n", This);
399     return E_NOTIMPL;
400 }
401
402 static HRESULT WINAPI HTMLElement2_get_onscroll(IHTMLElement2 *iface, VARIANT *p)
403 {
404     HTMLElement *This = impl_from_IHTMLElement2(iface);
405     FIXME("(%p)->(%p)\n", This, p);
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI HTMLElement2_put_ondrag(IHTMLElement2 *iface, VARIANT v)
410 {
411     HTMLElement *This = impl_from_IHTMLElement2(iface);
412
413     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
414
415     return set_node_event(&This->node, EVENTID_DRAG, &v);
416 }
417
418 static HRESULT WINAPI HTMLElement2_get_ondrag(IHTMLElement2 *iface, VARIANT *p)
419 {
420     HTMLElement *This = impl_from_IHTMLElement2(iface);
421
422     TRACE("(%p)->(%p)\n", This, p);
423
424     return get_node_event(&This->node, EVENTID_DRAG, p);
425 }
426
427 static HRESULT WINAPI HTMLElement2_put_ondragend(IHTMLElement2 *iface, VARIANT v)
428 {
429     HTMLElement *This = impl_from_IHTMLElement2(iface);
430     FIXME("(%p)->()\n", This);
431     return E_NOTIMPL;
432 }
433
434 static HRESULT WINAPI HTMLElement2_get_ondragend(IHTMLElement2 *iface, VARIANT *p)
435 {
436     HTMLElement *This = impl_from_IHTMLElement2(iface);
437     FIXME("(%p)->(%p)\n", This, p);
438     return E_NOTIMPL;
439 }
440
441 static HRESULT WINAPI HTMLElement2_put_ondragenter(IHTMLElement2 *iface, VARIANT v)
442 {
443     HTMLElement *This = impl_from_IHTMLElement2(iface);
444     FIXME("(%p)->()\n", This);
445     return E_NOTIMPL;
446 }
447
448 static HRESULT WINAPI HTMLElement2_get_ondragenter(IHTMLElement2 *iface, VARIANT *p)
449 {
450     HTMLElement *This = impl_from_IHTMLElement2(iface);
451     FIXME("(%p)->(%p)\n", This, p);
452     return E_NOTIMPL;
453 }
454
455 static HRESULT WINAPI HTMLElement2_put_ondragover(IHTMLElement2 *iface, VARIANT v)
456 {
457     HTMLElement *This = impl_from_IHTMLElement2(iface);
458     FIXME("(%p)->()\n", This);
459     return E_NOTIMPL;
460 }
461
462 static HRESULT WINAPI HTMLElement2_get_ondragover(IHTMLElement2 *iface, VARIANT *p)
463 {
464     HTMLElement *This = impl_from_IHTMLElement2(iface);
465     FIXME("(%p)->(%p)\n", This, p);
466     return E_NOTIMPL;
467 }
468
469 static HRESULT WINAPI HTMLElement2_put_ondragleave(IHTMLElement2 *iface, VARIANT v)
470 {
471     HTMLElement *This = impl_from_IHTMLElement2(iface);
472     FIXME("(%p)->()\n", This);
473     return E_NOTIMPL;
474 }
475
476 static HRESULT WINAPI HTMLElement2_get_ondragleave(IHTMLElement2 *iface, VARIANT *p)
477 {
478     HTMLElement *This = impl_from_IHTMLElement2(iface);
479     FIXME("(%p)->(%p)\n", This, p);
480     return E_NOTIMPL;
481 }
482
483 static HRESULT WINAPI HTMLElement2_put_ondrop(IHTMLElement2 *iface, VARIANT v)
484 {
485     HTMLElement *This = impl_from_IHTMLElement2(iface);
486     FIXME("(%p)->()\n", This);
487     return E_NOTIMPL;
488 }
489
490 static HRESULT WINAPI HTMLElement2_get_ondrop(IHTMLElement2 *iface, VARIANT *p)
491 {
492     HTMLElement *This = impl_from_IHTMLElement2(iface);
493     FIXME("(%p)->(%p)\n", This, p);
494     return E_NOTIMPL;
495 }
496
497 static HRESULT WINAPI HTMLElement2_put_onbeforecut(IHTMLElement2 *iface, VARIANT v)
498 {
499     HTMLElement *This = impl_from_IHTMLElement2(iface);
500     FIXME("(%p)->()\n", This);
501     return E_NOTIMPL;
502 }
503
504 static HRESULT WINAPI HTMLElement2_get_onbeforecut(IHTMLElement2 *iface, VARIANT *p)
505 {
506     HTMLElement *This = impl_from_IHTMLElement2(iface);
507     FIXME("(%p)->(%p)\n", This, p);
508     return E_NOTIMPL;
509 }
510
511 static HRESULT WINAPI HTMLElement2_put_oncut(IHTMLElement2 *iface, VARIANT v)
512 {
513     HTMLElement *This = impl_from_IHTMLElement2(iface);
514     FIXME("(%p)->()\n", This);
515     return E_NOTIMPL;
516 }
517
518 static HRESULT WINAPI HTMLElement2_get_oncut(IHTMLElement2 *iface, VARIANT *p)
519 {
520     HTMLElement *This = impl_from_IHTMLElement2(iface);
521     FIXME("(%p)->(%p)\n", This, p);
522     return E_NOTIMPL;
523 }
524
525 static HRESULT WINAPI HTMLElement2_put_onbeforecopy(IHTMLElement2 *iface, VARIANT v)
526 {
527     HTMLElement *This = impl_from_IHTMLElement2(iface);
528     FIXME("(%p)->()\n", This);
529     return E_NOTIMPL;
530 }
531
532 static HRESULT WINAPI HTMLElement2_get_onbeforecopy(IHTMLElement2 *iface, VARIANT *p)
533 {
534     HTMLElement *This = impl_from_IHTMLElement2(iface);
535     FIXME("(%p)->(%p)\n", This, p);
536     return E_NOTIMPL;
537 }
538
539 static HRESULT WINAPI HTMLElement2_put_oncopy(IHTMLElement2 *iface, VARIANT v)
540 {
541     HTMLElement *This = impl_from_IHTMLElement2(iface);
542     FIXME("(%p)->()\n", This);
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI HTMLElement2_get_oncopy(IHTMLElement2 *iface, VARIANT *p)
547 {
548     HTMLElement *This = impl_from_IHTMLElement2(iface);
549     FIXME("(%p)->(%p)\n", This, p);
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI HTMLElement2_put_onbeforepaste(IHTMLElement2 *iface, VARIANT v)
554 {
555     HTMLElement *This = impl_from_IHTMLElement2(iface);
556     FIXME("(%p)->()\n", This);
557     return E_NOTIMPL;
558 }
559
560 static HRESULT WINAPI HTMLElement2_get_onbeforepaste(IHTMLElement2 *iface, VARIANT *p)
561 {
562     HTMLElement *This = impl_from_IHTMLElement2(iface);
563     FIXME("(%p)->(%p)\n", This, p);
564     return E_NOTIMPL;
565 }
566
567 static HRESULT WINAPI HTMLElement2_put_onpaste(IHTMLElement2 *iface, VARIANT v)
568 {
569     HTMLElement *This = impl_from_IHTMLElement2(iface);
570
571     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
572
573     return set_node_event(&This->node, EVENTID_PASTE, &v);
574 }
575
576 static HRESULT WINAPI HTMLElement2_get_onpaste(IHTMLElement2 *iface, VARIANT *p)
577 {
578     HTMLElement *This = impl_from_IHTMLElement2(iface);
579
580     TRACE("(%p)->(%p)\n", This, p);
581
582     return get_node_event(&This->node, EVENTID_PASTE, p);
583 }
584
585 static HRESULT WINAPI HTMLElement2_get_currentStyle(IHTMLElement2 *iface, IHTMLCurrentStyle **p)
586 {
587     HTMLElement *This = impl_from_IHTMLElement2(iface);
588
589     TRACE("(%p)->(%p)\n", This, p);
590
591     return HTMLCurrentStyle_Create(This, p);
592 }
593
594 static HRESULT WINAPI HTMLElement2_put_onpropertychange(IHTMLElement2 *iface, VARIANT v)
595 {
596     HTMLElement *This = impl_from_IHTMLElement2(iface);
597     FIXME("(%p)->()\n", This);
598     return E_NOTIMPL;
599 }
600
601 static HRESULT WINAPI HTMLElement2_get_onpropertychange(IHTMLElement2 *iface, VARIANT *p)
602 {
603     HTMLElement *This = impl_from_IHTMLElement2(iface);
604     FIXME("(%p)->(%p)\n", This, p);
605     return E_NOTIMPL;
606 }
607
608 static HRESULT WINAPI HTMLElement2_getClientRects(IHTMLElement2 *iface, IHTMLRectCollection **pRectCol)
609 {
610     HTMLElement *This = impl_from_IHTMLElement2(iface);
611     FIXME("(%p)->(%p)\n", This, pRectCol);
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI HTMLElement2_getBoundingClientRect(IHTMLElement2 *iface, IHTMLRect **pRect)
616 {
617     HTMLElement *This = impl_from_IHTMLElement2(iface);
618     nsIDOMClientRect *nsrect;
619     nsresult nsres;
620     HRESULT hres;
621
622     TRACE("(%p)->(%p)\n", This, pRect);
623
624     nsres = nsIDOMHTMLElement_GetBoundingClientRect(This->nselem, &nsrect);
625     if(NS_FAILED(nsres) || !nsrect) {
626         ERR("GetBoindingClientRect failed: %08x\n", nsres);
627         return E_FAIL;
628     }
629
630     hres = create_html_rect(nsrect, pRect);
631
632     nsIDOMClientRect_Release(nsrect);
633     return hres;
634 }
635
636 static HRESULT WINAPI HTMLElement2_setExpression(IHTMLElement2 *iface, BSTR propname,
637                                                  BSTR expression, BSTR language)
638 {
639     HTMLElement *This = impl_from_IHTMLElement2(iface);
640     FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(propname), debugstr_w(expression),
641           debugstr_w(language));
642     return E_NOTIMPL;
643 }
644
645 static HRESULT WINAPI HTMLElement2_getExpression(IHTMLElement2 *iface, BSTR propname,
646                                                  VARIANT *expression)
647 {
648     HTMLElement *This = impl_from_IHTMLElement2(iface);
649     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), expression);
650     return E_NOTIMPL;
651 }
652
653 static HRESULT WINAPI HTMLElement2_removeExpression(IHTMLElement2 *iface, BSTR propname,
654                                                     VARIANT_BOOL *pfSuccess)
655 {
656     HTMLElement *This = impl_from_IHTMLElement2(iface);
657     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), pfSuccess);
658     return E_NOTIMPL;
659 }
660
661 static HRESULT WINAPI HTMLElement2_put_tabIndex(IHTMLElement2 *iface, short v)
662 {
663     HTMLElement *This = impl_from_IHTMLElement2(iface);
664     nsresult nsres;
665
666     TRACE("(%p)->(%d)\n", This, v);
667
668     nsres = nsIDOMHTMLElement_SetTabIndex(This->nselem, v);
669     if(NS_FAILED(nsres))
670         ERR("GetTabIndex failed: %08x\n", nsres);
671
672     return S_OK;
673 }
674
675 static HRESULT WINAPI HTMLElement2_get_tabIndex(IHTMLElement2 *iface, short *p)
676 {
677     HTMLElement *This = impl_from_IHTMLElement2(iface);
678     LONG index;
679     nsresult nsres;
680
681     TRACE("(%p)->(%p)\n", This, p);
682
683     nsres = nsIDOMHTMLElement_GetTabIndex(This->nselem, &index);
684     if(NS_FAILED(nsres)) {
685         ERR("GetTabIndex failed: %08x\n", nsres);
686         return E_FAIL;
687     }
688
689     *p = index;
690     return S_OK;
691 }
692
693 static HRESULT WINAPI HTMLElement2_focus(IHTMLElement2 *iface)
694 {
695     HTMLElement *This = impl_from_IHTMLElement2(iface);
696     nsresult nsres;
697
698     TRACE("(%p)\n", This);
699
700     nsres = nsIDOMHTMLElement_Focus(This->nselem);
701     if(NS_FAILED(nsres))
702         ERR("Focus failed: %08x\n", nsres);
703
704     return S_OK;
705 }
706
707 static HRESULT WINAPI HTMLElement2_put_accessKey(IHTMLElement2 *iface, BSTR v)
708 {
709     HTMLElement *This = impl_from_IHTMLElement2(iface);
710     VARIANT var;
711
712     static WCHAR accessKeyW[] = {'a','c','c','e','s','s','K','e','y',0};
713
714     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
715
716     V_VT(&var) = VT_BSTR;
717     V_BSTR(&var) = v;
718     return IHTMLElement_setAttribute(&This->IHTMLElement_iface, accessKeyW, var, 0);
719 }
720
721 static HRESULT WINAPI HTMLElement2_get_accessKey(IHTMLElement2 *iface, BSTR *p)
722 {
723     HTMLElement *This = impl_from_IHTMLElement2(iface);
724     FIXME("(%p)->(%p)\n", This, p);
725     return E_NOTIMPL;
726 }
727
728 static HRESULT WINAPI HTMLElement2_put_onblur(IHTMLElement2 *iface, VARIANT v)
729 {
730     HTMLElement *This = impl_from_IHTMLElement2(iface);
731
732     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
733
734     return set_node_event(&This->node, EVENTID_BLUR, &v);
735 }
736
737 static HRESULT WINAPI HTMLElement2_get_onblur(IHTMLElement2 *iface, VARIANT *p)
738 {
739     HTMLElement *This = impl_from_IHTMLElement2(iface);
740
741     TRACE("(%p)->(%p)\n", This, p);
742
743     return get_node_event(&This->node, EVENTID_BLUR, p);
744 }
745
746 static HRESULT WINAPI HTMLElement2_put_onfocus(IHTMLElement2 *iface, VARIANT v)
747 {
748     HTMLElement *This = impl_from_IHTMLElement2(iface);
749
750     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
751
752     return set_node_event(&This->node, EVENTID_FOCUS, &v);
753 }
754
755 static HRESULT WINAPI HTMLElement2_get_onfocus(IHTMLElement2 *iface, VARIANT *p)
756 {
757     HTMLElement *This = impl_from_IHTMLElement2(iface);
758
759     TRACE("(%p)->(%p)\n", This, p);
760
761     return get_node_event(&This->node, EVENTID_FOCUS, p);
762 }
763
764 static HRESULT WINAPI HTMLElement2_put_onresize(IHTMLElement2 *iface, VARIANT v)
765 {
766     HTMLElement *This = impl_from_IHTMLElement2(iface);
767     FIXME("(%p)->()\n", This);
768     return E_NOTIMPL;
769 }
770
771 static HRESULT WINAPI HTMLElement2_get_onresize(IHTMLElement2 *iface, VARIANT *p)
772 {
773     HTMLElement *This = impl_from_IHTMLElement2(iface);
774     FIXME("(%p)->(%p)\n", This, p);
775     return E_NOTIMPL;
776 }
777
778 static HRESULT WINAPI HTMLElement2_blur(IHTMLElement2 *iface)
779 {
780     HTMLElement *This = impl_from_IHTMLElement2(iface);
781     nsresult nsres;
782
783     TRACE("(%p)\n", This);
784
785     nsres = nsIDOMHTMLElement_Blur(This->nselem);
786     if(NS_FAILED(nsres)) {
787         ERR("Blur failed: %08x\n", nsres);
788         return E_FAIL;
789     }
790
791     return S_OK;
792 }
793
794 static HRESULT WINAPI HTMLElement2_addFilter(IHTMLElement2 *iface, IUnknown *pUnk)
795 {
796     HTMLElement *This = impl_from_IHTMLElement2(iface);
797     FIXME("(%p)->(%p)\n", This, pUnk);
798     return E_NOTIMPL;
799 }
800
801 static HRESULT WINAPI HTMLElement2_removeFilter(IHTMLElement2 *iface, IUnknown *pUnk)
802 {
803     HTMLElement *This = impl_from_IHTMLElement2(iface);
804     FIXME("(%p)->(%p)\n", This, pUnk);
805     return E_NOTIMPL;
806 }
807
808 static HRESULT WINAPI HTMLElement2_get_clientHeight(IHTMLElement2 *iface, LONG *p)
809 {
810     HTMLElement *This = impl_from_IHTMLElement2(iface);
811     nsresult nsres;
812
813     TRACE("(%p)->(%p)\n", This, p);
814
815     nsres = nsIDOMHTMLElement_GetClientHeight(This->nselem, p);
816     assert(nsres == NS_OK);
817     return S_OK;
818 }
819
820 static HRESULT WINAPI HTMLElement2_get_clientWidth(IHTMLElement2 *iface, LONG *p)
821 {
822     HTMLElement *This = impl_from_IHTMLElement2(iface);
823     nsresult nsres;
824
825     TRACE("(%p)->(%p)\n", This, p);
826
827     nsres = nsIDOMHTMLElement_GetClientWidth(This->nselem, p);
828     assert(nsres == NS_OK);
829     return S_OK;
830 }
831
832 static HRESULT WINAPI HTMLElement2_get_clientTop(IHTMLElement2 *iface, LONG *p)
833 {
834     HTMLElement *This = impl_from_IHTMLElement2(iface);
835     nsresult nsres;
836
837     TRACE("(%p)->(%p)\n", This, p);
838
839     nsres = nsIDOMHTMLElement_GetClientTop(This->nselem, p);
840     assert(nsres == NS_OK);
841
842     TRACE("*p = %d\n", *p);
843     return S_OK;
844 }
845
846 static HRESULT WINAPI HTMLElement2_get_clientLeft(IHTMLElement2 *iface, LONG *p)
847 {
848     HTMLElement *This = impl_from_IHTMLElement2(iface);
849     nsresult nsres;
850
851     TRACE("(%p)->(%p)\n", This, p);
852
853     nsres = nsIDOMHTMLElement_GetClientLeft(This->nselem, p);
854     assert(nsres == NS_OK);
855
856     TRACE("*p = %d\n", *p);
857     return S_OK;
858 }
859
860 static HRESULT WINAPI HTMLElement2_attachEvent(IHTMLElement2 *iface, BSTR event,
861                                                IDispatch *pDisp, VARIANT_BOOL *pfResult)
862 {
863     HTMLElement *This = impl_from_IHTMLElement2(iface);
864
865     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
866
867     return attach_event(get_node_event_target(&This->node), This->node.nsnode, &This->node.doc->basedoc, event, pDisp, pfResult);
868 }
869
870 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
871 {
872     HTMLElement *This = impl_from_IHTMLElement2(iface);
873
874     TRACE("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp);
875
876     return detach_event(*get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp);
877 }
878
879 static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p)
880 {
881     HTMLElement *This = impl_from_IHTMLElement2(iface);
882     BSTR str;
883
884     TRACE("(%p)->(%p)\n", This, p);
885
886     if(This->node.vtbl->get_readystate) {
887         HRESULT hres;
888
889         hres = This->node.vtbl->get_readystate(&This->node, &str);
890         if(FAILED(hres))
891             return hres;
892     }else {
893         static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0};
894
895         str = SysAllocString(completeW);
896         if(!str)
897             return E_OUTOFMEMORY;
898     }
899
900     V_VT(p) = VT_BSTR;
901     V_BSTR(p) = str;
902     return S_OK;
903 }
904
905 static HRESULT WINAPI HTMLElement2_put_onreadystatechange(IHTMLElement2 *iface, VARIANT v)
906 {
907     HTMLElement *This = impl_from_IHTMLElement2(iface);
908
909     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
910
911     return set_node_event(&This->node, EVENTID_READYSTATECHANGE, &v);
912 }
913
914 static HRESULT WINAPI HTMLElement2_get_onreadystatechange(IHTMLElement2 *iface, VARIANT *p)
915 {
916     HTMLElement *This = impl_from_IHTMLElement2(iface);
917
918     TRACE("(%p)->(%p)\n", This, p);
919
920     return get_node_event(&This->node, EVENTID_READYSTATECHANGE, p);
921 }
922
923 static HRESULT WINAPI HTMLElement2_put_onrowsdelete(IHTMLElement2 *iface, VARIANT v)
924 {
925     HTMLElement *This = impl_from_IHTMLElement2(iface);
926     FIXME("(%p)->()\n", This);
927     return E_NOTIMPL;
928 }
929
930 static HRESULT WINAPI HTMLElement2_get_onrowsdelete(IHTMLElement2 *iface, VARIANT *p)
931 {
932     HTMLElement *This = impl_from_IHTMLElement2(iface);
933     FIXME("(%p)->(%p)\n", This, p);
934     return E_NOTIMPL;
935 }
936
937 static HRESULT WINAPI HTMLElement2_put_onrowsinserted(IHTMLElement2 *iface, VARIANT v)
938 {
939     HTMLElement *This = impl_from_IHTMLElement2(iface);
940     FIXME("(%p)->()\n", This);
941     return E_NOTIMPL;
942 }
943
944 static HRESULT WINAPI HTMLElement2_get_onrowsinserted(IHTMLElement2 *iface, VARIANT *p)
945 {
946     HTMLElement *This = impl_from_IHTMLElement2(iface);
947     FIXME("(%p)->(%p)\n", This, p);
948     return E_NOTIMPL;
949 }
950
951 static HRESULT WINAPI HTMLElement2_put_oncellchange(IHTMLElement2 *iface, VARIANT v)
952 {
953     HTMLElement *This = impl_from_IHTMLElement2(iface);
954     FIXME("(%p)->()\n", This);
955     return E_NOTIMPL;
956 }
957
958 static HRESULT WINAPI HTMLElement2_get_oncellchange(IHTMLElement2 *iface, VARIANT *p)
959 {
960     HTMLElement *This = impl_from_IHTMLElement2(iface);
961     FIXME("(%p)->(%p)\n", This, p);
962     return E_NOTIMPL;
963 }
964
965 static HRESULT WINAPI HTMLElement2_put_dir(IHTMLElement2 *iface, BSTR v)
966 {
967     HTMLElement *This = impl_from_IHTMLElement2(iface);
968     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
969     return E_NOTIMPL;
970 }
971
972 static HRESULT WINAPI HTMLElement2_get_dir(IHTMLElement2 *iface, BSTR *p)
973 {
974     HTMLElement *This = impl_from_IHTMLElement2(iface);
975     nsAString dir_str;
976     nsresult nsres;
977
978     TRACE("(%p)->(%p)\n", This, p);
979
980     if(!This->nselem) {
981         *p = NULL;
982         return S_OK;
983     }
984
985     nsres = nsIDOMHTMLElement_GetDir(This->nselem, &dir_str);
986     return return_nsstr(nsres, &dir_str, p);
987 }
988
989 static HRESULT WINAPI HTMLElement2_createControlRange(IHTMLElement2 *iface, IDispatch **range)
990 {
991     HTMLElement *This = impl_from_IHTMLElement2(iface);
992     FIXME("(%p)->(%p)\n", This, range);
993     return E_NOTIMPL;
994 }
995
996 static HRESULT WINAPI HTMLElement2_get_scrollHeight(IHTMLElement2 *iface, LONG *p)
997 {
998     HTMLElement *This = impl_from_IHTMLElement2(iface);
999     nsresult nsres;
1000
1001     TRACE("(%p)->(%p)\n", This, p);
1002
1003     nsres = nsIDOMHTMLElement_GetScrollHeight(This->nselem, p);
1004     assert(nsres == NS_OK);
1005
1006     TRACE("*p = %d\n", *p);
1007     return S_OK;
1008 }
1009
1010 static HRESULT WINAPI HTMLElement2_get_scrollWidth(IHTMLElement2 *iface, LONG *p)
1011 {
1012     HTMLElement *This = impl_from_IHTMLElement2(iface);
1013     nsresult nsres;
1014
1015     TRACE("(%p)->(%p)\n", This, p);
1016
1017     nsres = nsIDOMHTMLElement_GetScrollWidth(This->nselem, p);
1018     assert(nsres == NS_OK);
1019
1020     TRACE("*p = %d\n", *p);
1021     return S_OK;
1022 }
1023
1024 static HRESULT WINAPI HTMLElement2_put_scrollTop(IHTMLElement2 *iface, LONG v)
1025 {
1026     HTMLElement *This = impl_from_IHTMLElement2(iface);
1027
1028     TRACE("(%p)->(%d)\n", This, v);
1029
1030     if(!This->nselem) {
1031         FIXME("NULL nselem\n");
1032         return E_NOTIMPL;
1033     }
1034
1035     nsIDOMHTMLElement_SetScrollTop(This->nselem, v);
1036     return S_OK;
1037 }
1038
1039 static HRESULT WINAPI HTMLElement2_get_scrollTop(IHTMLElement2 *iface, LONG *p)
1040 {
1041     HTMLElement *This = impl_from_IHTMLElement2(iface);
1042     nsresult nsres;
1043
1044     TRACE("(%p)->(%p)\n", This, p);
1045
1046     nsres = nsIDOMHTMLElement_GetScrollTop(This->nselem, p);
1047     assert(nsres == NS_OK);
1048
1049     TRACE("*p = %d\n", *p);
1050     return S_OK;
1051 }
1052
1053 static HRESULT WINAPI HTMLElement2_put_scrollLeft(IHTMLElement2 *iface, LONG v)
1054 {
1055     HTMLElement *This = impl_from_IHTMLElement2(iface);
1056
1057     TRACE("(%p)->(%d)\n", This, v);
1058
1059     if(!This->nselem) {
1060         FIXME("NULL nselem\n");
1061         return E_NOTIMPL;
1062     }
1063
1064     nsIDOMHTMLElement_SetScrollLeft(This->nselem, v);
1065     return S_OK;
1066 }
1067
1068 static HRESULT WINAPI HTMLElement2_get_scrollLeft(IHTMLElement2 *iface, LONG *p)
1069 {
1070     HTMLElement *This = impl_from_IHTMLElement2(iface);
1071     nsresult nsres;
1072
1073     TRACE("(%p)->(%p)\n", This, p);
1074
1075     if(!p)
1076         return E_INVALIDARG;
1077
1078     if(!This->nselem)
1079     {
1080         FIXME("NULL nselem\n");
1081         return E_NOTIMPL;
1082     }
1083
1084     nsres = nsIDOMHTMLElement_GetScrollLeft(This->nselem, p);
1085     assert(nsres == NS_OK);
1086
1087     TRACE("*p = %d\n", *p);
1088     return S_OK;
1089 }
1090
1091 static HRESULT WINAPI HTMLElement2_clearAttributes(IHTMLElement2 *iface)
1092 {
1093     HTMLElement *This = impl_from_IHTMLElement2(iface);
1094     FIXME("(%p)\n", This);
1095     return E_NOTIMPL;
1096 }
1097
1098 static HRESULT WINAPI HTMLElement2_mergeAttributes(IHTMLElement2 *iface, IHTMLElement *mergeThis)
1099 {
1100     HTMLElement *This = impl_from_IHTMLElement2(iface);
1101     FIXME("(%p)->(%p)\n", This, mergeThis);
1102     return E_NOTIMPL;
1103 }
1104
1105 static HRESULT WINAPI HTMLElement2_put_oncontextmenu(IHTMLElement2 *iface, VARIANT v)
1106 {
1107     HTMLElement *This = impl_from_IHTMLElement2(iface);
1108     FIXME("(%p)->()\n", This);
1109     return E_NOTIMPL;
1110 }
1111
1112 static HRESULT WINAPI HTMLElement2_get_oncontextmenu(IHTMLElement2 *iface, VARIANT *p)
1113 {
1114     HTMLElement *This = impl_from_IHTMLElement2(iface);
1115     FIXME("(%p)->(%p)\n", This, p);
1116     return E_NOTIMPL;
1117 }
1118
1119 static HRESULT WINAPI HTMLElement2_insertAdjecentElement(IHTMLElement2 *iface, BSTR where,
1120         IHTMLElement *insertedElement, IHTMLElement **inserted)
1121 {
1122     HTMLElement *This = impl_from_IHTMLElement2(iface);
1123     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(where), insertedElement, inserted);
1124     return E_NOTIMPL;
1125 }
1126
1127 static HRESULT WINAPI HTMLElement2_applyElement(IHTMLElement2 *iface, IHTMLElement *apply,
1128                                                 BSTR where, IHTMLElement **applied)
1129 {
1130     HTMLElement *This = impl_from_IHTMLElement2(iface);
1131     FIXME("(%p)->(%p %s %p)\n", This, apply, debugstr_w(where), applied);
1132     return E_NOTIMPL;
1133 }
1134
1135 static HRESULT WINAPI HTMLElement2_getAdjecentText(IHTMLElement2 *iface, BSTR where, BSTR *text)
1136 {
1137     HTMLElement *This = impl_from_IHTMLElement2(iface);
1138     FIXME("(%p)->(%s %p)\n", This, debugstr_w(where), text);
1139     return E_NOTIMPL;
1140 }
1141
1142 static HRESULT WINAPI HTMLElement2_replaceAdjecentText(IHTMLElement2 *iface, BSTR where,
1143                                                        BSTR newText, BSTR *oldText)
1144 {
1145     HTMLElement *This = impl_from_IHTMLElement2(iface);
1146     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(where), debugstr_w(newText), oldText);
1147     return E_NOTIMPL;
1148 }
1149
1150 static HRESULT WINAPI HTMLElement2_get_canHandleChildren(IHTMLElement2 *iface, VARIANT_BOOL *p)
1151 {
1152     HTMLElement *This = impl_from_IHTMLElement2(iface);
1153     FIXME("(%p)->(%p)\n", This, p);
1154     return E_NOTIMPL;
1155 }
1156
1157 static HRESULT WINAPI HTMLElement2_addBehavior(IHTMLElement2 *iface, BSTR bstrUrl,
1158                                                VARIANT *pvarFactory, LONG *pCookie)
1159 {
1160     HTMLElement *This = impl_from_IHTMLElement2(iface);
1161     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrUrl), pvarFactory, pCookie);
1162     return E_NOTIMPL;
1163 }
1164
1165 static HRESULT WINAPI HTMLElement2_removeBehavior(IHTMLElement2 *iface, LONG cookie,
1166                                                   VARIANT_BOOL *pfResult)
1167 {
1168     HTMLElement *This = impl_from_IHTMLElement2(iface);
1169     FIXME("(%p)->(%d %p)\n", This, cookie, pfResult);
1170     return E_NOTIMPL;
1171 }
1172
1173 static HRESULT WINAPI HTMLElement2_get_runtimeStyle(IHTMLElement2 *iface, IHTMLStyle **p)
1174 {
1175     HTMLElement *This = impl_from_IHTMLElement2(iface);
1176
1177     FIXME("(%p)->(%p): hack\n", This, p);
1178
1179     /* We can't implement correct behavior on top of Gecko (although we could
1180        try a bit harder). Making runtimeStyle behave like regular style is
1181        enough for most use cases. */
1182     if(!This->runtime_style) {
1183         HRESULT hres;
1184
1185         hres = HTMLStyle_Create(This, &This->runtime_style);
1186         if(FAILED(hres))
1187             return hres;
1188     }
1189
1190     *p = &This->runtime_style->IHTMLStyle_iface;
1191     IHTMLStyle_AddRef(*p);
1192     return S_OK;
1193 }
1194
1195 static HRESULT WINAPI HTMLElement2_get_behaviorUrns(IHTMLElement2 *iface, IDispatch **p)
1196 {
1197     HTMLElement *This = impl_from_IHTMLElement2(iface);
1198     FIXME("(%p)->(%p)\n", This, p);
1199     return E_NOTIMPL;
1200 }
1201
1202 static HRESULT WINAPI HTMLElement2_put_tagUrn(IHTMLElement2 *iface, BSTR v)
1203 {
1204     HTMLElement *This = impl_from_IHTMLElement2(iface);
1205     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1206     return E_NOTIMPL;
1207 }
1208
1209 static HRESULT WINAPI HTMLElement2_get_tagUrn(IHTMLElement2 *iface, BSTR *p)
1210 {
1211     HTMLElement *This = impl_from_IHTMLElement2(iface);
1212     FIXME("(%p)->(%p)\n", This, p);
1213     return E_NOTIMPL;
1214 }
1215
1216 static HRESULT WINAPI HTMLElement2_put_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT vv)
1217 {
1218     HTMLElement *This = impl_from_IHTMLElement2(iface);
1219     FIXME("(%p)->()\n", This);
1220     return E_NOTIMPL;
1221 }
1222
1223 static HRESULT WINAPI HTMLElement2_get_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT *p)
1224 {
1225     HTMLElement *This = impl_from_IHTMLElement2(iface);
1226     FIXME("(%p)->(%p)\n", This, p);
1227     return E_NOTIMPL;
1228 }
1229
1230 static HRESULT WINAPI HTMLElement2_get_readyStateValue(IHTMLElement2 *iface, LONG *p)
1231 {
1232     HTMLElement *This = impl_from_IHTMLElement2(iface);
1233     FIXME("(%p)->(%p)\n", This, p);
1234     return E_NOTIMPL;
1235 }
1236
1237 static HRESULT WINAPI HTMLElement2_getElementsByTagName(IHTMLElement2 *iface, BSTR v,
1238                                                        IHTMLElementCollection **pelColl)
1239 {
1240     HTMLElement *This = impl_from_IHTMLElement2(iface);
1241     nsIDOMNodeList *nslist;
1242     nsAString tag_str;
1243     nsresult nsres;
1244
1245     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl);
1246
1247     nsAString_InitDepend(&tag_str, v);
1248     nsres = nsIDOMHTMLElement_GetElementsByTagName(This->nselem, &tag_str, &nslist);
1249     nsAString_Finish(&tag_str);
1250     if(NS_FAILED(nsres)) {
1251         ERR("GetElementByTagName failed: %08x\n", nsres);
1252         return E_FAIL;
1253     }
1254
1255     *pelColl = create_collection_from_nodelist(This->node.doc, nslist);
1256     nsIDOMNodeList_Release(nslist);
1257     return S_OK;
1258 }
1259
1260 static const IHTMLElement2Vtbl HTMLElement2Vtbl = {
1261     HTMLElement2_QueryInterface,
1262     HTMLElement2_AddRef,
1263     HTMLElement2_Release,
1264     HTMLElement2_GetTypeInfoCount,
1265     HTMLElement2_GetTypeInfo,
1266     HTMLElement2_GetIDsOfNames,
1267     HTMLElement2_Invoke,
1268     HTMLElement2_get_scopeName,
1269     HTMLElement2_setCapture,
1270     HTMLElement2_releaseCapture,
1271     HTMLElement2_put_onlosecapture,
1272     HTMLElement2_get_onlosecapture,
1273     HTMLElement2_componentFromPoint,
1274     HTMLElement2_doScroll,
1275     HTMLElement2_put_onscroll,
1276     HTMLElement2_get_onscroll,
1277     HTMLElement2_put_ondrag,
1278     HTMLElement2_get_ondrag,
1279     HTMLElement2_put_ondragend,
1280     HTMLElement2_get_ondragend,
1281     HTMLElement2_put_ondragenter,
1282     HTMLElement2_get_ondragenter,
1283     HTMLElement2_put_ondragover,
1284     HTMLElement2_get_ondragover,
1285     HTMLElement2_put_ondragleave,
1286     HTMLElement2_get_ondragleave,
1287     HTMLElement2_put_ondrop,
1288     HTMLElement2_get_ondrop,
1289     HTMLElement2_put_onbeforecut,
1290     HTMLElement2_get_onbeforecut,
1291     HTMLElement2_put_oncut,
1292     HTMLElement2_get_oncut,
1293     HTMLElement2_put_onbeforecopy,
1294     HTMLElement2_get_onbeforecopy,
1295     HTMLElement2_put_oncopy,
1296     HTMLElement2_get_oncopy,
1297     HTMLElement2_put_onbeforepaste,
1298     HTMLElement2_get_onbeforepaste,
1299     HTMLElement2_put_onpaste,
1300     HTMLElement2_get_onpaste,
1301     HTMLElement2_get_currentStyle,
1302     HTMLElement2_put_onpropertychange,
1303     HTMLElement2_get_onpropertychange,
1304     HTMLElement2_getClientRects,
1305     HTMLElement2_getBoundingClientRect,
1306     HTMLElement2_setExpression,
1307     HTMLElement2_getExpression,
1308     HTMLElement2_removeExpression,
1309     HTMLElement2_put_tabIndex,
1310     HTMLElement2_get_tabIndex,
1311     HTMLElement2_focus,
1312     HTMLElement2_put_accessKey,
1313     HTMLElement2_get_accessKey,
1314     HTMLElement2_put_onblur,
1315     HTMLElement2_get_onblur,
1316     HTMLElement2_put_onfocus,
1317     HTMLElement2_get_onfocus,
1318     HTMLElement2_put_onresize,
1319     HTMLElement2_get_onresize,
1320     HTMLElement2_blur,
1321     HTMLElement2_addFilter,
1322     HTMLElement2_removeFilter,
1323     HTMLElement2_get_clientHeight,
1324     HTMLElement2_get_clientWidth,
1325     HTMLElement2_get_clientTop,
1326     HTMLElement2_get_clientLeft,
1327     HTMLElement2_attachEvent,
1328     HTMLElement2_detachEvent,
1329     HTMLElement2_get_readyState,
1330     HTMLElement2_put_onreadystatechange,
1331     HTMLElement2_get_onreadystatechange,
1332     HTMLElement2_put_onrowsdelete,
1333     HTMLElement2_get_onrowsdelete,
1334     HTMLElement2_put_onrowsinserted,
1335     HTMLElement2_get_onrowsinserted,
1336     HTMLElement2_put_oncellchange,
1337     HTMLElement2_get_oncellchange,
1338     HTMLElement2_put_dir,
1339     HTMLElement2_get_dir,
1340     HTMLElement2_createControlRange,
1341     HTMLElement2_get_scrollHeight,
1342     HTMLElement2_get_scrollWidth,
1343     HTMLElement2_put_scrollTop,
1344     HTMLElement2_get_scrollTop,
1345     HTMLElement2_put_scrollLeft,
1346     HTMLElement2_get_scrollLeft,
1347     HTMLElement2_clearAttributes,
1348     HTMLElement2_mergeAttributes,
1349     HTMLElement2_put_oncontextmenu,
1350     HTMLElement2_get_oncontextmenu,
1351     HTMLElement2_insertAdjecentElement,
1352     HTMLElement2_applyElement,
1353     HTMLElement2_getAdjecentText,
1354     HTMLElement2_replaceAdjecentText,
1355     HTMLElement2_get_canHandleChildren,
1356     HTMLElement2_addBehavior,
1357     HTMLElement2_removeBehavior,
1358     HTMLElement2_get_runtimeStyle,
1359     HTMLElement2_get_behaviorUrns,
1360     HTMLElement2_put_tagUrn,
1361     HTMLElement2_get_tagUrn,
1362     HTMLElement2_put_onbeforeeditfocus,
1363     HTMLElement2_get_onbeforeeditfocus,
1364     HTMLElement2_get_readyStateValue,
1365     HTMLElement2_getElementsByTagName,
1366 };
1367
1368 void HTMLElement2_Init(HTMLElement *This)
1369 {
1370     This->IHTMLElement2_iface.lpVtbl = &HTMLElement2Vtbl;
1371 }