vbscript: Better representation of statement context.
[wine] / dlls / mshtml / htmlinput.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 #include <assert.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28
29 #include "wine/debug.h"
30
31 #include "mshtml_private.h"
32 #include "htmlevent.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35
36 typedef struct {
37     HTMLElement element;
38
39     IHTMLInputElement IHTMLInputElement_iface;
40     IHTMLInputTextElement IHTMLInputTextElement_iface;
41
42     nsIDOMHTMLInputElement *nsinput;
43 } HTMLInputElement;
44
45 static inline HTMLInputElement *impl_from_IHTMLInputElement(IHTMLInputElement *iface)
46 {
47     return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputElement_iface);
48 }
49
50 static inline HTMLInputElement *impl_from_IHTMLInputTextElement(IHTMLInputTextElement *iface)
51 {
52     return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputTextElement_iface);
53 }
54
55 static HRESULT WINAPI HTMLInputElement_QueryInterface(IHTMLInputElement *iface,
56                                                          REFIID riid, void **ppv)
57 {
58     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
59
60     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
61 }
62
63 static ULONG WINAPI HTMLInputElement_AddRef(IHTMLInputElement *iface)
64 {
65     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
66
67     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
68 }
69
70 static ULONG WINAPI HTMLInputElement_Release(IHTMLInputElement *iface)
71 {
72     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
73
74     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
75 }
76
77 static HRESULT WINAPI HTMLInputElement_GetTypeInfoCount(IHTMLInputElement *iface, UINT *pctinfo)
78 {
79     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
80
81     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
82 }
83
84 static HRESULT WINAPI HTMLInputElement_GetTypeInfo(IHTMLInputElement *iface, UINT iTInfo,
85                                               LCID lcid, ITypeInfo **ppTInfo)
86 {
87     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
88
89     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
90             ppTInfo);
91 }
92
93 static HRESULT WINAPI HTMLInputElement_GetIDsOfNames(IHTMLInputElement *iface, REFIID riid,
94                                                 LPOLESTR *rgszNames, UINT cNames,
95                                                 LCID lcid, DISPID *rgDispId)
96 {
97     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
98
99     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
100             cNames, lcid, rgDispId);
101 }
102
103 static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID dispIdMember,
104                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
105                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
106 {
107     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
108
109     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
110             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
111 }
112
113 static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v)
114 {
115     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
116     nsAString type_str;
117     nsresult nsres;
118
119     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
120
121     /*
122      * FIXME:
123      * On IE setting type works only on dynamically created elements before adding them to DOM tree.
124      */
125     nsAString_InitDepend(&type_str, v);
126     nsres = nsIDOMHTMLInputElement_SetType(This->nsinput, &type_str);
127     nsAString_Finish(&type_str);
128     if(NS_FAILED(nsres)) {
129         ERR("SetType failed: %08x\n", nsres);
130         return E_FAIL;
131     }
132
133     return S_OK;
134 }
135
136 static HRESULT WINAPI HTMLInputElement_get_type(IHTMLInputElement *iface, BSTR *p)
137 {
138     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
139     nsAString type_str;
140     nsresult nsres;
141
142     TRACE("(%p)->(%p)\n", This, p);
143
144     nsAString_Init(&type_str, NULL);
145     nsres = nsIDOMHTMLInputElement_GetType(This->nsinput, &type_str);
146     return return_nsstr(nsres, &type_str, p);
147 }
148
149 static HRESULT WINAPI HTMLInputElement_put_value(IHTMLInputElement *iface, BSTR v)
150 {
151     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
152     nsAString val_str;
153     nsresult nsres;
154
155     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
156
157     nsAString_InitDepend(&val_str, v);
158     nsres = nsIDOMHTMLInputElement_SetValue(This->nsinput, &val_str);
159     nsAString_Finish(&val_str);
160     if(NS_FAILED(nsres))
161         ERR("SetValue failed: %08x\n", nsres);
162
163     return S_OK;
164 }
165
166 static HRESULT WINAPI HTMLInputElement_get_value(IHTMLInputElement *iface, BSTR *p)
167 {
168     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
169     nsAString value_str;
170     nsresult nsres;
171
172     TRACE("(%p)->(%p)\n", This, p);
173
174     nsAString_Init(&value_str, NULL);
175     nsres = nsIDOMHTMLInputElement_GetValue(This->nsinput, &value_str);
176     return return_nsstr(nsres, &value_str, p);
177 }
178
179 static HRESULT WINAPI HTMLInputElement_put_name(IHTMLInputElement *iface, BSTR v)
180 {
181     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
182     nsAString name_str;
183     nsresult nsres;
184
185     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
186
187     nsAString_InitDepend(&name_str, v);
188     nsres = nsIDOMHTMLInputElement_SetName(This->nsinput, &name_str);
189     nsAString_Finish(&name_str);
190     if(NS_FAILED(nsres)) {
191         ERR("SetName failed: %08x\n", nsres);
192         return E_FAIL;
193     }
194
195     return S_OK;
196 }
197
198 static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *p)
199 {
200     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
201     nsAString name_str;
202     nsresult nsres;
203
204     TRACE("(%p)->(%p)\n", This, p);
205
206     nsAString_Init(&name_str, NULL);
207     nsres = nsIDOMHTMLInputElement_GetName(This->nsinput, &name_str);
208     return return_nsstr(nsres, &name_str, p);
209 }
210
211 static HRESULT WINAPI HTMLInputElement_put_status(IHTMLInputElement *iface, VARIANT_BOOL v)
212 {
213     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
214     FIXME("(%p)->(%x)\n", This, v);
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI HTMLInputElement_get_status(IHTMLInputElement *iface, VARIANT_BOOL *p)
219 {
220     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
221     FIXME("(%p)->(%p)\n", This, p);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI HTMLInputElement_put_disabled(IHTMLInputElement *iface, VARIANT_BOOL v)
226 {
227     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
228     nsresult nsres;
229
230     TRACE("(%p)->(%x)\n", This, v);
231
232     nsres = nsIDOMHTMLInputElement_SetDisabled(This->nsinput, v != VARIANT_FALSE);
233     if(NS_FAILED(nsres))
234         ERR("SetDisabled failed: %08x\n", nsres);
235
236     return S_OK;
237 }
238
239 static HRESULT WINAPI HTMLInputElement_get_disabled(IHTMLInputElement *iface, VARIANT_BOOL *p)
240 {
241     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
242     cpp_bool disabled = FALSE;
243
244     TRACE("(%p)->(%p)\n", This, p);
245
246     nsIDOMHTMLInputElement_GetDisabled(This->nsinput, &disabled);
247
248     *p = disabled ? VARIANT_TRUE : VARIANT_FALSE;
249     return S_OK;
250 }
251
252 static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLFormElement **p)
253 {
254     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
255     FIXME("(%p)->(%p)\n", This, p);
256     return E_NOTIMPL;
257 }
258
259 static HRESULT WINAPI HTMLInputElement_put_size(IHTMLInputElement *iface, LONG v)
260 {
261     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
262     FIXME("(%p)->(%d)\n", This, v);
263     return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI HTMLInputElement_get_size(IHTMLInputElement *iface, LONG *p)
267 {
268     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
269     FIXME("(%p)->(%p)\n", This, p);
270     return E_NOTIMPL;
271 }
272
273 static HRESULT WINAPI HTMLInputElement_put_maxLength(IHTMLInputElement *iface, LONG v)
274 {
275     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
276     FIXME("(%p)->(%d)\n", This, v);
277     return E_NOTIMPL;
278 }
279
280 static HRESULT WINAPI HTMLInputElement_get_maxLength(IHTMLInputElement *iface, LONG *p)
281 {
282     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
283     FIXME("(%p)->(%p)\n", This, p);
284     return E_NOTIMPL;
285 }
286
287 static HRESULT WINAPI HTMLInputElement_select(IHTMLInputElement *iface)
288 {
289     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
290     nsresult nsres;
291
292     TRACE("(%p)\n", This);
293
294     nsres = nsIDOMHTMLInputElement_Select(This->nsinput);
295     if(NS_FAILED(nsres)) {
296         ERR("Select failed: %08x\n", nsres);
297         return E_FAIL;
298     }
299
300     return S_OK;
301 }
302
303 static HRESULT WINAPI HTMLInputElement_put_onchange(IHTMLInputElement *iface, VARIANT v)
304 {
305     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
306     FIXME("(%p)->()\n", This);
307     return E_NOTIMPL;
308 }
309
310 static HRESULT WINAPI HTMLInputElement_get_onchange(IHTMLInputElement *iface, VARIANT *p)
311 {
312     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
313     FIXME("(%p)->(%p)\n", This, p);
314     return E_NOTIMPL;
315 }
316
317 static HRESULT WINAPI HTMLInputElement_put_onselect(IHTMLInputElement *iface, VARIANT v)
318 {
319     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
320     FIXME("(%p)->()\n", This);
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI HTMLInputElement_get_onselect(IHTMLInputElement *iface, VARIANT *p)
325 {
326     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
327     FIXME("(%p)->(%p)\n", This, p);
328     return E_NOTIMPL;
329 }
330
331 static HRESULT WINAPI HTMLInputElement_put_defaultValue(IHTMLInputElement *iface, BSTR v)
332 {
333     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
334     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI HTMLInputElement_get_defaultValue(IHTMLInputElement *iface, BSTR *p)
339 {
340     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
341     FIXME("(%p)->(%p)\n", This, p);
342     return E_NOTIMPL;
343 }
344
345 static HRESULT WINAPI HTMLInputElement_put_readOnly(IHTMLInputElement *iface, VARIANT_BOOL v)
346 {
347     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
348     FIXME("(%p)->(%x)\n", This, v);
349     return E_NOTIMPL;
350 }
351
352 static HRESULT WINAPI HTMLInputElement_get_readOnly(IHTMLInputElement *iface, VARIANT_BOOL *p)
353 {
354     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
355     FIXME("(%p)->(%p)\n", This, p);
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI HTMLInputElement_createTextRange(IHTMLInputElement *iface, IHTMLTxtRange **range)
360 {
361     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
362     FIXME("(%p)->(%p)\n", This, range);
363     return E_NOTIMPL;
364 }
365
366 static HRESULT WINAPI HTMLInputElement_put_indeterminate(IHTMLInputElement *iface, VARIANT_BOOL v)
367 {
368     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
369     FIXME("(%p)->(%x)\n", This, v);
370     return E_NOTIMPL;
371 }
372
373 static HRESULT WINAPI HTMLInputElement_get_indeterminate(IHTMLInputElement *iface, VARIANT_BOOL *p)
374 {
375     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
376     FIXME("(%p)->(%p)\n", This, p);
377     return E_NOTIMPL;
378 }
379
380 static HRESULT WINAPI HTMLInputElement_put_defaultChecked(IHTMLInputElement *iface, VARIANT_BOOL v)
381 {
382     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
383     nsresult nsres;
384
385     TRACE("(%p)->(%x)\n", This, v);
386
387     nsres = nsIDOMHTMLInputElement_SetDefaultChecked(This->nsinput, v != VARIANT_FALSE);
388     if(NS_FAILED(nsres)) {
389         ERR("SetDefaultChecked failed: %08x\n", nsres);
390         return E_FAIL;
391     }
392
393     return S_OK;
394 }
395
396 static HRESULT WINAPI HTMLInputElement_get_defaultChecked(IHTMLInputElement *iface, VARIANT_BOOL *p)
397 {
398     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
399     cpp_bool default_checked = FALSE;
400     nsresult nsres;
401
402     TRACE("(%p)->(%p)\n", This, p);
403
404     nsres = nsIDOMHTMLInputElement_GetDefaultChecked(This->nsinput, &default_checked);
405     if(NS_FAILED(nsres)) {
406         ERR("GetDefaultChecked failed: %08x\n", nsres);
407         return E_FAIL;
408     }
409
410     *p = default_checked ? VARIANT_TRUE : VARIANT_FALSE;
411     return S_OK;
412 }
413
414 static HRESULT WINAPI HTMLInputElement_put_checked(IHTMLInputElement *iface, VARIANT_BOOL v)
415 {
416     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
417     nsresult nsres;
418
419     TRACE("(%p)->(%x)\n", This, v);
420
421     nsres = nsIDOMHTMLInputElement_SetChecked(This->nsinput, v != VARIANT_FALSE);
422     if(NS_FAILED(nsres)) {
423         ERR("SetChecked failed: %08x\n", nsres);
424         return E_FAIL;
425     }
426
427     return S_OK;
428 }
429
430 static HRESULT WINAPI HTMLInputElement_get_checked(IHTMLInputElement *iface, VARIANT_BOOL *p)
431 {
432     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
433     cpp_bool checked;
434     nsresult nsres;
435
436     TRACE("(%p)->(%p)\n", This, p);
437
438     nsres = nsIDOMHTMLInputElement_GetChecked(This->nsinput, &checked);
439     if(NS_FAILED(nsres)) {
440         ERR("GetChecked failed: %08x\n", nsres);
441         return E_FAIL;
442     }
443
444     *p = checked ? VARIANT_TRUE : VARIANT_FALSE;
445     TRACE("checked=%x\n", *p);
446     return S_OK;
447 }
448
449 static HRESULT WINAPI HTMLInputElement_put_border(IHTMLInputElement *iface, VARIANT v)
450 {
451     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
452     FIXME("(%p)->()\n", This);
453     return E_NOTIMPL;
454 }
455
456 static HRESULT WINAPI HTMLInputElement_get_border(IHTMLInputElement *iface, VARIANT *p)
457 {
458     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
459     FIXME("(%p)->(%p)\n", This, p);
460     return E_NOTIMPL;
461 }
462
463 static HRESULT WINAPI HTMLInputElement_put_vspace(IHTMLInputElement *iface, LONG v)
464 {
465     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
466     FIXME("(%p)->(%d)\n", This, v);
467     return E_NOTIMPL;
468 }
469
470 static HRESULT WINAPI HTMLInputElement_get_vspace(IHTMLInputElement *iface, LONG *p)
471 {
472     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
473     FIXME("(%p)->(%p)\n", This, p);
474     return E_NOTIMPL;
475 }
476
477 static HRESULT WINAPI HTMLInputElement_put_hspace(IHTMLInputElement *iface, LONG v)
478 {
479     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
480     FIXME("(%p)->(%d)\n", This, v);
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI HTMLInputElement_get_hspace(IHTMLInputElement *iface, LONG *p)
485 {
486     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
487     FIXME("(%p)->(%p)\n", This, p);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI HTMLInputElement_put_alt(IHTMLInputElement *iface, BSTR v)
492 {
493     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
494     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
495     return E_NOTIMPL;
496 }
497
498 static HRESULT WINAPI HTMLInputElement_get_alt(IHTMLInputElement *iface, BSTR *p)
499 {
500     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
501     FIXME("(%p)->(%p)\n", This, p);
502     return E_NOTIMPL;
503 }
504
505 static HRESULT WINAPI HTMLInputElement_put_src(IHTMLInputElement *iface, BSTR v)
506 {
507     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
508     nsAString nsstr;
509     nsresult nsres;
510
511     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
512
513     nsAString_InitDepend(&nsstr, v);
514     nsres = nsIDOMHTMLInputElement_SetSrc(This->nsinput, &nsstr);
515     nsAString_Finish(&nsstr);
516     if(NS_FAILED(nsres))
517         ERR("SetSrc failed: %08x\n", nsres);
518
519     return S_OK;
520 }
521
522 static HRESULT WINAPI HTMLInputElement_get_src(IHTMLInputElement *iface, BSTR *p)
523 {
524     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
525     const PRUnichar *src;
526     nsAString src_str;
527     nsresult nsres;
528     HRESULT hres;
529
530     TRACE("(%p)->(%p)\n", This, p);
531
532     nsAString_Init(&src_str, NULL);
533     nsres = nsIDOMHTMLInputElement_GetSrc(This->nsinput, &src_str);
534     if(NS_FAILED(nsres)) {
535         ERR("GetSrc failed: %08x\n", nsres);
536         return E_FAIL;
537     }
538
539     nsAString_GetData(&src_str, &src);
540     hres = nsuri_to_url(src, FALSE, p);
541     nsAString_Finish(&src_str);
542
543     return hres;
544 }
545
546 static HRESULT WINAPI HTMLInputElement_put_lowsrc(IHTMLInputElement *iface, BSTR v)
547 {
548     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
549     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI HTMLInputElement_get_lowsrc(IHTMLInputElement *iface, BSTR *p)
554 {
555     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
556     FIXME("(%p)->(%p)\n", This, p);
557     return E_NOTIMPL;
558 }
559
560 static HRESULT WINAPI HTMLInputElement_put_vrml(IHTMLInputElement *iface, BSTR v)
561 {
562     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
563     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
564     return E_NOTIMPL;
565 }
566
567 static HRESULT WINAPI HTMLInputElement_get_vrml(IHTMLInputElement *iface, BSTR *p)
568 {
569     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
570     FIXME("(%p)->(%p)\n", This, p);
571     return E_NOTIMPL;
572 }
573
574 static HRESULT WINAPI HTMLInputElement_put_dynsrc(IHTMLInputElement *iface, BSTR v)
575 {
576     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
577     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
578     return E_NOTIMPL;
579 }
580
581 static HRESULT WINAPI HTMLInputElement_get_dynsrc(IHTMLInputElement *iface, BSTR *p)
582 {
583     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
584     FIXME("(%p)->(%p)\n", This, p);
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI HTMLInputElement_get_readyState(IHTMLInputElement *iface, BSTR *p)
589 {
590     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
591     FIXME("(%p)->(%p)\n", This, p);
592     return E_NOTIMPL;
593 }
594
595 static HRESULT WINAPI HTMLInputElement_get_complete(IHTMLInputElement *iface, VARIANT_BOOL *p)
596 {
597     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
598     FIXME("(%p)->(%p)\n", This, p);
599     return E_NOTIMPL;
600 }
601
602 static HRESULT WINAPI HTMLInputElement_put_loop(IHTMLInputElement *iface, VARIANT v)
603 {
604     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
605     FIXME("(%p)->()\n", This);
606     return E_NOTIMPL;
607 }
608
609 static HRESULT WINAPI HTMLInputElement_get_loop(IHTMLInputElement *iface, VARIANT *p)
610 {
611     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
612     FIXME("(%p)->(%p)\n", This, p);
613     return E_NOTIMPL;
614 }
615
616 static HRESULT WINAPI HTMLInputElement_put_align(IHTMLInputElement *iface, BSTR v)
617 {
618     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
619     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
620     return E_NOTIMPL;
621 }
622
623 static HRESULT WINAPI HTMLInputElement_get_align(IHTMLInputElement *iface, BSTR *p)
624 {
625     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
626     FIXME("(%p)->(%p)\n", This, p);
627     return E_NOTIMPL;
628 }
629
630 static HRESULT WINAPI HTMLInputElement_put_onload(IHTMLInputElement *iface, VARIANT v)
631 {
632     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
633     FIXME("(%p)->()\n", This);
634     return E_NOTIMPL;
635 }
636
637 static HRESULT WINAPI HTMLInputElement_get_onload(IHTMLInputElement *iface, VARIANT *p)
638 {
639     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
640     FIXME("(%p)->(%p)\n", This, p);
641     return E_NOTIMPL;
642 }
643
644 static HRESULT WINAPI HTMLInputElement_put_onerror(IHTMLInputElement *iface, VARIANT v)
645 {
646     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
647     FIXME("(%p)->()\n", This);
648     return E_NOTIMPL;
649 }
650
651 static HRESULT WINAPI HTMLInputElement_get_onerror(IHTMLInputElement *iface, VARIANT *p)
652 {
653     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
654     FIXME("(%p)->(%p)\n", This, p);
655     return E_NOTIMPL;
656 }
657
658 static HRESULT WINAPI HTMLInputElement_put_onabort(IHTMLInputElement *iface, VARIANT v)
659 {
660     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
661     FIXME("(%p)->()\n", This);
662     return E_NOTIMPL;
663 }
664
665 static HRESULT WINAPI HTMLInputElement_get_onabort(IHTMLInputElement *iface, VARIANT *p)
666 {
667     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
668     FIXME("(%p)->(%p)\n", This, p);
669     return E_NOTIMPL;
670 }
671
672 static HRESULT WINAPI HTMLInputElement_put_width(IHTMLInputElement *iface, LONG v)
673 {
674     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
675     FIXME("(%p)->(%d)\n", This, v);
676     return E_NOTIMPL;
677 }
678
679 static HRESULT WINAPI HTMLInputElement_get_width(IHTMLInputElement *iface, LONG *p)
680 {
681     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
682     FIXME("(%p)->(%p)\n", This, p);
683     return E_NOTIMPL;
684 }
685
686 static HRESULT WINAPI HTMLInputElement_put_height(IHTMLInputElement *iface, LONG v)
687 {
688     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
689     FIXME("(%p)->(%d)\n", This, v);
690     return E_NOTIMPL;
691 }
692
693 static HRESULT WINAPI HTMLInputElement_get_height(IHTMLInputElement *iface, LONG *p)
694 {
695     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
696     FIXME("(%p)->(%p)\n", This, p);
697     return E_NOTIMPL;
698 }
699
700 static HRESULT WINAPI HTMLInputElement_put_start(IHTMLInputElement *iface, BSTR v)
701 {
702     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
703     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
704     return E_NOTIMPL;
705 }
706
707 static HRESULT WINAPI HTMLInputElement_get_start(IHTMLInputElement *iface, BSTR *p)
708 {
709     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
710     FIXME("(%p)->(%p)\n", This, p);
711     return E_NOTIMPL;
712 }
713
714 static const IHTMLInputElementVtbl HTMLInputElementVtbl = {
715     HTMLInputElement_QueryInterface,
716     HTMLInputElement_AddRef,
717     HTMLInputElement_Release,
718     HTMLInputElement_GetTypeInfoCount,
719     HTMLInputElement_GetTypeInfo,
720     HTMLInputElement_GetIDsOfNames,
721     HTMLInputElement_Invoke,
722     HTMLInputElement_put_type,
723     HTMLInputElement_get_type,
724     HTMLInputElement_put_value,
725     HTMLInputElement_get_value,
726     HTMLInputElement_put_name,
727     HTMLInputElement_get_name,
728     HTMLInputElement_put_status,
729     HTMLInputElement_get_status,
730     HTMLInputElement_put_disabled,
731     HTMLInputElement_get_disabled,
732     HTMLInputElement_get_form,
733     HTMLInputElement_put_size,
734     HTMLInputElement_get_size,
735     HTMLInputElement_put_maxLength,
736     HTMLInputElement_get_maxLength,
737     HTMLInputElement_select,
738     HTMLInputElement_put_onchange,
739     HTMLInputElement_get_onchange,
740     HTMLInputElement_put_onselect,
741     HTMLInputElement_get_onselect,
742     HTMLInputElement_put_defaultValue,
743     HTMLInputElement_get_defaultValue,
744     HTMLInputElement_put_readOnly,
745     HTMLInputElement_get_readOnly,
746     HTMLInputElement_createTextRange,
747     HTMLInputElement_put_indeterminate,
748     HTMLInputElement_get_indeterminate,
749     HTMLInputElement_put_defaultChecked,
750     HTMLInputElement_get_defaultChecked,
751     HTMLInputElement_put_checked,
752     HTMLInputElement_get_checked,
753     HTMLInputElement_put_border,
754     HTMLInputElement_get_border,
755     HTMLInputElement_put_vspace,
756     HTMLInputElement_get_vspace,
757     HTMLInputElement_put_hspace,
758     HTMLInputElement_get_hspace,
759     HTMLInputElement_put_alt,
760     HTMLInputElement_get_alt,
761     HTMLInputElement_put_src,
762     HTMLInputElement_get_src,
763     HTMLInputElement_put_lowsrc,
764     HTMLInputElement_get_lowsrc,
765     HTMLInputElement_put_vrml,
766     HTMLInputElement_get_vrml,
767     HTMLInputElement_put_dynsrc,
768     HTMLInputElement_get_dynsrc,
769     HTMLInputElement_get_readyState,
770     HTMLInputElement_get_complete,
771     HTMLInputElement_put_loop,
772     HTMLInputElement_get_loop,
773     HTMLInputElement_put_align,
774     HTMLInputElement_get_align,
775     HTMLInputElement_put_onload,
776     HTMLInputElement_get_onload,
777     HTMLInputElement_put_onerror,
778     HTMLInputElement_get_onerror,
779     HTMLInputElement_put_onabort,
780     HTMLInputElement_get_onabort,
781     HTMLInputElement_put_width,
782     HTMLInputElement_get_width,
783     HTMLInputElement_put_height,
784     HTMLInputElement_get_height,
785     HTMLInputElement_put_start,
786     HTMLInputElement_get_start
787 };
788
789 static HRESULT WINAPI HTMLInputTextElement_QueryInterface(IHTMLInputTextElement *iface,
790         REFIID riid, void **ppv)
791 {
792     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
793
794     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
795 }
796
797 static ULONG WINAPI HTMLInputTextElement_AddRef(IHTMLInputTextElement *iface)
798 {
799     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
800
801     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
802 }
803
804 static ULONG WINAPI HTMLInputTextElement_Release(IHTMLInputTextElement *iface)
805 {
806     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
807
808     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
809 }
810
811 static HRESULT WINAPI HTMLInputTextElement_GetTypeInfoCount(IHTMLInputTextElement *iface, UINT *pctinfo)
812 {
813     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
814     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
815 }
816
817 static HRESULT WINAPI HTMLInputTextElement_GetTypeInfo(IHTMLInputTextElement *iface, UINT iTInfo,
818         LCID lcid, ITypeInfo **ppTInfo)
819 {
820     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
821     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
822             ppTInfo);
823 }
824
825 static HRESULT WINAPI HTMLInputTextElement_GetIDsOfNames(IHTMLInputTextElement *iface, REFIID riid,
826         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
827 {
828     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
829     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
830             cNames, lcid, rgDispId);
831 }
832
833 static HRESULT WINAPI HTMLInputTextElement_Invoke(IHTMLInputTextElement *iface, DISPID dispIdMember,
834                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
835                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
836 {
837     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
838     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
839             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
840 }
841
842 static HRESULT WINAPI HTMLInputTextElement_get_type(IHTMLInputTextElement *iface, BSTR *p)
843 {
844     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
845
846     TRACE("(%p)->(%p)\n", This, p);
847
848     return IHTMLInputElement_get_type(&This->IHTMLInputElement_iface, p);
849 }
850
851 static HRESULT WINAPI HTMLInputTextElement_put_value(IHTMLInputTextElement *iface, BSTR v)
852 {
853     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
854
855     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
856
857     return IHTMLInputElement_put_value(&This->IHTMLInputElement_iface, v);
858 }
859
860 static HRESULT WINAPI HTMLInputTextElement_get_value(IHTMLInputTextElement *iface, BSTR *p)
861 {
862     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
863
864     TRACE("(%p)->(%p)\n", This, p);
865
866     return IHTMLInputElement_get_value(&This->IHTMLInputElement_iface, p);
867 }
868
869 static HRESULT WINAPI HTMLInputTextElement_put_name(IHTMLInputTextElement *iface, BSTR v)
870 {
871     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
872
873     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
874
875     return IHTMLInputElement_put_name(&This->IHTMLInputElement_iface, v);
876 }
877
878 static HRESULT WINAPI HTMLInputTextElement_get_name(IHTMLInputTextElement *iface, BSTR *p)
879 {
880     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
881
882     TRACE("(%p)->(%p)\n", This, p);
883
884     return IHTMLInputElement_get_name(&This->IHTMLInputElement_iface, p);
885 }
886
887 static HRESULT WINAPI HTMLInputTextElement_put_status(IHTMLInputTextElement *iface, VARIANT v)
888 {
889     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
890     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
891     return E_NOTIMPL;
892 }
893
894 static HRESULT WINAPI HTMLInputTextElement_get_status(IHTMLInputTextElement *iface, VARIANT *p)
895 {
896     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
897     TRACE("(%p)->(%p)\n", This, p);
898     return E_NOTIMPL;
899 }
900
901 static HRESULT WINAPI HTMLInputTextElement_put_disabled(IHTMLInputTextElement *iface, VARIANT_BOOL v)
902 {
903     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
904
905     TRACE("(%p)->(%x)\n", This, v);
906
907     return IHTMLInputElement_put_disabled(&This->IHTMLInputElement_iface, v);
908 }
909
910 static HRESULT WINAPI HTMLInputTextElement_get_disabled(IHTMLInputTextElement *iface, VARIANT_BOOL *p)
911 {
912     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
913
914     TRACE("(%p)->(%p)\n", This, p);
915
916     return IHTMLInputElement_get_disabled(&This->IHTMLInputElement_iface, p);
917 }
918
919 static HRESULT WINAPI HTMLInputTextElement_get_form(IHTMLInputTextElement *iface, IHTMLFormElement **p)
920 {
921     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
922
923     TRACE("(%p)->(%p)\n", This, p);
924
925     return IHTMLInputElement_get_form(&This->IHTMLInputElement_iface, p);
926 }
927
928 static HRESULT WINAPI HTMLInputTextElement_put_defaultValue(IHTMLInputTextElement *iface, BSTR v)
929 {
930     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
931
932     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
933
934     return IHTMLInputElement_put_defaultValue(&This->IHTMLInputElement_iface, v);
935 }
936
937 static HRESULT WINAPI HTMLInputTextElement_get_defaultValue(IHTMLInputTextElement *iface, BSTR *p)
938 {
939     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
940
941     TRACE("(%p)->(%p)\n", This, p);
942
943     return IHTMLInputElement_get_defaultValue(&This->IHTMLInputElement_iface, p);
944 }
945
946 static HRESULT WINAPI HTMLInputTextElement_put_size(IHTMLInputTextElement *iface, LONG v)
947 {
948     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
949
950     TRACE("(%p)->(%d)\n", This, v);
951
952     return IHTMLInputElement_put_size(&This->IHTMLInputElement_iface, v);
953 }
954
955 static HRESULT WINAPI HTMLInputTextElement_get_size(IHTMLInputTextElement *iface, LONG *p)
956 {
957     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
958
959     TRACE("(%p)->(%p)\n", This, p);
960
961     return IHTMLInputElement_get_size(&This->IHTMLInputElement_iface, p);
962 }
963
964 static HRESULT WINAPI HTMLInputTextElement_put_maxLength(IHTMLInputTextElement *iface, LONG v)
965 {
966     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
967
968     TRACE("(%p)->(%d)\n", This, v);
969
970     return IHTMLInputElement_put_maxLength(&This->IHTMLInputElement_iface, v);
971 }
972
973 static HRESULT WINAPI HTMLInputTextElement_get_maxLength(IHTMLInputTextElement *iface, LONG *p)
974 {
975     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
976
977     TRACE("(%p)->(%p)\n", This, p);
978
979     return IHTMLInputElement_get_maxLength(&This->IHTMLInputElement_iface, p);
980 }
981
982 static HRESULT WINAPI HTMLInputTextElement_select(IHTMLInputTextElement *iface)
983 {
984     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
985
986     TRACE("(%p)\n", This);
987
988     return IHTMLInputElement_select(&This->IHTMLInputElement_iface);
989 }
990
991 static HRESULT WINAPI HTMLInputTextElement_put_onchange(IHTMLInputTextElement *iface, VARIANT v)
992 {
993     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
994
995     TRACE("(%p)->()\n", This);
996
997     return IHTMLInputElement_put_onchange(&This->IHTMLInputElement_iface, v);
998 }
999
1000 static HRESULT WINAPI HTMLInputTextElement_get_onchange(IHTMLInputTextElement *iface, VARIANT *p)
1001 {
1002     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1003
1004     TRACE("(%p)->(%p)\n", This, p);
1005
1006     return IHTMLInputElement_get_onchange(&This->IHTMLInputElement_iface, p);
1007 }
1008
1009 static HRESULT WINAPI HTMLInputTextElement_put_onselect(IHTMLInputTextElement *iface, VARIANT v)
1010 {
1011     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1012
1013     TRACE("(%p)->()\n", This);
1014
1015     return IHTMLInputElement_put_onselect(&This->IHTMLInputElement_iface, v);
1016 }
1017
1018 static HRESULT WINAPI HTMLInputTextElement_get_onselect(IHTMLInputTextElement *iface, VARIANT *p)
1019 {
1020     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1021
1022     TRACE("(%p)->(%p)\n", This, p);
1023
1024     return IHTMLInputElement_get_onselect(&This->IHTMLInputElement_iface, p);
1025 }
1026
1027 static HRESULT WINAPI HTMLInputTextElement_put_readOnly(IHTMLInputTextElement *iface, VARIANT_BOOL v)
1028 {
1029     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1030
1031     TRACE("(%p)->(%x)\n", This, v);
1032
1033     return IHTMLInputElement_put_readOnly(&This->IHTMLInputElement_iface, v);
1034 }
1035
1036 static HRESULT WINAPI HTMLInputTextElement_get_readOnly(IHTMLInputTextElement *iface, VARIANT_BOOL *p)
1037 {
1038     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1039
1040     TRACE("(%p)->(%p)\n", This, p);
1041
1042     return IHTMLInputElement_get_readOnly(&This->IHTMLInputElement_iface, p);
1043 }
1044
1045 static HRESULT WINAPI HTMLInputTextElement_createTextRange(IHTMLInputTextElement *iface, IHTMLTxtRange **range)
1046 {
1047     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1048
1049     TRACE("(%p)->(%p)\n", This, range);
1050
1051     return IHTMLInputElement_createTextRange(&This->IHTMLInputElement_iface, range);
1052 }
1053
1054 static const IHTMLInputTextElementVtbl HTMLInputTextElementVtbl = {
1055     HTMLInputTextElement_QueryInterface,
1056     HTMLInputTextElement_AddRef,
1057     HTMLInputTextElement_Release,
1058     HTMLInputTextElement_GetTypeInfoCount,
1059     HTMLInputTextElement_GetTypeInfo,
1060     HTMLInputTextElement_GetIDsOfNames,
1061     HTMLInputTextElement_Invoke,
1062     HTMLInputTextElement_get_type,
1063     HTMLInputTextElement_put_value,
1064     HTMLInputTextElement_get_value,
1065     HTMLInputTextElement_put_name,
1066     HTMLInputTextElement_get_name,
1067     HTMLInputTextElement_put_status,
1068     HTMLInputTextElement_get_status,
1069     HTMLInputTextElement_put_disabled,
1070     HTMLInputTextElement_get_disabled,
1071     HTMLInputTextElement_get_form,
1072     HTMLInputTextElement_put_defaultValue,
1073     HTMLInputTextElement_get_defaultValue,
1074     HTMLInputTextElement_put_size,
1075     HTMLInputTextElement_get_size,
1076     HTMLInputTextElement_put_maxLength,
1077     HTMLInputTextElement_get_maxLength,
1078     HTMLInputTextElement_select,
1079     HTMLInputTextElement_put_onchange,
1080     HTMLInputTextElement_get_onchange,
1081     HTMLInputTextElement_put_onselect,
1082     HTMLInputTextElement_get_onselect,
1083     HTMLInputTextElement_put_readOnly,
1084     HTMLInputTextElement_get_readOnly,
1085     HTMLInputTextElement_createTextRange
1086 };
1087
1088 static inline HTMLInputElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
1089 {
1090     return CONTAINING_RECORD(iface, HTMLInputElement, element.node);
1091 }
1092
1093 static HRESULT HTMLInputElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1094 {
1095     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1096
1097     *ppv = NULL;
1098
1099     if(IsEqualGUID(&IID_IUnknown, riid)) {
1100         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1101         *ppv = &This->IHTMLInputElement_iface;
1102     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
1103         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
1104         *ppv = &This->IHTMLInputElement_iface;
1105     }else if(IsEqualGUID(&IID_IHTMLInputElement, riid)) {
1106         TRACE("(%p)->(IID_IHTMLInputElement %p)\n", This, ppv);
1107         *ppv = &This->IHTMLInputElement_iface;
1108     }else if(IsEqualGUID(&IID_IHTMLInputTextElement, riid)) {
1109         TRACE("(%p)->(IID_IHTMLInputTextElement %p)\n", This, ppv);
1110         *ppv = &This->IHTMLInputTextElement_iface;
1111     }
1112
1113     if(*ppv) {
1114         IUnknown_AddRef((IUnknown*)*ppv);
1115         return S_OK;
1116     }
1117
1118     return HTMLElement_QI(&This->element.node, riid, ppv);
1119 }
1120
1121 static HRESULT HTMLInputElementImpl_fire_event(HTMLDOMNode *iface, eventid_t eid, BOOL *handled)
1122 {
1123     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1124
1125     if(eid == EVENTID_CLICK) {
1126         nsresult nsres;
1127
1128         *handled = TRUE;
1129
1130         nsres = nsIDOMHTMLInputElement_Click(This->nsinput);
1131         if(NS_FAILED(nsres)) {
1132             ERR("Click failed: %08x\n", nsres);
1133             return E_FAIL;
1134         }
1135     }
1136
1137     return S_OK;
1138 }
1139
1140 static HRESULT HTMLInputElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
1141 {
1142     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1143     return IHTMLInputElement_put_disabled(&This->IHTMLInputElement_iface, v);
1144 }
1145
1146 static HRESULT HTMLInputElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
1147 {
1148     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1149     return IHTMLInputElement_get_disabled(&This->IHTMLInputElement_iface, p);
1150 }
1151
1152 static const NodeImplVtbl HTMLInputElementImplVtbl = {
1153     HTMLInputElement_QI,
1154     HTMLElement_destructor,
1155     HTMLElement_clone,
1156     HTMLElement_get_attr_col,
1157     NULL,
1158     HTMLInputElementImpl_fire_event,
1159     NULL,
1160     HTMLInputElementImpl_put_disabled,
1161     HTMLInputElementImpl_get_disabled,
1162 };
1163
1164 static const tid_t HTMLInputElement_iface_tids[] = {
1165     HTMLELEMENT_TIDS,
1166     IHTMLInputElement_tid,
1167     0
1168 };
1169 static dispex_static_data_t HTMLInputElement_dispex = {
1170     NULL,
1171     DispHTMLInputElement_tid,
1172     NULL,
1173     HTMLInputElement_iface_tids
1174 };
1175
1176 HRESULT HTMLInputElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
1177 {
1178     HTMLInputElement *ret;
1179     nsresult nsres;
1180
1181     ret = heap_alloc_zero(sizeof(HTMLInputElement));
1182     if(!ret)
1183         return E_OUTOFMEMORY;
1184
1185     ret->IHTMLInputElement_iface.lpVtbl = &HTMLInputElementVtbl;
1186     ret->IHTMLInputTextElement_iface.lpVtbl = &HTMLInputTextElementVtbl;
1187     ret->element.node.vtbl = &HTMLInputElementImplVtbl;
1188
1189     HTMLElement_Init(&ret->element, doc, nselem, &HTMLInputElement_dispex);
1190
1191     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLInputElement, (void**)&ret->nsinput);
1192
1193     /* Share nsinput reference with nsnode */
1194     assert(nsres == NS_OK && (nsIDOMNode*)ret->nsinput == ret->element.node.nsnode);
1195     nsIDOMNode_Release(ret->element.node.nsnode);
1196
1197     *elem = &ret->element;
1198     return S_OK;
1199 }