xref: /reactos/dll/win32/mshtml/htmlinput.c (revision f4d29a74)
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 "mshtml_private.h"
20 
21 #include <limits.h>
22 
23 typedef struct {
24     HTMLElement element;
25 
26     IHTMLInputElement IHTMLInputElement_iface;
27     IHTMLInputTextElement IHTMLInputTextElement_iface;
28 
29     nsIDOMHTMLInputElement *nsinput;
30 } HTMLInputElement;
31 
32 static const WCHAR forW[] = {'f','o','r',0};
33 
34 static inline HTMLInputElement *impl_from_IHTMLInputElement(IHTMLInputElement *iface)
35 {
36     return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputElement_iface);
37 }
38 
39 static inline HTMLInputElement *impl_from_IHTMLInputTextElement(IHTMLInputTextElement *iface)
40 {
41     return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputTextElement_iface);
42 }
43 
44 static HRESULT WINAPI HTMLInputElement_QueryInterface(IHTMLInputElement *iface,
45                                                          REFIID riid, void **ppv)
46 {
47     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
48 
49     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
50 }
51 
52 static ULONG WINAPI HTMLInputElement_AddRef(IHTMLInputElement *iface)
53 {
54     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
55 
56     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
57 }
58 
59 static ULONG WINAPI HTMLInputElement_Release(IHTMLInputElement *iface)
60 {
61     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
62 
63     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
64 }
65 
66 static HRESULT WINAPI HTMLInputElement_GetTypeInfoCount(IHTMLInputElement *iface, UINT *pctinfo)
67 {
68     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
69 
70     return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
71 }
72 
73 static HRESULT WINAPI HTMLInputElement_GetTypeInfo(IHTMLInputElement *iface, UINT iTInfo,
74                                               LCID lcid, ITypeInfo **ppTInfo)
75 {
76     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
77 
78     return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
79             ppTInfo);
80 }
81 
82 static HRESULT WINAPI HTMLInputElement_GetIDsOfNames(IHTMLInputElement *iface, REFIID riid,
83                                                 LPOLESTR *rgszNames, UINT cNames,
84                                                 LCID lcid, DISPID *rgDispId)
85 {
86     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
87 
88     return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
89             cNames, lcid, rgDispId);
90 }
91 
92 static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID dispIdMember,
93                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
94                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
95 {
96     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
97 
98     return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
99             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
100 }
101 
102 static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v)
103 {
104     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
105     nsAString type_str;
106     nsresult nsres;
107 
108     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
109 
110     /*
111      * FIXME:
112      * On IE setting type works only on dynamically created elements before adding them to DOM tree.
113      */
114     nsAString_InitDepend(&type_str, v);
115     nsres = nsIDOMHTMLInputElement_SetType(This->nsinput, &type_str);
116     nsAString_Finish(&type_str);
117     if(NS_FAILED(nsres)) {
118         ERR("SetType failed: %08x\n", nsres);
119         return E_FAIL;
120     }
121 
122     return S_OK;
123 }
124 
125 static HRESULT WINAPI HTMLInputElement_get_type(IHTMLInputElement *iface, BSTR *p)
126 {
127     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
128     nsAString type_str;
129     nsresult nsres;
130 
131     TRACE("(%p)->(%p)\n", This, p);
132 
133     nsAString_Init(&type_str, NULL);
134     nsres = nsIDOMHTMLInputElement_GetType(This->nsinput, &type_str);
135     return return_nsstr(nsres, &type_str, p);
136 }
137 
138 static HRESULT WINAPI HTMLInputElement_put_value(IHTMLInputElement *iface, BSTR v)
139 {
140     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
141     nsAString val_str;
142     nsresult nsres;
143 
144     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
145 
146     nsAString_InitDepend(&val_str, v);
147     nsres = nsIDOMHTMLInputElement_SetValue(This->nsinput, &val_str);
148     nsAString_Finish(&val_str);
149     if(NS_FAILED(nsres))
150         ERR("SetValue failed: %08x\n", nsres);
151 
152     return S_OK;
153 }
154 
155 static HRESULT WINAPI HTMLInputElement_get_value(IHTMLInputElement *iface, BSTR *p)
156 {
157     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
158     nsAString value_str;
159     nsresult nsres;
160 
161     TRACE("(%p)->(%p)\n", This, p);
162 
163     nsAString_Init(&value_str, NULL);
164     nsres = nsIDOMHTMLInputElement_GetValue(This->nsinput, &value_str);
165     return return_nsstr(nsres, &value_str, p);
166 }
167 
168 static HRESULT WINAPI HTMLInputElement_put_name(IHTMLInputElement *iface, BSTR v)
169 {
170     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
171     nsAString name_str;
172     nsresult nsres;
173 
174     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
175 
176     nsAString_InitDepend(&name_str, v);
177     nsres = nsIDOMHTMLInputElement_SetName(This->nsinput, &name_str);
178     nsAString_Finish(&name_str);
179     if(NS_FAILED(nsres)) {
180         ERR("SetName failed: %08x\n", nsres);
181         return E_FAIL;
182     }
183 
184     return S_OK;
185 }
186 
187 static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *p)
188 {
189     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
190     nsAString name_str;
191     nsresult nsres;
192 
193     TRACE("(%p)->(%p)\n", This, p);
194 
195     nsAString_Init(&name_str, NULL);
196     nsres = nsIDOMHTMLInputElement_GetName(This->nsinput, &name_str);
197     return return_nsstr(nsres, &name_str, p);
198 }
199 
200 static HRESULT WINAPI HTMLInputElement_put_status(IHTMLInputElement *iface, VARIANT_BOOL v)
201 {
202     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
203     FIXME("(%p)->(%x)\n", This, v);
204     return E_NOTIMPL;
205 }
206 
207 static HRESULT WINAPI HTMLInputElement_get_status(IHTMLInputElement *iface, VARIANT_BOOL *p)
208 {
209     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
210     FIXME("(%p)->(%p)\n", This, p);
211     return E_NOTIMPL;
212 }
213 
214 static HRESULT WINAPI HTMLInputElement_put_disabled(IHTMLInputElement *iface, VARIANT_BOOL v)
215 {
216     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
217     nsresult nsres;
218 
219     TRACE("(%p)->(%x)\n", This, v);
220 
221     nsres = nsIDOMHTMLInputElement_SetDisabled(This->nsinput, v != VARIANT_FALSE);
222     if(NS_FAILED(nsres))
223         ERR("SetDisabled failed: %08x\n", nsres);
224 
225     return S_OK;
226 }
227 
228 static HRESULT WINAPI HTMLInputElement_get_disabled(IHTMLInputElement *iface, VARIANT_BOOL *p)
229 {
230     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
231     cpp_bool disabled = FALSE;
232 
233     TRACE("(%p)->(%p)\n", This, p);
234 
235     nsIDOMHTMLInputElement_GetDisabled(This->nsinput, &disabled);
236 
237     *p = disabled ? VARIANT_TRUE : VARIANT_FALSE;
238     return S_OK;
239 }
240 
241 static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLFormElement **p)
242 {
243     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
244     nsIDOMHTMLFormElement *nsform;
245     nsIDOMNode *form_node;
246     HTMLDOMNode *node;
247     HRESULT hres;
248     nsresult nsres;
249 
250     TRACE("(%p)->(%p)\n", This, p);
251 
252     nsres = nsIDOMHTMLInputElement_GetForm(This->nsinput, &nsform);
253     if (NS_FAILED(nsres) || nsform == NULL) {
254         ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform);
255         *p = NULL;
256         return E_FAIL;
257     }
258 
259     nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&form_node);
260     nsIDOMHTMLFormElement_Release(nsform);
261     assert(nsres == NS_OK);
262 
263     hres = get_node(This->element.node.doc, form_node, TRUE, &node);
264     nsIDOMNode_Release(form_node);
265     if (FAILED(hres))
266         return hres;
267 
268     hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p);
269 
270     node_release(node);
271     return hres;
272 }
273 
274 static HRESULT WINAPI HTMLInputElement_put_size(IHTMLInputElement *iface, LONG v)
275 {
276     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
277     UINT32 val = v;
278     nsresult nsres;
279 
280     TRACE("(%p)->(%d)\n", This, v);
281     if (v <= 0)
282         return CTL_E_INVALIDPROPERTYVALUE;
283 
284     nsres = nsIDOMHTMLInputElement_SetSize(This->nsinput, val);
285     if (NS_FAILED(nsres)) {
286         ERR("Set Size(%u) failed: %08x\n", val, nsres);
287         return E_FAIL;
288     }
289     return S_OK;
290 }
291 
292 static HRESULT WINAPI HTMLInputElement_get_size(IHTMLInputElement *iface, LONG *p)
293 {
294     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
295     UINT32 val;
296     nsresult nsres;
297 
298     TRACE("(%p)->(%p)\n", This, p);
299     if (p == NULL)
300         return E_INVALIDARG;
301 
302     nsres = nsIDOMHTMLInputElement_GetSize(This->nsinput, &val);
303     if (NS_FAILED(nsres)) {
304         ERR("Get Size failed: %08x\n", nsres);
305         return E_FAIL;
306     }
307     *p = val;
308     return S_OK;
309 }
310 
311 static HRESULT WINAPI HTMLInputElement_put_maxLength(IHTMLInputElement *iface, LONG v)
312 {
313     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
314     nsresult nsres;
315 
316     TRACE("(%p)->(%d)\n", This, v);
317 
318     nsres = nsIDOMHTMLInputElement_SetMaxLength(This->nsinput, v);
319     if(NS_FAILED(nsres)) {
320         /* FIXME: Gecko throws an error on negative values, while MSHTML should accept them */
321         FIXME("SetMaxLength failed\n");
322         return E_FAIL;
323     }
324 
325     return S_OK;
326 }
327 
328 static HRESULT WINAPI HTMLInputElement_get_maxLength(IHTMLInputElement *iface, LONG *p)
329 {
330     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
331     LONG max_length;
332     nsresult nsres;
333 
334     TRACE("(%p)->(%p)\n", This, p);
335 
336     nsres = nsIDOMHTMLInputElement_GetMaxLength(This->nsinput, &max_length);
337     assert(nsres == NS_OK);
338 
339     /* Gecko reports -1 as default value, while MSHTML uses INT_MAX */
340     *p = max_length == -1 ? INT_MAX : max_length;
341     return S_OK;
342 }
343 
344 static HRESULT WINAPI HTMLInputElement_select(IHTMLInputElement *iface)
345 {
346     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
347     nsresult nsres;
348 
349     TRACE("(%p)\n", This);
350 
351     nsres = nsIDOMHTMLInputElement_Select(This->nsinput);
352     if(NS_FAILED(nsres)) {
353         ERR("Select failed: %08x\n", nsres);
354         return E_FAIL;
355     }
356 
357     return S_OK;
358 }
359 
360 static HRESULT WINAPI HTMLInputElement_put_onchange(IHTMLInputElement *iface, VARIANT v)
361 {
362     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
363 
364     TRACE("(%p)->()\n", This);
365 
366     return set_node_event(&This->element.node, EVENTID_CHANGE, &v);
367 }
368 
369 static HRESULT WINAPI HTMLInputElement_get_onchange(IHTMLInputElement *iface, VARIANT *p)
370 {
371     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
372 
373     TRACE("(%p)->(%p)\n", This, p);
374 
375     return get_node_event(&This->element.node, EVENTID_CHANGE, p);
376 }
377 
378 static HRESULT WINAPI HTMLInputElement_put_onselect(IHTMLInputElement *iface, VARIANT v)
379 {
380     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
381     FIXME("(%p)->()\n", This);
382     return E_NOTIMPL;
383 }
384 
385 static HRESULT WINAPI HTMLInputElement_get_onselect(IHTMLInputElement *iface, VARIANT *p)
386 {
387     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
388     FIXME("(%p)->(%p)\n", This, p);
389     return E_NOTIMPL;
390 }
391 
392 static HRESULT WINAPI HTMLInputElement_put_defaultValue(IHTMLInputElement *iface, BSTR v)
393 {
394     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
395     nsAString nsstr;
396     nsresult nsres;
397 
398     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
399 
400     nsAString_InitDepend(&nsstr, v);
401     nsres = nsIDOMHTMLInputElement_SetDefaultValue(This->nsinput, &nsstr);
402     nsAString_Finish(&nsstr);
403     if(NS_FAILED(nsres)) {
404         ERR("SetValue failed: %08x\n", nsres);
405         return E_FAIL;
406     }
407 
408     return S_OK;
409 }
410 
411 static HRESULT WINAPI HTMLInputElement_get_defaultValue(IHTMLInputElement *iface, BSTR *p)
412 {
413     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
414     nsAString nsstr;
415     nsresult nsres;
416 
417     TRACE("(%p)->(%p)\n", This, p);
418 
419     nsAString_Init(&nsstr, NULL);
420     nsres = nsIDOMHTMLInputElement_GetDefaultValue(This->nsinput, &nsstr);
421     return return_nsstr(nsres, &nsstr, p);
422 }
423 
424 static HRESULT WINAPI HTMLInputElement_put_readOnly(IHTMLInputElement *iface, VARIANT_BOOL v)
425 {
426     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
427     nsresult nsres;
428 
429     TRACE("(%p)->(%x)\n", This, v);
430 
431     nsres = nsIDOMHTMLInputElement_SetReadOnly(This->nsinput, v != VARIANT_FALSE);
432     if (NS_FAILED(nsres)) {
433         ERR("Set ReadOnly Failed: %08x\n", nsres);
434         return E_FAIL;
435     }
436     return S_OK;
437 }
438 
439 static HRESULT WINAPI HTMLInputElement_get_readOnly(IHTMLInputElement *iface, VARIANT_BOOL *p)
440 {
441     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
442     nsresult nsres;
443     cpp_bool b;
444 
445     TRACE("(%p)->(%p)\n", This, p);
446 
447     nsres = nsIDOMHTMLInputElement_GetReadOnly(This->nsinput, &b);
448     if (NS_FAILED(nsres)) {
449         ERR("Get ReadOnly Failed: %08x\n", nsres);
450         return E_FAIL;
451     }
452     *p = b ? VARIANT_TRUE : VARIANT_FALSE;
453     return S_OK;
454 }
455 
456 static HRESULT WINAPI HTMLInputElement_createTextRange(IHTMLInputElement *iface, IHTMLTxtRange **range)
457 {
458     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
459     FIXME("(%p)->(%p)\n", This, range);
460     return E_NOTIMPL;
461 }
462 
463 static HRESULT WINAPI HTMLInputElement_put_indeterminate(IHTMLInputElement *iface, VARIANT_BOOL v)
464 {
465     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
466     FIXME("(%p)->(%x)\n", This, v);
467     return E_NOTIMPL;
468 }
469 
470 static HRESULT WINAPI HTMLInputElement_get_indeterminate(IHTMLInputElement *iface, VARIANT_BOOL *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_defaultChecked(IHTMLInputElement *iface, VARIANT_BOOL v)
478 {
479     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
480     nsresult nsres;
481 
482     TRACE("(%p)->(%x)\n", This, v);
483 
484     nsres = nsIDOMHTMLInputElement_SetDefaultChecked(This->nsinput, v != VARIANT_FALSE);
485     if(NS_FAILED(nsres)) {
486         ERR("SetDefaultChecked failed: %08x\n", nsres);
487         return E_FAIL;
488     }
489 
490     return S_OK;
491 }
492 
493 static HRESULT WINAPI HTMLInputElement_get_defaultChecked(IHTMLInputElement *iface, VARIANT_BOOL *p)
494 {
495     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
496     cpp_bool default_checked = FALSE;
497     nsresult nsres;
498 
499     TRACE("(%p)->(%p)\n", This, p);
500 
501     nsres = nsIDOMHTMLInputElement_GetDefaultChecked(This->nsinput, &default_checked);
502     if(NS_FAILED(nsres)) {
503         ERR("GetDefaultChecked failed: %08x\n", nsres);
504         return E_FAIL;
505     }
506 
507     *p = default_checked ? VARIANT_TRUE : VARIANT_FALSE;
508     return S_OK;
509 }
510 
511 static HRESULT WINAPI HTMLInputElement_put_checked(IHTMLInputElement *iface, VARIANT_BOOL v)
512 {
513     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
514     nsresult nsres;
515 
516     TRACE("(%p)->(%x)\n", This, v);
517 
518     nsres = nsIDOMHTMLInputElement_SetChecked(This->nsinput, v != VARIANT_FALSE);
519     if(NS_FAILED(nsres)) {
520         ERR("SetChecked failed: %08x\n", nsres);
521         return E_FAIL;
522     }
523 
524     return S_OK;
525 }
526 
527 static HRESULT WINAPI HTMLInputElement_get_checked(IHTMLInputElement *iface, VARIANT_BOOL *p)
528 {
529     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
530     cpp_bool checked;
531     nsresult nsres;
532 
533     TRACE("(%p)->(%p)\n", This, p);
534 
535     nsres = nsIDOMHTMLInputElement_GetChecked(This->nsinput, &checked);
536     if(NS_FAILED(nsres)) {
537         ERR("GetChecked failed: %08x\n", nsres);
538         return E_FAIL;
539     }
540 
541     *p = checked ? VARIANT_TRUE : VARIANT_FALSE;
542     TRACE("checked=%x\n", *p);
543     return S_OK;
544 }
545 
546 static HRESULT WINAPI HTMLInputElement_put_border(IHTMLInputElement *iface, VARIANT v)
547 {
548     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
549     FIXME("(%p)->()\n", This);
550     return E_NOTIMPL;
551 }
552 
553 static HRESULT WINAPI HTMLInputElement_get_border(IHTMLInputElement *iface, VARIANT *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_vspace(IHTMLInputElement *iface, LONG v)
561 {
562     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
563     FIXME("(%p)->(%d)\n", This, v);
564     return E_NOTIMPL;
565 }
566 
567 static HRESULT WINAPI HTMLInputElement_get_vspace(IHTMLInputElement *iface, LONG *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_hspace(IHTMLInputElement *iface, LONG v)
575 {
576     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
577     FIXME("(%p)->(%d)\n", This, v);
578     return E_NOTIMPL;
579 }
580 
581 static HRESULT WINAPI HTMLInputElement_get_hspace(IHTMLInputElement *iface, LONG *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_put_alt(IHTMLInputElement *iface, BSTR v)
589 {
590     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
591     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
592     return E_NOTIMPL;
593 }
594 
595 static HRESULT WINAPI HTMLInputElement_get_alt(IHTMLInputElement *iface, BSTR *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_src(IHTMLInputElement *iface, BSTR v)
603 {
604     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
605     nsAString nsstr;
606     nsresult nsres;
607 
608     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
609 
610     nsAString_InitDepend(&nsstr, v);
611     nsres = nsIDOMHTMLInputElement_SetSrc(This->nsinput, &nsstr);
612     nsAString_Finish(&nsstr);
613     if(NS_FAILED(nsres))
614         ERR("SetSrc failed: %08x\n", nsres);
615 
616     return S_OK;
617 }
618 
619 static HRESULT WINAPI HTMLInputElement_get_src(IHTMLInputElement *iface, BSTR *p)
620 {
621     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
622     const PRUnichar *src;
623     nsAString src_str;
624     nsresult nsres;
625     HRESULT hres;
626 
627     TRACE("(%p)->(%p)\n", This, p);
628 
629     nsAString_Init(&src_str, NULL);
630     nsres = nsIDOMHTMLInputElement_GetSrc(This->nsinput, &src_str);
631     if(NS_FAILED(nsres)) {
632         ERR("GetSrc failed: %08x\n", nsres);
633         return E_FAIL;
634     }
635 
636     nsAString_GetData(&src_str, &src);
637     hres = nsuri_to_url(src, FALSE, p);
638     nsAString_Finish(&src_str);
639 
640     return hres;
641 }
642 
643 static HRESULT WINAPI HTMLInputElement_put_lowsrc(IHTMLInputElement *iface, BSTR v)
644 {
645     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
646     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
647     return E_NOTIMPL;
648 }
649 
650 static HRESULT WINAPI HTMLInputElement_get_lowsrc(IHTMLInputElement *iface, BSTR *p)
651 {
652     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
653     FIXME("(%p)->(%p)\n", This, p);
654     return E_NOTIMPL;
655 }
656 
657 static HRESULT WINAPI HTMLInputElement_put_vrml(IHTMLInputElement *iface, BSTR v)
658 {
659     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
660     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
661     return E_NOTIMPL;
662 }
663 
664 static HRESULT WINAPI HTMLInputElement_get_vrml(IHTMLInputElement *iface, BSTR *p)
665 {
666     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
667     FIXME("(%p)->(%p)\n", This, p);
668     return E_NOTIMPL;
669 }
670 
671 static HRESULT WINAPI HTMLInputElement_put_dynsrc(IHTMLInputElement *iface, BSTR v)
672 {
673     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
674     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
675     return E_NOTIMPL;
676 }
677 
678 static HRESULT WINAPI HTMLInputElement_get_dynsrc(IHTMLInputElement *iface, BSTR *p)
679 {
680     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
681     FIXME("(%p)->(%p)\n", This, p);
682     return E_NOTIMPL;
683 }
684 
685 static HRESULT WINAPI HTMLInputElement_get_readyState(IHTMLInputElement *iface, BSTR *p)
686 {
687     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
688     FIXME("(%p)->(%p)\n", This, p);
689     return E_NOTIMPL;
690 }
691 
692 static HRESULT WINAPI HTMLInputElement_get_complete(IHTMLInputElement *iface, VARIANT_BOOL *p)
693 {
694     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
695     FIXME("(%p)->(%p)\n", This, p);
696     return E_NOTIMPL;
697 }
698 
699 static HRESULT WINAPI HTMLInputElement_put_loop(IHTMLInputElement *iface, VARIANT v)
700 {
701     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
702     FIXME("(%p)->()\n", This);
703     return E_NOTIMPL;
704 }
705 
706 static HRESULT WINAPI HTMLInputElement_get_loop(IHTMLInputElement *iface, VARIANT *p)
707 {
708     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
709     FIXME("(%p)->(%p)\n", This, p);
710     return E_NOTIMPL;
711 }
712 
713 static HRESULT WINAPI HTMLInputElement_put_align(IHTMLInputElement *iface, BSTR v)
714 {
715     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
716     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
717     return E_NOTIMPL;
718 }
719 
720 static HRESULT WINAPI HTMLInputElement_get_align(IHTMLInputElement *iface, BSTR *p)
721 {
722     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
723     FIXME("(%p)->(%p)\n", This, p);
724     return E_NOTIMPL;
725 }
726 
727 static HRESULT WINAPI HTMLInputElement_put_onload(IHTMLInputElement *iface, VARIANT v)
728 {
729     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
730     FIXME("(%p)->()\n", This);
731     return E_NOTIMPL;
732 }
733 
734 static HRESULT WINAPI HTMLInputElement_get_onload(IHTMLInputElement *iface, VARIANT *p)
735 {
736     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
737     FIXME("(%p)->(%p)\n", This, p);
738     return E_NOTIMPL;
739 }
740 
741 static HRESULT WINAPI HTMLInputElement_put_onerror(IHTMLInputElement *iface, VARIANT v)
742 {
743     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
744     FIXME("(%p)->()\n", This);
745     return E_NOTIMPL;
746 }
747 
748 static HRESULT WINAPI HTMLInputElement_get_onerror(IHTMLInputElement *iface, VARIANT *p)
749 {
750     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
751     FIXME("(%p)->(%p)\n", This, p);
752     return E_NOTIMPL;
753 }
754 
755 static HRESULT WINAPI HTMLInputElement_put_onabort(IHTMLInputElement *iface, VARIANT v)
756 {
757     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
758     FIXME("(%p)->()\n", This);
759     return E_NOTIMPL;
760 }
761 
762 static HRESULT WINAPI HTMLInputElement_get_onabort(IHTMLInputElement *iface, VARIANT *p)
763 {
764     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
765     FIXME("(%p)->(%p)\n", This, p);
766     return E_NOTIMPL;
767 }
768 
769 static HRESULT WINAPI HTMLInputElement_put_width(IHTMLInputElement *iface, LONG v)
770 {
771     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
772     FIXME("(%p)->(%d)\n", This, v);
773     return E_NOTIMPL;
774 }
775 
776 static HRESULT WINAPI HTMLInputElement_get_width(IHTMLInputElement *iface, LONG *p)
777 {
778     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
779     FIXME("(%p)->(%p)\n", This, p);
780     return E_NOTIMPL;
781 }
782 
783 static HRESULT WINAPI HTMLInputElement_put_height(IHTMLInputElement *iface, LONG v)
784 {
785     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
786     FIXME("(%p)->(%d)\n", This, v);
787     return E_NOTIMPL;
788 }
789 
790 static HRESULT WINAPI HTMLInputElement_get_height(IHTMLInputElement *iface, LONG *p)
791 {
792     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
793     FIXME("(%p)->(%p)\n", This, p);
794     return E_NOTIMPL;
795 }
796 
797 static HRESULT WINAPI HTMLInputElement_put_start(IHTMLInputElement *iface, BSTR v)
798 {
799     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
800     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
801     return E_NOTIMPL;
802 }
803 
804 static HRESULT WINAPI HTMLInputElement_get_start(IHTMLInputElement *iface, BSTR *p)
805 {
806     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
807     FIXME("(%p)->(%p)\n", This, p);
808     return E_NOTIMPL;
809 }
810 
811 static const IHTMLInputElementVtbl HTMLInputElementVtbl = {
812     HTMLInputElement_QueryInterface,
813     HTMLInputElement_AddRef,
814     HTMLInputElement_Release,
815     HTMLInputElement_GetTypeInfoCount,
816     HTMLInputElement_GetTypeInfo,
817     HTMLInputElement_GetIDsOfNames,
818     HTMLInputElement_Invoke,
819     HTMLInputElement_put_type,
820     HTMLInputElement_get_type,
821     HTMLInputElement_put_value,
822     HTMLInputElement_get_value,
823     HTMLInputElement_put_name,
824     HTMLInputElement_get_name,
825     HTMLInputElement_put_status,
826     HTMLInputElement_get_status,
827     HTMLInputElement_put_disabled,
828     HTMLInputElement_get_disabled,
829     HTMLInputElement_get_form,
830     HTMLInputElement_put_size,
831     HTMLInputElement_get_size,
832     HTMLInputElement_put_maxLength,
833     HTMLInputElement_get_maxLength,
834     HTMLInputElement_select,
835     HTMLInputElement_put_onchange,
836     HTMLInputElement_get_onchange,
837     HTMLInputElement_put_onselect,
838     HTMLInputElement_get_onselect,
839     HTMLInputElement_put_defaultValue,
840     HTMLInputElement_get_defaultValue,
841     HTMLInputElement_put_readOnly,
842     HTMLInputElement_get_readOnly,
843     HTMLInputElement_createTextRange,
844     HTMLInputElement_put_indeterminate,
845     HTMLInputElement_get_indeterminate,
846     HTMLInputElement_put_defaultChecked,
847     HTMLInputElement_get_defaultChecked,
848     HTMLInputElement_put_checked,
849     HTMLInputElement_get_checked,
850     HTMLInputElement_put_border,
851     HTMLInputElement_get_border,
852     HTMLInputElement_put_vspace,
853     HTMLInputElement_get_vspace,
854     HTMLInputElement_put_hspace,
855     HTMLInputElement_get_hspace,
856     HTMLInputElement_put_alt,
857     HTMLInputElement_get_alt,
858     HTMLInputElement_put_src,
859     HTMLInputElement_get_src,
860     HTMLInputElement_put_lowsrc,
861     HTMLInputElement_get_lowsrc,
862     HTMLInputElement_put_vrml,
863     HTMLInputElement_get_vrml,
864     HTMLInputElement_put_dynsrc,
865     HTMLInputElement_get_dynsrc,
866     HTMLInputElement_get_readyState,
867     HTMLInputElement_get_complete,
868     HTMLInputElement_put_loop,
869     HTMLInputElement_get_loop,
870     HTMLInputElement_put_align,
871     HTMLInputElement_get_align,
872     HTMLInputElement_put_onload,
873     HTMLInputElement_get_onload,
874     HTMLInputElement_put_onerror,
875     HTMLInputElement_get_onerror,
876     HTMLInputElement_put_onabort,
877     HTMLInputElement_get_onabort,
878     HTMLInputElement_put_width,
879     HTMLInputElement_get_width,
880     HTMLInputElement_put_height,
881     HTMLInputElement_get_height,
882     HTMLInputElement_put_start,
883     HTMLInputElement_get_start
884 };
885 
886 static HRESULT WINAPI HTMLInputTextElement_QueryInterface(IHTMLInputTextElement *iface,
887         REFIID riid, void **ppv)
888 {
889     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
890 
891     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
892 }
893 
894 static ULONG WINAPI HTMLInputTextElement_AddRef(IHTMLInputTextElement *iface)
895 {
896     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
897 
898     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
899 }
900 
901 static ULONG WINAPI HTMLInputTextElement_Release(IHTMLInputTextElement *iface)
902 {
903     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
904 
905     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
906 }
907 
908 static HRESULT WINAPI HTMLInputTextElement_GetTypeInfoCount(IHTMLInputTextElement *iface, UINT *pctinfo)
909 {
910     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
911     return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
912 }
913 
914 static HRESULT WINAPI HTMLInputTextElement_GetTypeInfo(IHTMLInputTextElement *iface, UINT iTInfo,
915         LCID lcid, ITypeInfo **ppTInfo)
916 {
917     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
918     return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
919             ppTInfo);
920 }
921 
922 static HRESULT WINAPI HTMLInputTextElement_GetIDsOfNames(IHTMLInputTextElement *iface, REFIID riid,
923         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
924 {
925     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
926     return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
927             cNames, lcid, rgDispId);
928 }
929 
930 static HRESULT WINAPI HTMLInputTextElement_Invoke(IHTMLInputTextElement *iface, DISPID dispIdMember,
931                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
932                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
933 {
934     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
935     return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
936             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
937 }
938 
939 static HRESULT WINAPI HTMLInputTextElement_get_type(IHTMLInputTextElement *iface, BSTR *p)
940 {
941     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
942 
943     TRACE("(%p)->(%p)\n", This, p);
944 
945     return IHTMLInputElement_get_type(&This->IHTMLInputElement_iface, p);
946 }
947 
948 static HRESULT WINAPI HTMLInputTextElement_put_value(IHTMLInputTextElement *iface, BSTR v)
949 {
950     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
951 
952     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
953 
954     return IHTMLInputElement_put_value(&This->IHTMLInputElement_iface, v);
955 }
956 
957 static HRESULT WINAPI HTMLInputTextElement_get_value(IHTMLInputTextElement *iface, BSTR *p)
958 {
959     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
960 
961     TRACE("(%p)->(%p)\n", This, p);
962 
963     return IHTMLInputElement_get_value(&This->IHTMLInputElement_iface, p);
964 }
965 
966 static HRESULT WINAPI HTMLInputTextElement_put_name(IHTMLInputTextElement *iface, BSTR v)
967 {
968     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
969 
970     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
971 
972     return IHTMLInputElement_put_name(&This->IHTMLInputElement_iface, v);
973 }
974 
975 static HRESULT WINAPI HTMLInputTextElement_get_name(IHTMLInputTextElement *iface, BSTR *p)
976 {
977     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
978 
979     TRACE("(%p)->(%p)\n", This, p);
980 
981     return IHTMLInputElement_get_name(&This->IHTMLInputElement_iface, p);
982 }
983 
984 static HRESULT WINAPI HTMLInputTextElement_put_status(IHTMLInputTextElement *iface, VARIANT v)
985 {
986     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
987     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
988     return E_NOTIMPL;
989 }
990 
991 static HRESULT WINAPI HTMLInputTextElement_get_status(IHTMLInputTextElement *iface, VARIANT *p)
992 {
993     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
994     TRACE("(%p)->(%p)\n", This, p);
995     return E_NOTIMPL;
996 }
997 
998 static HRESULT WINAPI HTMLInputTextElement_put_disabled(IHTMLInputTextElement *iface, VARIANT_BOOL v)
999 {
1000     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1001 
1002     TRACE("(%p)->(%x)\n", This, v);
1003 
1004     return IHTMLInputElement_put_disabled(&This->IHTMLInputElement_iface, v);
1005 }
1006 
1007 static HRESULT WINAPI HTMLInputTextElement_get_disabled(IHTMLInputTextElement *iface, VARIANT_BOOL *p)
1008 {
1009     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1010 
1011     TRACE("(%p)->(%p)\n", This, p);
1012 
1013     return IHTMLInputElement_get_disabled(&This->IHTMLInputElement_iface, p);
1014 }
1015 
1016 static HRESULT WINAPI HTMLInputTextElement_get_form(IHTMLInputTextElement *iface, IHTMLFormElement **p)
1017 {
1018     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1019 
1020     TRACE("(%p)->(%p)\n", This, p);
1021 
1022     return IHTMLInputElement_get_form(&This->IHTMLInputElement_iface, p);
1023 }
1024 
1025 static HRESULT WINAPI HTMLInputTextElement_put_defaultValue(IHTMLInputTextElement *iface, BSTR v)
1026 {
1027     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1028 
1029     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1030 
1031     return IHTMLInputElement_put_defaultValue(&This->IHTMLInputElement_iface, v);
1032 }
1033 
1034 static HRESULT WINAPI HTMLInputTextElement_get_defaultValue(IHTMLInputTextElement *iface, BSTR *p)
1035 {
1036     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1037 
1038     TRACE("(%p)->(%p)\n", This, p);
1039 
1040     return IHTMLInputElement_get_defaultValue(&This->IHTMLInputElement_iface, p);
1041 }
1042 
1043 static HRESULT WINAPI HTMLInputTextElement_put_size(IHTMLInputTextElement *iface, LONG v)
1044 {
1045     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1046 
1047     TRACE("(%p)->(%d)\n", This, v);
1048 
1049     return IHTMLInputElement_put_size(&This->IHTMLInputElement_iface, v);
1050 }
1051 
1052 static HRESULT WINAPI HTMLInputTextElement_get_size(IHTMLInputTextElement *iface, LONG *p)
1053 {
1054     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1055 
1056     TRACE("(%p)->(%p)\n", This, p);
1057 
1058     return IHTMLInputElement_get_size(&This->IHTMLInputElement_iface, p);
1059 }
1060 
1061 static HRESULT WINAPI HTMLInputTextElement_put_maxLength(IHTMLInputTextElement *iface, LONG v)
1062 {
1063     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1064 
1065     TRACE("(%p)->(%d)\n", This, v);
1066 
1067     return IHTMLInputElement_put_maxLength(&This->IHTMLInputElement_iface, v);
1068 }
1069 
1070 static HRESULT WINAPI HTMLInputTextElement_get_maxLength(IHTMLInputTextElement *iface, LONG *p)
1071 {
1072     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1073 
1074     TRACE("(%p)->(%p)\n", This, p);
1075 
1076     return IHTMLInputElement_get_maxLength(&This->IHTMLInputElement_iface, p);
1077 }
1078 
1079 static HRESULT WINAPI HTMLInputTextElement_select(IHTMLInputTextElement *iface)
1080 {
1081     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1082 
1083     TRACE("(%p)\n", This);
1084 
1085     return IHTMLInputElement_select(&This->IHTMLInputElement_iface);
1086 }
1087 
1088 static HRESULT WINAPI HTMLInputTextElement_put_onchange(IHTMLInputTextElement *iface, VARIANT v)
1089 {
1090     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1091 
1092     TRACE("(%p)->()\n", This);
1093 
1094     return IHTMLInputElement_put_onchange(&This->IHTMLInputElement_iface, v);
1095 }
1096 
1097 static HRESULT WINAPI HTMLInputTextElement_get_onchange(IHTMLInputTextElement *iface, VARIANT *p)
1098 {
1099     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1100 
1101     TRACE("(%p)->(%p)\n", This, p);
1102 
1103     return IHTMLInputElement_get_onchange(&This->IHTMLInputElement_iface, p);
1104 }
1105 
1106 static HRESULT WINAPI HTMLInputTextElement_put_onselect(IHTMLInputTextElement *iface, VARIANT v)
1107 {
1108     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1109 
1110     TRACE("(%p)->()\n", This);
1111 
1112     return IHTMLInputElement_put_onselect(&This->IHTMLInputElement_iface, v);
1113 }
1114 
1115 static HRESULT WINAPI HTMLInputTextElement_get_onselect(IHTMLInputTextElement *iface, VARIANT *p)
1116 {
1117     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1118 
1119     TRACE("(%p)->(%p)\n", This, p);
1120 
1121     return IHTMLInputElement_get_onselect(&This->IHTMLInputElement_iface, p);
1122 }
1123 
1124 static HRESULT WINAPI HTMLInputTextElement_put_readOnly(IHTMLInputTextElement *iface, VARIANT_BOOL v)
1125 {
1126     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1127 
1128     TRACE("(%p)->(%x)\n", This, v);
1129 
1130     return IHTMLInputElement_put_readOnly(&This->IHTMLInputElement_iface, v);
1131 }
1132 
1133 static HRESULT WINAPI HTMLInputTextElement_get_readOnly(IHTMLInputTextElement *iface, VARIANT_BOOL *p)
1134 {
1135     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1136 
1137     TRACE("(%p)->(%p)\n", This, p);
1138 
1139     return IHTMLInputElement_get_readOnly(&This->IHTMLInputElement_iface, p);
1140 }
1141 
1142 static HRESULT WINAPI HTMLInputTextElement_createTextRange(IHTMLInputTextElement *iface, IHTMLTxtRange **range)
1143 {
1144     HTMLInputElement *This = impl_from_IHTMLInputTextElement(iface);
1145 
1146     TRACE("(%p)->(%p)\n", This, range);
1147 
1148     return IHTMLInputElement_createTextRange(&This->IHTMLInputElement_iface, range);
1149 }
1150 
1151 static const IHTMLInputTextElementVtbl HTMLInputTextElementVtbl = {
1152     HTMLInputTextElement_QueryInterface,
1153     HTMLInputTextElement_AddRef,
1154     HTMLInputTextElement_Release,
1155     HTMLInputTextElement_GetTypeInfoCount,
1156     HTMLInputTextElement_GetTypeInfo,
1157     HTMLInputTextElement_GetIDsOfNames,
1158     HTMLInputTextElement_Invoke,
1159     HTMLInputTextElement_get_type,
1160     HTMLInputTextElement_put_value,
1161     HTMLInputTextElement_get_value,
1162     HTMLInputTextElement_put_name,
1163     HTMLInputTextElement_get_name,
1164     HTMLInputTextElement_put_status,
1165     HTMLInputTextElement_get_status,
1166     HTMLInputTextElement_put_disabled,
1167     HTMLInputTextElement_get_disabled,
1168     HTMLInputTextElement_get_form,
1169     HTMLInputTextElement_put_defaultValue,
1170     HTMLInputTextElement_get_defaultValue,
1171     HTMLInputTextElement_put_size,
1172     HTMLInputTextElement_get_size,
1173     HTMLInputTextElement_put_maxLength,
1174     HTMLInputTextElement_get_maxLength,
1175     HTMLInputTextElement_select,
1176     HTMLInputTextElement_put_onchange,
1177     HTMLInputTextElement_get_onchange,
1178     HTMLInputTextElement_put_onselect,
1179     HTMLInputTextElement_get_onselect,
1180     HTMLInputTextElement_put_readOnly,
1181     HTMLInputTextElement_get_readOnly,
1182     HTMLInputTextElement_createTextRange
1183 };
1184 
1185 static inline HTMLInputElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
1186 {
1187     return CONTAINING_RECORD(iface, HTMLInputElement, element.node);
1188 }
1189 
1190 static HRESULT HTMLInputElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1191 {
1192     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1193 
1194     *ppv = NULL;
1195 
1196     if(IsEqualGUID(&IID_IUnknown, riid)) {
1197         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1198         *ppv = &This->IHTMLInputElement_iface;
1199     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
1200         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
1201         *ppv = &This->IHTMLInputElement_iface;
1202     }else if(IsEqualGUID(&IID_IHTMLInputElement, riid)) {
1203         TRACE("(%p)->(IID_IHTMLInputElement %p)\n", This, ppv);
1204         *ppv = &This->IHTMLInputElement_iface;
1205     }else if(IsEqualGUID(&IID_IHTMLInputTextElement, riid)) {
1206         TRACE("(%p)->(IID_IHTMLInputTextElement %p)\n", This, ppv);
1207         *ppv = &This->IHTMLInputTextElement_iface;
1208     }
1209 
1210     if(*ppv) {
1211         IUnknown_AddRef((IUnknown*)*ppv);
1212         return S_OK;
1213     }
1214 
1215     return HTMLElement_QI(&This->element.node, riid, ppv);
1216 }
1217 
1218 #ifndef __REACTOS__
1219 static HRESULT HTMLInputElementImpl_fire_event(HTMLDOMNode *iface, eventid_t eid, BOOL *handled)
1220 #else
1221 static HRESULT HTMLInputElementImpl_fire_event(HTMLDOMNode *iface, DWORD eid, BOOL *handled)
1222 #endif
1223 {
1224     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1225 
1226     if(eid == EVENTID_CLICK) {
1227         nsresult nsres;
1228 
1229         *handled = TRUE;
1230 
1231         nsres = nsIDOMHTMLElement_Click(This->element.nselem);
1232         if(NS_FAILED(nsres)) {
1233             ERR("Click failed: %08x\n", nsres);
1234             return E_FAIL;
1235         }
1236     }
1237 
1238     return S_OK;
1239 }
1240 
1241 static HRESULT HTMLInputElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
1242 {
1243     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1244     return IHTMLInputElement_put_disabled(&This->IHTMLInputElement_iface, v);
1245 }
1246 
1247 static HRESULT HTMLInputElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
1248 {
1249     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1250     return IHTMLInputElement_get_disabled(&This->IHTMLInputElement_iface, p);
1251 }
1252 
1253 static BOOL HTMLInputElement_is_text_edit(HTMLDOMNode *iface)
1254 {
1255     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1256     const PRUnichar *type;
1257     nsAString nsstr;
1258     nsresult nsres;
1259     BOOL ret = FALSE;
1260 
1261     static const WCHAR buttonW[] = {'b','u','t','t','o','n',0};
1262     static const WCHAR hiddenW[] = {'h','i','d','d','e','n',0};
1263     static const WCHAR passwordW[] = {'p','a','s','s','w','o','r','d',0};
1264     static const WCHAR resetW[] = {'r','e','s','e','t',0};
1265     static const WCHAR submitW[] = {'s','u','b','m','i','t',0};
1266     static const WCHAR textW[] = {'t','e','x','t',0};
1267 
1268     nsAString_Init(&nsstr, NULL);
1269     nsres = nsIDOMHTMLInputElement_GetType(This->nsinput, &nsstr);
1270     if(NS_SUCCEEDED(nsres)) {
1271         nsAString_GetData(&nsstr, &type);
1272         ret = !strcmpW(type, buttonW) || !strcmpW(type, hiddenW) || !strcmpW(type, passwordW)
1273             || !strcmpW(type, resetW) || !strcmpW(type, submitW) || !strcmpW(type, textW);
1274     }
1275     nsAString_Finish(&nsstr);
1276     return ret;
1277 }
1278 
1279 static void HTMLInputElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
1280 {
1281     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1282 
1283     if(This->nsinput)
1284         note_cc_edge((nsISupports*)This->nsinput, "This->nsinput", cb);
1285 }
1286 
1287 static void HTMLInputElement_unlink(HTMLDOMNode *iface)
1288 {
1289     HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
1290 
1291     if(This->nsinput) {
1292         nsIDOMHTMLInputElement *nsinput = This->nsinput;
1293 
1294         This->nsinput = NULL;
1295         nsIDOMHTMLInputElement_Release(nsinput);
1296     }
1297 }
1298 
1299 static const NodeImplVtbl HTMLInputElementImplVtbl = {
1300     HTMLInputElement_QI,
1301     HTMLElement_destructor,
1302     HTMLElement_cpc,
1303     HTMLElement_clone,
1304     HTMLElement_handle_event,
1305     HTMLElement_get_attr_col,
1306     NULL,
1307     HTMLInputElementImpl_fire_event,
1308     HTMLInputElementImpl_put_disabled,
1309     HTMLInputElementImpl_get_disabled,
1310     NULL,
1311     NULL,
1312     NULL,
1313     NULL,
1314     NULL,
1315     HTMLInputElement_traverse,
1316     HTMLInputElement_unlink,
1317     HTMLInputElement_is_text_edit
1318 };
1319 
1320 static const tid_t HTMLInputElement_iface_tids[] = {
1321     HTMLELEMENT_TIDS,
1322     IHTMLInputElement_tid,
1323     0
1324 };
1325 static dispex_static_data_t HTMLInputElement_dispex = {
1326     NULL,
1327     DispHTMLInputElement_tid,
1328     NULL,
1329     HTMLInputElement_iface_tids
1330 };
1331 
1332 HRESULT HTMLInputElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
1333 {
1334     HTMLInputElement *ret;
1335     nsresult nsres;
1336 
1337     ret = heap_alloc_zero(sizeof(HTMLInputElement));
1338     if(!ret)
1339         return E_OUTOFMEMORY;
1340 
1341     ret->IHTMLInputElement_iface.lpVtbl = &HTMLInputElementVtbl;
1342     ret->IHTMLInputTextElement_iface.lpVtbl = &HTMLInputTextElementVtbl;
1343     ret->element.node.vtbl = &HTMLInputElementImplVtbl;
1344 
1345     HTMLElement_Init(&ret->element, doc, nselem, &HTMLInputElement_dispex);
1346 
1347     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLInputElement, (void**)&ret->nsinput);
1348     assert(nsres == NS_OK);
1349 
1350     *elem = &ret->element;
1351     return S_OK;
1352 }
1353 
1354 typedef struct {
1355     HTMLElement element;
1356 
1357     IHTMLLabelElement IHTMLLabelElement_iface;
1358 } HTMLLabelElement;
1359 
1360 static inline HTMLLabelElement *impl_from_IHTMLLabelElement(IHTMLLabelElement *iface)
1361 {
1362     return CONTAINING_RECORD(iface, HTMLLabelElement, IHTMLLabelElement_iface);
1363 }
1364 
1365 static HRESULT WINAPI HTMLLabelElement_QueryInterface(IHTMLLabelElement *iface,
1366                                                          REFIID riid, void **ppv)
1367 {
1368     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1369 
1370     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
1371 }
1372 
1373 static ULONG WINAPI HTMLLabelElement_AddRef(IHTMLLabelElement *iface)
1374 {
1375     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1376 
1377     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
1378 }
1379 
1380 static ULONG WINAPI HTMLLabelElement_Release(IHTMLLabelElement *iface)
1381 {
1382     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1383 
1384     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
1385 }
1386 
1387 static HRESULT WINAPI HTMLLabelElement_GetTypeInfoCount(IHTMLLabelElement *iface, UINT *pctinfo)
1388 {
1389     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1390 
1391     return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
1392 }
1393 
1394 static HRESULT WINAPI HTMLLabelElement_GetTypeInfo(IHTMLLabelElement *iface, UINT iTInfo,
1395         LCID lcid, ITypeInfo **ppTInfo)
1396 {
1397     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1398 
1399     return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1400 }
1401 
1402 static HRESULT WINAPI HTMLLabelElement_GetIDsOfNames(IHTMLLabelElement *iface, REFIID riid,
1403         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1404 {
1405     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1406 
1407     return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
1408             cNames, lcid, rgDispId);
1409 }
1410 
1411 static HRESULT WINAPI HTMLLabelElement_Invoke(IHTMLLabelElement *iface, DISPID dispIdMember,
1412                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1413                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1414 {
1415     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1416 
1417     return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
1418             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1419 }
1420 
1421 static HRESULT WINAPI HTMLLabelElement_put_htmlFor(IHTMLLabelElement *iface, BSTR v)
1422 {
1423     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1424     nsAString for_str, val_str;
1425     nsresult nsres;
1426 
1427     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1428 
1429     nsAString_InitDepend(&for_str, forW);
1430     nsAString_InitDepend(&val_str, v);
1431     nsres = nsIDOMHTMLElement_SetAttribute(This->element.nselem, &for_str, &val_str);
1432     nsAString_Finish(&for_str);
1433     nsAString_Finish(&val_str);
1434     if(NS_FAILED(nsres)) {
1435         ERR("SetAttribute failed: %08x\n", nsres);
1436         return E_FAIL;
1437     }
1438 
1439     return S_OK;
1440 }
1441 
1442 static HRESULT WINAPI HTMLLabelElement_get_htmlFor(IHTMLLabelElement *iface, BSTR *p)
1443 {
1444     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1445 
1446     TRACE("(%p)->(%p)\n", This, p);
1447 
1448     return elem_string_attr_getter(&This->element, forW, FALSE, p);
1449 }
1450 
1451 static HRESULT WINAPI HTMLLabelElement_put_accessKey(IHTMLLabelElement *iface, BSTR v)
1452 {
1453     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1454     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1455     return E_NOTIMPL;
1456 }
1457 
1458 static HRESULT WINAPI HTMLLabelElement_get_accessKey(IHTMLLabelElement *iface, BSTR *p)
1459 {
1460     HTMLLabelElement *This = impl_from_IHTMLLabelElement(iface);
1461     FIXME("(%p)->(%p)\n", This, p);
1462     return E_NOTIMPL;
1463 }
1464 
1465 static const IHTMLLabelElementVtbl HTMLLabelElementVtbl = {
1466     HTMLLabelElement_QueryInterface,
1467     HTMLLabelElement_AddRef,
1468     HTMLLabelElement_Release,
1469     HTMLLabelElement_GetTypeInfoCount,
1470     HTMLLabelElement_GetTypeInfo,
1471     HTMLLabelElement_GetIDsOfNames,
1472     HTMLLabelElement_Invoke,
1473     HTMLLabelElement_put_htmlFor,
1474     HTMLLabelElement_get_htmlFor,
1475     HTMLLabelElement_put_accessKey,
1476     HTMLLabelElement_get_accessKey
1477 };
1478 
1479 static inline HTMLLabelElement *label_from_HTMLDOMNode(HTMLDOMNode *iface)
1480 {
1481     return CONTAINING_RECORD(iface, HTMLLabelElement, element.node);
1482 }
1483 
1484 static HRESULT HTMLLabelElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1485 {
1486     HTMLLabelElement *This = label_from_HTMLDOMNode(iface);
1487 
1488     *ppv = NULL;
1489 
1490     if(IsEqualGUID(&IID_IUnknown, riid)) {
1491         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1492         *ppv = &This->IHTMLLabelElement_iface;
1493     }else if(IsEqualGUID(&IID_IHTMLLabelElement, riid)) {
1494         TRACE("(%p)->(IID_IHTMLLabelElement %p)\n", This, ppv);
1495         *ppv = &This->IHTMLLabelElement_iface;
1496     }else {
1497         return HTMLElement_QI(&This->element.node, riid, ppv);
1498     }
1499 
1500     IUnknown_AddRef((IUnknown*)*ppv);
1501     return S_OK;
1502 }
1503 
1504 static const NodeImplVtbl HTMLLabelElementImplVtbl = {
1505     HTMLLabelElement_QI,
1506     HTMLElement_destructor,
1507     HTMLElement_cpc,
1508     HTMLElement_clone,
1509     HTMLElement_handle_event,
1510     HTMLElement_get_attr_col,
1511 };
1512 
1513 static const tid_t HTMLLabelElement_iface_tids[] = {
1514     HTMLELEMENT_TIDS,
1515     IHTMLLabelElement_tid,
1516     0
1517 };
1518 
1519 static dispex_static_data_t HTMLLabelElement_dispex = {
1520     NULL,
1521     DispHTMLLabelElement_tid,
1522     NULL,
1523     HTMLLabelElement_iface_tids
1524 };
1525 
1526 HRESULT HTMLLabelElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
1527 {
1528     HTMLLabelElement *ret;
1529 
1530     ret = heap_alloc_zero(sizeof(*ret));
1531     if(!ret)
1532         return E_OUTOFMEMORY;
1533 
1534     ret->IHTMLLabelElement_iface.lpVtbl = &HTMLLabelElementVtbl;
1535     ret->element.node.vtbl = &HTMLLabelElementImplVtbl;
1536 
1537     HTMLElement_Init(&ret->element, doc, nselem, &HTMLLabelElement_dispex);
1538     *elem = &ret->element;
1539     return S_OK;
1540 }
1541 
1542 typedef struct {
1543     HTMLElement element;
1544 
1545     IHTMLButtonElement IHTMLButtonElement_iface;
1546 
1547     nsIDOMHTMLButtonElement *nsbutton;
1548 } HTMLButtonElement;
1549 
1550 static inline HTMLButtonElement *impl_from_IHTMLButtonElement(IHTMLButtonElement *iface)
1551 {
1552     return CONTAINING_RECORD(iface, HTMLButtonElement, IHTMLButtonElement_iface);
1553 }
1554 
1555 static HRESULT WINAPI HTMLButtonElement_QueryInterface(IHTMLButtonElement *iface,
1556                                                          REFIID riid, void **ppv)
1557 {
1558     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1559 
1560     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
1561 }
1562 
1563 static ULONG WINAPI HTMLButtonElement_AddRef(IHTMLButtonElement *iface)
1564 {
1565     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1566 
1567     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
1568 }
1569 
1570 static ULONG WINAPI HTMLButtonElement_Release(IHTMLButtonElement *iface)
1571 {
1572     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1573 
1574     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
1575 }
1576 
1577 static HRESULT WINAPI HTMLButtonElement_GetTypeInfoCount(IHTMLButtonElement *iface, UINT *pctinfo)
1578 {
1579     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1580 
1581     return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
1582 }
1583 
1584 static HRESULT WINAPI HTMLButtonElement_GetTypeInfo(IHTMLButtonElement *iface, UINT iTInfo,
1585         LCID lcid, ITypeInfo **ppTInfo)
1586 {
1587     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1588 
1589     return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1590 }
1591 
1592 static HRESULT WINAPI HTMLButtonElement_GetIDsOfNames(IHTMLButtonElement *iface, REFIID riid,
1593         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1594 {
1595     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1596 
1597     return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
1598             cNames, lcid, rgDispId);
1599 }
1600 
1601 static HRESULT WINAPI HTMLButtonElement_Invoke(IHTMLButtonElement *iface, DISPID dispIdMember,
1602                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1603                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1604 {
1605     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1606 
1607     return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
1608             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1609 }
1610 
1611 static HRESULT WINAPI HTMLButtonElement_get_type(IHTMLButtonElement *iface, BSTR *p)
1612 {
1613     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1614     FIXME("(%p)->(%p)\n", This, p);
1615     return E_NOTIMPL;
1616 }
1617 
1618 static HRESULT WINAPI HTMLButtonElement_put_value(IHTMLButtonElement *iface, BSTR v)
1619 {
1620     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1621     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1622     return E_NOTIMPL;
1623 }
1624 
1625 static HRESULT WINAPI HTMLButtonElement_get_value(IHTMLButtonElement *iface, BSTR *p)
1626 {
1627     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1628     FIXME("(%p)->(%p)\n", This, p);
1629     return E_NOTIMPL;
1630 }
1631 
1632 static HRESULT WINAPI HTMLButtonElement_put_name(IHTMLButtonElement *iface, BSTR v)
1633 {
1634     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1635     nsAString name_str;
1636     nsresult nsres;
1637 
1638     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1639 
1640     nsAString_InitDepend(&name_str, v);
1641     nsres = nsIDOMHTMLButtonElement_SetName(This->nsbutton, &name_str);
1642     nsAString_Finish(&name_str);
1643     if(NS_FAILED(nsres)) {
1644         ERR("SetName failed: %08x\n", nsres);
1645         return E_FAIL;
1646     }
1647 
1648     return S_OK;
1649 }
1650 
1651 static HRESULT WINAPI HTMLButtonElement_get_name(IHTMLButtonElement *iface, BSTR *p)
1652 {
1653     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1654     nsAString name_str;
1655     nsresult nsres;
1656 
1657     TRACE("(%p)->(%p)\n", This, p);
1658 
1659     nsAString_Init(&name_str, NULL);
1660     nsres = nsIDOMHTMLButtonElement_GetName(This->nsbutton, &name_str);
1661     return return_nsstr(nsres, &name_str, p);
1662 }
1663 
1664 static HRESULT WINAPI HTMLButtonElement_put_status(IHTMLButtonElement *iface, VARIANT v)
1665 {
1666     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1667     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1668     return E_NOTIMPL;
1669 }
1670 
1671 static HRESULT WINAPI HTMLButtonElement_get_status(IHTMLButtonElement *iface, VARIANT *p)
1672 {
1673     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1674     FIXME("(%p)->(%p)\n", This, p);
1675     return E_NOTIMPL;
1676 }
1677 
1678 static HRESULT WINAPI HTMLButtonElement_put_disabled(IHTMLButtonElement *iface, VARIANT_BOOL v)
1679 {
1680     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1681     nsresult nsres;
1682 
1683     TRACE("(%p)->(%x)\n", This, v);
1684 
1685     nsres = nsIDOMHTMLButtonElement_SetDisabled(This->nsbutton, !!v);
1686     if(NS_FAILED(nsres)) {
1687         ERR("SetDisabled failed: %08x\n", nsres);
1688         return E_FAIL;
1689     }
1690 
1691     return S_OK;
1692 }
1693 
1694 static HRESULT WINAPI HTMLButtonElement_get_disabled(IHTMLButtonElement *iface, VARIANT_BOOL *p)
1695 {
1696     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1697     cpp_bool disabled;
1698     nsresult nsres;
1699 
1700     TRACE("(%p)->(%p)\n", This, p);
1701 
1702     nsres = nsIDOMHTMLButtonElement_GetDisabled(This->nsbutton, &disabled);
1703     if(NS_FAILED(nsres)) {
1704         ERR("GetDisabled failed: %08x\n", nsres);
1705         return E_FAIL;
1706     }
1707 
1708     *p = disabled ? VARIANT_TRUE : VARIANT_FALSE;
1709     return S_OK;
1710 }
1711 
1712 static HRESULT WINAPI HTMLButtonElement_get_form(IHTMLButtonElement *iface, IHTMLFormElement **p)
1713 {
1714     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1715     FIXME("(%p)->(%p)\n", This, p);
1716     return E_NOTIMPL;
1717 }
1718 
1719 static HRESULT WINAPI HTMLButtonElement_createTextRange(IHTMLButtonElement *iface, IHTMLTxtRange **range)
1720 {
1721     HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
1722     FIXME("(%p)->(%p)\n", This, range);
1723     return E_NOTIMPL;
1724 }
1725 
1726 static const IHTMLButtonElementVtbl HTMLButtonElementVtbl = {
1727     HTMLButtonElement_QueryInterface,
1728     HTMLButtonElement_AddRef,
1729     HTMLButtonElement_Release,
1730     HTMLButtonElement_GetTypeInfoCount,
1731     HTMLButtonElement_GetTypeInfo,
1732     HTMLButtonElement_GetIDsOfNames,
1733     HTMLButtonElement_Invoke,
1734     HTMLButtonElement_get_type,
1735     HTMLButtonElement_put_value,
1736     HTMLButtonElement_get_value,
1737     HTMLButtonElement_put_name,
1738     HTMLButtonElement_get_name,
1739     HTMLButtonElement_put_status,
1740     HTMLButtonElement_get_status,
1741     HTMLButtonElement_put_disabled,
1742     HTMLButtonElement_get_disabled,
1743     HTMLButtonElement_get_form,
1744     HTMLButtonElement_createTextRange
1745 };
1746 
1747 static inline HTMLButtonElement *button_from_HTMLDOMNode(HTMLDOMNode *iface)
1748 {
1749     return CONTAINING_RECORD(iface, HTMLButtonElement, element.node);
1750 }
1751 
1752 static HRESULT HTMLButtonElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1753 {
1754     HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
1755 
1756     *ppv = NULL;
1757 
1758     if(IsEqualGUID(&IID_IUnknown, riid)) {
1759         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1760         *ppv = &This->IHTMLButtonElement_iface;
1761     }else if(IsEqualGUID(&IID_IHTMLButtonElement, riid)) {
1762         TRACE("(%p)->(IID_IHTMLButtonElement %p)\n", This, ppv);
1763         *ppv = &This->IHTMLButtonElement_iface;
1764     }else {
1765         return HTMLElement_QI(&This->element.node, riid, ppv);
1766     }
1767 
1768     IUnknown_AddRef((IUnknown*)*ppv);
1769     return S_OK;
1770 }
1771 
1772 static HRESULT HTMLButtonElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
1773 {
1774     HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
1775     return IHTMLButtonElement_put_disabled(&This->IHTMLButtonElement_iface, v);
1776 }
1777 
1778 static HRESULT HTMLButtonElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
1779 {
1780     HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
1781     return IHTMLButtonElement_get_disabled(&This->IHTMLButtonElement_iface, p);
1782 }
1783 
1784 static BOOL HTMLButtonElement_is_text_edit(HTMLDOMNode *iface)
1785 {
1786     return TRUE;
1787 }
1788 
1789 static void HTMLButtonElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
1790 {
1791     HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
1792 
1793     if(This->nsbutton)
1794         note_cc_edge((nsISupports*)This->nsbutton, "This->nsbutton", cb);
1795 }
1796 
1797 static void HTMLButtonElement_unlink(HTMLDOMNode *iface)
1798 {
1799     HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
1800 
1801     if(This->nsbutton) {
1802         nsIDOMHTMLButtonElement *nsbutton = This->nsbutton;
1803 
1804         This->nsbutton = NULL;
1805         nsIDOMHTMLButtonElement_Release(nsbutton);
1806     }
1807 }
1808 
1809 static const NodeImplVtbl HTMLButtonElementImplVtbl = {
1810     HTMLButtonElement_QI,
1811     HTMLElement_destructor,
1812     HTMLElement_cpc,
1813     HTMLElement_clone,
1814     HTMLElement_handle_event,
1815     HTMLElement_get_attr_col,
1816     NULL,
1817     NULL,
1818     HTMLButtonElementImpl_put_disabled,
1819     HTMLButtonElementImpl_get_disabled,
1820     NULL,
1821     NULL,
1822     NULL,
1823     NULL,
1824     NULL,
1825     HTMLButtonElement_traverse,
1826     HTMLButtonElement_unlink,
1827     HTMLButtonElement_is_text_edit
1828 };
1829 
1830 static const tid_t HTMLButtonElement_iface_tids[] = {
1831     HTMLELEMENT_TIDS,
1832     IHTMLButtonElement_tid,
1833     0
1834 };
1835 
1836 static dispex_static_data_t HTMLButtonElement_dispex = {
1837     NULL,
1838     DispHTMLButtonElement_tid,
1839     NULL,
1840     HTMLButtonElement_iface_tids
1841 };
1842 
1843 HRESULT HTMLButtonElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
1844 {
1845     HTMLButtonElement *ret;
1846     nsresult nsres;
1847 
1848     ret = heap_alloc_zero(sizeof(*ret));
1849     if(!ret)
1850         return E_OUTOFMEMORY;
1851 
1852     ret->IHTMLButtonElement_iface.lpVtbl = &HTMLButtonElementVtbl;
1853     ret->element.node.vtbl = &HTMLButtonElementImplVtbl;
1854 
1855     HTMLElement_Init(&ret->element, doc, nselem, &HTMLButtonElement_dispex);
1856 
1857     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLButtonElement, (void**)&ret->nsbutton);
1858     assert(nsres == NS_OK);
1859 
1860     *elem = &ret->element;
1861     return S_OK;
1862 }
1863