dinput: Clamp lMagnitude to -10000..10000 range.
[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)->(%ld %ld %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     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
609     return E_NOTIMPL;
610 }
611
612 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
613 {
614     HTMLElement *This = HTMLELEM2_THIS(iface);
615     FIXME("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp);
616     return E_NOTIMPL;
617 }
618
619 static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p)
620 {
621     HTMLElement *This = HTMLELEM2_THIS(iface);
622     FIXME("(%p)->(%p)\n", This, p);
623     return E_NOTIMPL;
624 }
625
626 static HRESULT WINAPI HTMLElement2_put_onreadystatechange(IHTMLElement2 *iface, VARIANT v)
627 {
628     HTMLElement *This = HTMLELEM2_THIS(iface);
629     FIXME("(%p)->()\n", This);
630     return E_NOTIMPL;
631 }
632
633 static HRESULT WINAPI HTMLElement2_get_onreadystatechange(IHTMLElement2 *iface, VARIANT *p)
634 {
635     HTMLElement *This = HTMLELEM2_THIS(iface);
636     FIXME("(%p)->(%p)\n", This, p);
637     return E_NOTIMPL;
638 }
639
640 static HRESULT WINAPI HTMLElement2_put_onrowsdelete(IHTMLElement2 *iface, VARIANT v)
641 {
642     HTMLElement *This = HTMLELEM2_THIS(iface);
643     FIXME("(%p)->()\n", This);
644     return E_NOTIMPL;
645 }
646
647 static HRESULT WINAPI HTMLElement2_get_onrowsdelete(IHTMLElement2 *iface, VARIANT *p)
648 {
649     HTMLElement *This = HTMLELEM2_THIS(iface);
650     FIXME("(%p)->(%p)\n", This, p);
651     return E_NOTIMPL;
652 }
653
654 static HRESULT WINAPI HTMLElement2_put_onrowsinserted(IHTMLElement2 *iface, VARIANT v)
655 {
656     HTMLElement *This = HTMLELEM2_THIS(iface);
657     FIXME("(%p)->()\n", This);
658     return E_NOTIMPL;
659 }
660
661 static HRESULT WINAPI HTMLElement2_get_onrowsinserted(IHTMLElement2 *iface, VARIANT *p)
662 {
663     HTMLElement *This = HTMLELEM2_THIS(iface);
664     FIXME("(%p)->(%p)\n", This, p);
665     return E_NOTIMPL;
666 }
667
668 static HRESULT WINAPI HTMLElement2_put_oncellchange(IHTMLElement2 *iface, VARIANT v)
669 {
670     HTMLElement *This = HTMLELEM2_THIS(iface);
671     FIXME("(%p)->()\n", This);
672     return E_NOTIMPL;
673 }
674
675 static HRESULT WINAPI HTMLElement2_get_oncellchange(IHTMLElement2 *iface, VARIANT *p)
676 {
677     HTMLElement *This = HTMLELEM2_THIS(iface);
678     FIXME("(%p)->(%p)\n", This, p);
679     return E_NOTIMPL;
680 }
681
682 static HRESULT WINAPI HTMLElement2_put_dir(IHTMLElement2 *iface, BSTR v)
683 {
684     HTMLElement *This = HTMLELEM2_THIS(iface);
685     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
686     return E_NOTIMPL;
687 }
688
689 static HRESULT WINAPI HTMLElement2_get_dir(IHTMLElement2 *iface, BSTR *p)
690 {
691     HTMLElement *This = HTMLELEM2_THIS(iface);
692
693     TRACE("(%p)->(%p)\n", This, p);
694
695     *p = NULL;
696
697     if(This->nselem) {
698         nsAString dir_str;
699         nsresult nsres;
700
701         nsAString_Init(&dir_str, NULL);
702
703         nsres = nsIDOMHTMLElement_GetDir(This->nselem, &dir_str);
704         if(NS_SUCCEEDED(nsres)) {
705             const PRUnichar *dir;
706             nsAString_GetData(&dir_str, &dir);
707             if(*dir)
708                 *p = SysAllocString(dir);
709         }else {
710             ERR("GetDir failed: %08x\n", nsres);
711         }
712
713         nsAString_Finish(&dir_str);
714     }
715
716     TRACE("ret %s\n", debugstr_w(*p));
717     return S_OK;
718 }
719
720 static HRESULT WINAPI HTMLElement2_createControlRange(IHTMLElement2 *iface, IDispatch **range)
721 {
722     HTMLElement *This = HTMLELEM2_THIS(iface);
723     FIXME("(%p)->(%p)\n", This, range);
724     return E_NOTIMPL;
725 }
726
727 static HRESULT WINAPI HTMLElement2_get_scrollHeight(IHTMLElement2 *iface, long *p)
728 {
729     HTMLElement *This = HTMLELEM2_THIS(iface);
730     nsIDOMNSElement *nselem;
731     PRInt32 height = 0;
732     nsresult nsres;
733
734     TRACE("(%p)->(%p)\n", This, p);
735
736     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
737     if(NS_SUCCEEDED(nsres)) {
738         nsres = nsIDOMNSElement_GetScrollHeight(nselem, &height);
739         nsIDOMNSElement_Release(nselem);
740         if(NS_FAILED(nsres))
741             ERR("GetScrollHeight failed: %08x\n", nsres);
742     }else {
743         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
744     }
745
746     *p = height == -1 ? 0 : height;
747     TRACE("*p = %ld\n", *p);
748
749     return S_OK;
750 }
751
752 static HRESULT WINAPI HTMLElement2_get_scrollWidth(IHTMLElement2 *iface, long *p)
753 {
754     HTMLElement *This = HTMLELEM2_THIS(iface);
755     nsIDOMNSElement *nselem;
756     PRInt32 width = 0;
757     nsresult nsres;
758
759     TRACE("(%p)->(%p)\n", This, p);
760
761     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
762     if(NS_SUCCEEDED(nsres)) {
763         nsres = nsIDOMNSElement_GetScrollWidth(nselem, &width);
764         nsIDOMNSElement_Release(nselem);
765         if(NS_FAILED(nsres))
766             ERR("GetScrollWidth failed: %08x\n", nsres);
767     }else {
768         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
769     }
770
771     *p = width;
772     TRACE("*p = %ld\n", *p);
773
774     return S_OK;
775 }
776
777 static HRESULT WINAPI HTMLElement2_put_scrollTop(IHTMLElement2 *iface, long v)
778 {
779     HTMLElement *This = HTMLELEM2_THIS(iface);
780     nsIDOMNSElement *nselem;
781     nsresult nsres;
782
783     TRACE("(%p)->(%ld)\n", This, v);
784
785     if(!This->nselem) {
786         FIXME("NULL nselem\n");
787         return E_NOTIMPL;
788     }
789
790     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
791     if(NS_SUCCEEDED(nsres)) {
792         nsIDOMNSElement_SetScrollTop(nselem, v);
793         nsIDOMNSElement_Release(nselem);
794     }else {
795         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
796     }
797
798     return S_OK;
799 }
800
801 static HRESULT WINAPI HTMLElement2_get_scrollTop(IHTMLElement2 *iface, long *p)
802 {
803     HTMLElement *This = HTMLELEM2_THIS(iface);
804     nsIDOMNSElement *nselem;
805     PRInt32 top = 0;
806     nsresult nsres;
807
808     TRACE("(%p)->(%p)\n", This, p);
809
810     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
811     if(NS_SUCCEEDED(nsres)) {
812         nsres = nsIDOMNSElement_GetScrollTop(nselem, &top);
813         nsIDOMNSElement_Release(nselem);
814         if(NS_FAILED(nsres))
815             ERR("GetScrollTop failed: %08x\n", nsres);
816     }else {
817         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
818     }
819
820     *p = top;
821     TRACE("*p = %ld\n", *p);
822
823     return S_OK;
824 }
825
826 static HRESULT WINAPI HTMLElement2_put_scrollLeft(IHTMLElement2 *iface, long v)
827 {
828     HTMLElement *This = HTMLELEM2_THIS(iface);
829     nsIDOMNSElement *nselem;
830     nsresult nsres;
831
832     TRACE("(%p)->(%ld)\n", This, v);
833
834     if(!This->nselem) {
835         FIXME("NULL nselem\n");
836         return E_NOTIMPL;
837     }
838
839     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
840     if(NS_SUCCEEDED(nsres)) {
841         nsIDOMNSElement_SetScrollLeft(nselem, v);
842         nsIDOMNSElement_Release(nselem);
843     }else {
844         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
845     }
846
847     return S_OK;
848 }
849
850 static HRESULT WINAPI HTMLElement2_get_scrollLeft(IHTMLElement2 *iface, long *p)
851 {
852     HTMLElement *This = HTMLELEM2_THIS(iface);
853     nsIDOMNSElement *nselem;
854     PRInt32 left = 0;
855     nsresult nsres;
856
857     TRACE("(%p)->(%p)\n", This, p);
858
859     if(!p)
860         return E_INVALIDARG;
861
862     if(!This->nselem)
863     {
864         FIXME("NULL nselem\n");
865         return E_NOTIMPL;
866     }
867
868     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
869     if(NS_SUCCEEDED(nsres))
870     {
871         nsres = nsIDOMNSElement_GetScrollLeft(nselem, &left);
872         nsIDOMNSElement_Release(nselem);
873         if(NS_FAILED(nsres))
874             left = 0;
875     }
876
877     *p = left;
878     TRACE("*p = %ld\n", *p);
879
880     return S_OK;
881 }
882
883 static HRESULT WINAPI HTMLElement2_clearAttributes(IHTMLElement2 *iface)
884 {
885     HTMLElement *This = HTMLELEM2_THIS(iface);
886     FIXME("(%p)\n", This);
887     return E_NOTIMPL;
888 }
889
890 static HRESULT WINAPI HTMLElement2_mergeAttributes(IHTMLElement2 *iface, IHTMLElement *mergeThis)
891 {
892     HTMLElement *This = HTMLELEM2_THIS(iface);
893     FIXME("(%p)->(%p)\n", This, mergeThis);
894     return E_NOTIMPL;
895 }
896
897 static HRESULT WINAPI HTMLElement2_put_oncontextmenu(IHTMLElement2 *iface, VARIANT v)
898 {
899     HTMLElement *This = HTMLELEM2_THIS(iface);
900     FIXME("(%p)->()\n", This);
901     return E_NOTIMPL;
902 }
903
904 static HRESULT WINAPI HTMLElement2_get_oncontextmenu(IHTMLElement2 *iface, VARIANT *p)
905 {
906     HTMLElement *This = HTMLELEM2_THIS(iface);
907     FIXME("(%p)->(%p)\n", This, p);
908     return E_NOTIMPL;
909 }
910
911 static HRESULT WINAPI HTMLElement2_insertAdjecentElement(IHTMLElement2 *iface, BSTR where,
912         IHTMLElement *insertedElement, IHTMLElement **inserted)
913 {
914     HTMLElement *This = HTMLELEM2_THIS(iface);
915     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(where), insertedElement, inserted);
916     return E_NOTIMPL;
917 }
918
919 static HRESULT WINAPI HTMLElement2_applyElement(IHTMLElement2 *iface, IHTMLElement *apply,
920                                                 BSTR where, IHTMLElement **applied)
921 {
922     HTMLElement *This = HTMLELEM2_THIS(iface);
923     FIXME("(%p)->(%p %s %p)\n", This, apply, debugstr_w(where), applied);
924     return E_NOTIMPL;
925 }
926
927 static HRESULT WINAPI HTMLElement2_getAdjecentText(IHTMLElement2 *iface, BSTR where, BSTR *text)
928 {
929     HTMLElement *This = HTMLELEM2_THIS(iface);
930     FIXME("(%p)->(%s %p)\n", This, debugstr_w(where), text);
931     return E_NOTIMPL;
932 }
933
934 static HRESULT WINAPI HTMLElement2_replaceAdjecentText(IHTMLElement2 *iface, BSTR where,
935                                                        BSTR newText, BSTR *oldText)
936 {
937     HTMLElement *This = HTMLELEM2_THIS(iface);
938     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(where), debugstr_w(newText), oldText);
939     return E_NOTIMPL;
940 }
941
942 static HRESULT WINAPI HTMLElement2_get_canHandleChildren(IHTMLElement2 *iface, VARIANT_BOOL *p)
943 {
944     HTMLElement *This = HTMLELEM2_THIS(iface);
945     FIXME("(%p)->(%p)\n", This, p);
946     return E_NOTIMPL;
947 }
948
949 static HRESULT WINAPI HTMLElement2_addBehavior(IHTMLElement2 *iface, BSTR bstrUrl,
950                                                VARIANT *pvarFactory, long *pCookie)
951 {
952     HTMLElement *This = HTMLELEM2_THIS(iface);
953     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrUrl), pvarFactory, pCookie);
954     return E_NOTIMPL;
955 }
956
957 static HRESULT WINAPI HTMLElement2_removeBehavior(IHTMLElement2 *iface, long cookie,
958                                                   VARIANT_BOOL *pfResult)
959 {
960     HTMLElement *This = HTMLELEM2_THIS(iface);
961     FIXME("(%p)->(%ld %p)\n", This, cookie, pfResult);
962     return E_NOTIMPL;
963 }
964
965 static HRESULT WINAPI HTMLElement2_get_runtimeStyle(IHTMLElement2 *iface, IHTMLStyle **p)
966 {
967     HTMLElement *This = HTMLELEM2_THIS(iface);
968     FIXME("(%p)->(%p)\n", This, p);
969     return E_NOTIMPL;
970 }
971
972 static HRESULT WINAPI HTMLElement2_get_behaviorUrns(IHTMLElement2 *iface, IDispatch **p)
973 {
974     HTMLElement *This = HTMLELEM2_THIS(iface);
975     FIXME("(%p)->(%p)\n", This, p);
976     return E_NOTIMPL;
977 }
978
979 static HRESULT WINAPI HTMLElement2_put_tagUrn(IHTMLElement2 *iface, BSTR v)
980 {
981     HTMLElement *This = HTMLELEM2_THIS(iface);
982     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
983     return E_NOTIMPL;
984 }
985
986 static HRESULT WINAPI HTMLElement2_get_tagUrn(IHTMLElement2 *iface, BSTR *p)
987 {
988     HTMLElement *This = HTMLELEM2_THIS(iface);
989     FIXME("(%p)->(%p)\n", This, p);
990     return E_NOTIMPL;
991 }
992
993 static HRESULT WINAPI HTMLElement2_put_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT vv)
994 {
995     HTMLElement *This = HTMLELEM2_THIS(iface);
996     FIXME("(%p)->()\n", This);
997     return E_NOTIMPL;
998 }
999
1000 static HRESULT WINAPI HTMLElement2_get_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT *p)
1001 {
1002     HTMLElement *This = HTMLELEM2_THIS(iface);
1003     FIXME("(%p)->(%p)\n", This, p);
1004     return E_NOTIMPL;
1005 }
1006
1007 static HRESULT WINAPI HTMLElement2_get_readyStateValue(IHTMLElement2 *iface, long *p)
1008 {
1009     HTMLElement *This = HTMLELEM2_THIS(iface);
1010     FIXME("(%p)->(%p)\n", This, p);
1011     return E_NOTIMPL;
1012 }
1013
1014 static HRESULT WINAPI HTMLElement2_getElementsByTagName(IHTMLElement2 *iface, BSTR v,
1015                                                        IHTMLElementCollection **pelColl)
1016 {
1017     HTMLElement *This = HTMLELEM2_THIS(iface);
1018     nsIDOMNodeList *nslist;
1019     nsAString tag_str;
1020     nsresult nsres;
1021
1022     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl);
1023
1024     nsAString_Init(&tag_str, v);
1025     nsres = nsIDOMHTMLElement_GetElementsByTagName(This->nselem, &tag_str, &nslist);
1026     nsAString_Finish(&tag_str);
1027     if(NS_FAILED(nsres)) {
1028         ERR("GetElementByTagName failed: %08x\n", nsres);
1029         return E_FAIL;
1030     }
1031
1032     *pelColl = create_collection_from_nodelist(This->node.doc, (IUnknown*)HTMLELEM(This), nslist);
1033     nsIDOMNodeList_Release(nslist);
1034     return S_OK;
1035 }
1036
1037 #undef HTMLELEM2_THIS
1038
1039 static const IHTMLElement2Vtbl HTMLElement2Vtbl = {
1040     HTMLElement2_QueryInterface,
1041     HTMLElement2_AddRef,
1042     HTMLElement2_Release,
1043     HTMLElement2_GetTypeInfoCount,
1044     HTMLElement2_GetTypeInfo,
1045     HTMLElement2_GetIDsOfNames,
1046     HTMLElement2_Invoke,
1047     HTMLElement2_get_scopeName,
1048     HTMLElement2_setCapture,
1049     HTMLElement2_releaseCapture,
1050     HTMLElement2_put_onlosecapture,
1051     HTMLElement2_get_onlosecapture,
1052     HTMLElement2_componentFromPoint,
1053     HTMLElement2_doScroll,
1054     HTMLElement2_put_onscroll,
1055     HTMLElement2_get_onscroll,
1056     HTMLElement2_put_ondrag,
1057     HTMLElement2_get_ondrag,
1058     HTMLElement2_put_ondragend,
1059     HTMLElement2_get_ondragend,
1060     HTMLElement2_put_ondragenter,
1061     HTMLElement2_get_ondragenter,
1062     HTMLElement2_put_ondragover,
1063     HTMLElement2_get_ondragover,
1064     HTMLElement2_put_ondragleave,
1065     HTMLElement2_get_ondragleave,
1066     HTMLElement2_put_ondrop,
1067     HTMLElement2_get_ondrop,
1068     HTMLElement2_put_onbeforecut,
1069     HTMLElement2_get_onbeforecut,
1070     HTMLElement2_put_oncut,
1071     HTMLElement2_get_oncut,
1072     HTMLElement2_put_onbeforecopy,
1073     HTMLElement2_get_onbeforecopy,
1074     HTMLElement2_put_oncopy,
1075     HTMLElement2_get_oncopy,
1076     HTMLElement2_put_onbeforepaste,
1077     HTMLElement2_get_onbeforepaste,
1078     HTMLElement2_put_onpaste,
1079     HTMLElement2_get_onpaste,
1080     HTMLElement2_get_currentStyle,
1081     HTMLElement2_put_onpropertychange,
1082     HTMLElement2_get_onpropertychange,
1083     HTMLElement2_getClientRects,
1084     HTMLElement2_getBoundingClientRect,
1085     HTMLElement2_setExpression,
1086     HTMLElement2_getExpression,
1087     HTMLElement2_removeExpression,
1088     HTMLElement2_put_tabIndex,
1089     HTMLElement2_get_tabIndex,
1090     HTMLElement2_focus,
1091     HTMLElement2_put_accessKey,
1092     HTMLElement2_get_accessKey,
1093     HTMLElement2_put_onblur,
1094     HTMLElement2_get_onblur,
1095     HTMLElement2_put_onfocus,
1096     HTMLElement2_get_onfocus,
1097     HTMLElement2_put_onresize,
1098     HTMLElement2_get_onresize,
1099     HTMLElement2_blur,
1100     HTMLElement2_addFilter,
1101     HTMLElement2_removeFilter,
1102     HTMLElement2_get_clientHeight,
1103     HTMLElement2_get_clientWidth,
1104     HTMLElement2_get_clientTop,
1105     HTMLElement2_get_clientLeft,
1106     HTMLElement2_attachEvent,
1107     HTMLElement2_detachEvent,
1108     HTMLElement2_get_readyState,
1109     HTMLElement2_put_onreadystatechange,
1110     HTMLElement2_get_onreadystatechange,
1111     HTMLElement2_put_onrowsdelete,
1112     HTMLElement2_get_onrowsdelete,
1113     HTMLElement2_put_onrowsinserted,
1114     HTMLElement2_get_onrowsinserted,
1115     HTMLElement2_put_oncellchange,
1116     HTMLElement2_get_oncellchange,
1117     HTMLElement2_put_dir,
1118     HTMLElement2_get_dir,
1119     HTMLElement2_createControlRange,
1120     HTMLElement2_get_scrollHeight,
1121     HTMLElement2_get_scrollWidth,
1122     HTMLElement2_put_scrollTop,
1123     HTMLElement2_get_scrollTop,
1124     HTMLElement2_put_scrollLeft,
1125     HTMLElement2_get_scrollLeft,
1126     HTMLElement2_clearAttributes,
1127     HTMLElement2_mergeAttributes,
1128     HTMLElement2_put_oncontextmenu,
1129     HTMLElement2_get_oncontextmenu,
1130     HTMLElement2_insertAdjecentElement,
1131     HTMLElement2_applyElement,
1132     HTMLElement2_getAdjecentText,
1133     HTMLElement2_replaceAdjecentText,
1134     HTMLElement2_get_canHandleChildren,
1135     HTMLElement2_addBehavior,
1136     HTMLElement2_removeBehavior,
1137     HTMLElement2_get_runtimeStyle,
1138     HTMLElement2_get_behaviorUrns,
1139     HTMLElement2_put_tagUrn,
1140     HTMLElement2_get_tagUrn,
1141     HTMLElement2_put_onbeforeeditfocus,
1142     HTMLElement2_get_onbeforeeditfocus,
1143     HTMLElement2_get_readyStateValue,
1144     HTMLElement2_getElementsByTagName,
1145 };
1146
1147 void HTMLElement2_Init(HTMLElement *This)
1148 {
1149     This->lpHTMLElement2Vtbl = &HTMLElement2Vtbl;
1150 }