2 * Copyright 2006 Jacek Caban for CodeWeavers
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.
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.
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
19 #include "mshtml_private.h"
24 IHTMLSelectElement IHTMLSelectElement_iface
;
26 nsIDOMHTMLSelectElement
*nsselect
;
29 static inline HTMLSelectElement
*impl_from_IHTMLSelectElement(IHTMLSelectElement
*iface
)
31 return CONTAINING_RECORD(iface
, HTMLSelectElement
, IHTMLSelectElement_iface
);
34 static HRESULT
htmlselect_item(HTMLSelectElement
*This
, int i
, IDispatch
**ret
)
36 nsIDOMHTMLOptionsCollection
*nscol
;
41 nsres
= nsIDOMHTMLSelectElement_GetOptions(This
->nsselect
, &nscol
);
42 if(NS_FAILED(nsres
)) {
43 ERR("GetOptions failed: %08x\n", nsres
);
47 nsres
= nsIDOMHTMLOptionsCollection_Item(nscol
, i
, &nsnode
);
48 nsIDOMHTMLOptionsCollection_Release(nscol
);
49 if(NS_FAILED(nsres
)) {
50 ERR("Item failed: %08x\n", nsres
);
57 hres
= get_node(This
->element
.node
.doc
, nsnode
, TRUE
, &node
);
58 nsIDOMNode_Release(nsnode
);
62 *ret
= (IDispatch
*)&node
->IHTMLDOMNode_iface
;
69 static HRESULT WINAPI
HTMLSelectElement_QueryInterface(IHTMLSelectElement
*iface
,
70 REFIID riid
, void **ppv
)
72 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
74 return IHTMLDOMNode_QueryInterface(&This
->element
.node
.IHTMLDOMNode_iface
, riid
, ppv
);
77 static ULONG WINAPI
HTMLSelectElement_AddRef(IHTMLSelectElement
*iface
)
79 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
81 return IHTMLDOMNode_AddRef(&This
->element
.node
.IHTMLDOMNode_iface
);
84 static ULONG WINAPI
HTMLSelectElement_Release(IHTMLSelectElement
*iface
)
86 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
88 return IHTMLDOMNode_Release(&This
->element
.node
.IHTMLDOMNode_iface
);
91 static HRESULT WINAPI
HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement
*iface
, UINT
*pctinfo
)
93 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
95 return IDispatchEx_GetTypeInfoCount(&This
->element
.node
.event_target
.dispex
.IDispatchEx_iface
, pctinfo
);
98 static HRESULT WINAPI
HTMLSelectElement_GetTypeInfo(IHTMLSelectElement
*iface
, UINT iTInfo
,
99 LCID lcid
, ITypeInfo
**ppTInfo
)
101 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
103 return IDispatchEx_GetTypeInfo(&This
->element
.node
.event_target
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
,
107 static HRESULT WINAPI
HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement
*iface
, REFIID riid
,
108 LPOLESTR
*rgszNames
, UINT cNames
,
109 LCID lcid
, DISPID
*rgDispId
)
111 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
113 return IDispatchEx_GetIDsOfNames(&This
->element
.node
.event_target
.dispex
.IDispatchEx_iface
, riid
, rgszNames
,
114 cNames
, lcid
, rgDispId
);
117 static HRESULT WINAPI
HTMLSelectElement_Invoke(IHTMLSelectElement
*iface
, DISPID dispIdMember
,
118 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
119 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
121 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
123 return IDispatchEx_Invoke(&This
->element
.node
.event_target
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
124 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
127 static HRESULT WINAPI
HTMLSelectElement_put_size(IHTMLSelectElement
*iface
, LONG v
)
129 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
132 TRACE("(%p)->(%d)\n", This
, v
);
134 return CTL_E_INVALIDPROPERTYVALUE
;
136 nsres
= nsIDOMHTMLSelectElement_SetSize(This
->nsselect
, v
);
137 if(NS_FAILED(nsres
)) {
138 ERR("SetSize failed: %08x\n", nsres
);
144 static HRESULT WINAPI
HTMLSelectElement_get_size(IHTMLSelectElement
*iface
, LONG
*p
)
146 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
150 TRACE("(%p)->(%p)\n", This
, p
);
154 nsres
= nsIDOMHTMLSelectElement_GetSize(This
->nsselect
, &val
);
155 if(NS_FAILED(nsres
)) {
156 ERR("GetSize failed: %08x\n", nsres
);
163 static HRESULT WINAPI
HTMLSelectElement_put_multiple(IHTMLSelectElement
*iface
, VARIANT_BOOL v
)
165 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
168 TRACE("(%p)->(%x)\n", This
, v
);
170 nsres
= nsIDOMHTMLSelectElement_SetMultiple(This
->nsselect
, !!v
);
171 assert(nsres
== NS_OK
);
175 static HRESULT WINAPI
HTMLSelectElement_get_multiple(IHTMLSelectElement
*iface
, VARIANT_BOOL
*p
)
177 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
181 TRACE("(%p)->(%p)\n", This
, p
);
183 nsres
= nsIDOMHTMLSelectElement_GetMultiple(This
->nsselect
, &val
);
184 assert(nsres
== NS_OK
);
186 *p
= val
? VARIANT_TRUE
: VARIANT_FALSE
;
190 static HRESULT WINAPI
HTMLSelectElement_put_name(IHTMLSelectElement
*iface
, BSTR v
)
192 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
196 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
197 nsAString_InitDepend(&str
, v
);
198 nsres
= nsIDOMHTMLSelectElement_SetName(This
->nsselect
, &str
);
199 nsAString_Finish(&str
);
201 if(NS_FAILED(nsres
)) {
202 ERR("SetName failed: %08x\n", nsres
);
208 static HRESULT WINAPI
HTMLSelectElement_get_name(IHTMLSelectElement
*iface
, BSTR
*p
)
210 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
214 TRACE("(%p)->(%p)\n", This
, p
);
216 nsAString_Init(&name_str
, NULL
);
217 nsres
= nsIDOMHTMLSelectElement_GetName(This
->nsselect
, &name_str
);
219 return return_nsstr(nsres
, &name_str
, p
);
222 static HRESULT WINAPI
HTMLSelectElement_get_options(IHTMLSelectElement
*iface
, IDispatch
**p
)
224 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
226 TRACE("(%p)->(%p)\n", This
, p
);
228 *p
= (IDispatch
*)&This
->IHTMLSelectElement_iface
;
229 IDispatch_AddRef(*p
);
233 static HRESULT WINAPI
HTMLSelectElement_put_onchange(IHTMLSelectElement
*iface
, VARIANT v
)
235 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
237 TRACE("(%p)->()\n", This
);
239 return set_node_event(&This
->element
.node
, EVENTID_CHANGE
, &v
);
242 static HRESULT WINAPI
HTMLSelectElement_get_onchange(IHTMLSelectElement
*iface
, VARIANT
*p
)
244 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
245 FIXME("(%p)->(%p)\n", This
, p
);
249 static HRESULT WINAPI
HTMLSelectElement_put_selectedIndex(IHTMLSelectElement
*iface
, LONG v
)
251 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
254 TRACE("(%p)->(%d)\n", This
, v
);
256 nsres
= nsIDOMHTMLSelectElement_SetSelectedIndex(This
->nsselect
, v
);
258 ERR("SetSelectedIndex failed: %08x\n", nsres
);
263 static HRESULT WINAPI
HTMLSelectElement_get_selectedIndex(IHTMLSelectElement
*iface
, LONG
*p
)
265 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
268 TRACE("(%p)->(%p)\n", This
, p
);
270 nsres
= nsIDOMHTMLSelectElement_GetSelectedIndex(This
->nsselect
, p
);
271 if(NS_FAILED(nsres
)) {
272 ERR("GetSelectedIndex failed: %08x\n", nsres
);
279 static HRESULT WINAPI
HTMLSelectElement_get_type(IHTMLSelectElement
*iface
, BSTR
*p
)
281 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
285 TRACE("(%p)->(%p)\n", This
, p
);
287 nsAString_Init(&type_str
, NULL
);
288 nsres
= nsIDOMHTMLSelectElement_GetType(This
->nsselect
, &type_str
);
289 return return_nsstr(nsres
, &type_str
, p
);
292 static HRESULT WINAPI
HTMLSelectElement_put_value(IHTMLSelectElement
*iface
, BSTR v
)
294 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
298 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
300 nsAString_InitDepend(&value_str
, v
);
301 nsres
= nsIDOMHTMLSelectElement_SetValue(This
->nsselect
, &value_str
);
302 nsAString_Finish(&value_str
);
304 ERR("SetValue failed: %08x\n", nsres
);
309 static HRESULT WINAPI
HTMLSelectElement_get_value(IHTMLSelectElement
*iface
, BSTR
*p
)
311 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
315 TRACE("(%p)->(%p)\n", This
, p
);
317 nsAString_Init(&value_str
, NULL
);
318 nsres
= nsIDOMHTMLSelectElement_GetValue(This
->nsselect
, &value_str
);
319 return return_nsstr(nsres
, &value_str
, p
);
322 static HRESULT WINAPI
HTMLSelectElement_put_disabled(IHTMLSelectElement
*iface
, VARIANT_BOOL v
)
324 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
327 TRACE("(%p)->(%x)\n", This
, v
);
329 nsres
= nsIDOMHTMLSelectElement_SetDisabled(This
->nsselect
, v
!= VARIANT_FALSE
);
330 if(NS_FAILED(nsres
)) {
331 ERR("SetDisabled failed: %08x\n", nsres
);
338 static HRESULT WINAPI
HTMLSelectElement_get_disabled(IHTMLSelectElement
*iface
, VARIANT_BOOL
*p
)
340 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
341 cpp_bool disabled
= FALSE
;
344 TRACE("(%p)->(%p)\n", This
, p
);
346 nsres
= nsIDOMHTMLSelectElement_GetDisabled(This
->nsselect
, &disabled
);
347 if(NS_FAILED(nsres
)) {
348 ERR("GetDisabled failed: %08x\n", nsres
);
352 *p
= disabled
? VARIANT_TRUE
: VARIANT_FALSE
;
356 static HRESULT WINAPI
HTMLSelectElement_get_form(IHTMLSelectElement
*iface
, IHTMLFormElement
**p
)
358 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
359 nsIDOMHTMLFormElement
*nsform
;
360 nsIDOMNode
*form_node
;
365 TRACE("(%p)->(%p)\n", This
, p
);
370 nsres
= nsIDOMHTMLSelectElement_GetForm(This
->nsselect
, &nsform
);
371 if (NS_FAILED(nsres
)) {
372 ERR("GetForm failed: %08x, nsform: %p\n", nsres
, nsform
);
376 if (nsform
== NULL
) {
377 TRACE("nsform not found\n");
382 nsres
= nsIDOMHTMLFormElement_QueryInterface(nsform
, &IID_nsIDOMNode
, (void**)&form_node
);
383 nsIDOMHTMLFormElement_Release(nsform
);
384 assert(nsres
== NS_OK
);
386 hres
= get_node(This
->element
.node
.doc
, form_node
, TRUE
, &node
);
387 nsIDOMNode_Release(form_node
);
391 hres
= IHTMLDOMNode_QueryInterface(&node
->IHTMLDOMNode_iface
, &IID_IHTMLElement
, (void**)p
);
397 static HRESULT WINAPI
HTMLSelectElement_add(IHTMLSelectElement
*iface
, IHTMLElement
*element
,
400 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
401 nsIWritableVariant
*nsvariant
;
402 HTMLElement
*element_obj
;
405 TRACE("(%p)->(%p %s)\n", This
, element
, debugstr_variant(&before
));
407 element_obj
= unsafe_impl_from_IHTMLElement(element
);
409 FIXME("External IHTMLElement implementation?\n");
413 nsvariant
= create_nsvariant();
417 switch(V_VT(&before
)) {
420 nsres
= nsIWritableVariant_SetAsEmpty(nsvariant
);
423 nsres
= nsIWritableVariant_SetAsInt16(nsvariant
, V_I2(&before
));
426 FIXME("unhandled before %s\n", debugstr_variant(&before
));
427 nsIWritableVariant_Release(nsvariant
);
431 if(NS_SUCCEEDED(nsres
))
432 nsres
= nsIDOMHTMLSelectElement_Add(This
->nsselect
, element_obj
->nselem
, (nsIVariant
*)nsvariant
);
433 nsIWritableVariant_Release(nsvariant
);
434 if(NS_FAILED(nsres
)) {
435 ERR("Add failed: %08x\n", nsres
);
442 static HRESULT WINAPI
HTMLSelectElement_remove(IHTMLSelectElement
*iface
, LONG index
)
444 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
446 TRACE("(%p)->(%d)\n", This
, index
);
450 nsres
= nsIDOMHTMLSelectElement_select_Remove(This
->nsselect
, index
);
451 if(NS_FAILED(nsres
)) {
452 ERR("Remove failed: %08x\n", nsres
);
458 static HRESULT WINAPI
HTMLSelectElement_put_length(IHTMLSelectElement
*iface
, LONG v
)
460 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
463 TRACE("(%p)->(%d)\n", This
, v
);
465 nsres
= nsIDOMHTMLSelectElement_SetLength(This
->nsselect
, v
);
467 ERR("SetLength failed: %08x\n", nsres
);
472 static HRESULT WINAPI
HTMLSelectElement_get_length(IHTMLSelectElement
*iface
, LONG
*p
)
474 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
478 TRACE("(%p)->(%p)\n", This
, p
);
480 nsres
= nsIDOMHTMLSelectElement_GetLength(This
->nsselect
, &length
);
482 ERR("GetLength failed: %08x\n", nsres
);
486 TRACE("ret %d\n", *p
);
490 static HRESULT WINAPI
HTMLSelectElement_get__newEnum(IHTMLSelectElement
*iface
, IUnknown
**p
)
492 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
493 FIXME("(%p)->(%p)\n", This
, p
);
497 static HRESULT WINAPI
HTMLSelectElement_item(IHTMLSelectElement
*iface
, VARIANT name
,
498 VARIANT index
, IDispatch
**pdisp
)
500 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
502 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_variant(&name
), debugstr_variant(&index
), pdisp
);
508 if(V_VT(&name
) == VT_I4
) {
511 return htmlselect_item(This
, V_I4(&name
), pdisp
);
514 FIXME("Unsupported args\n");
518 static HRESULT WINAPI
HTMLSelectElement_tags(IHTMLSelectElement
*iface
, VARIANT tagName
,
521 HTMLSelectElement
*This
= impl_from_IHTMLSelectElement(iface
);
522 FIXME("(%p)->(v %p)\n", This
, pdisp
);
526 static const IHTMLSelectElementVtbl HTMLSelectElementVtbl
= {
527 HTMLSelectElement_QueryInterface
,
528 HTMLSelectElement_AddRef
,
529 HTMLSelectElement_Release
,
530 HTMLSelectElement_GetTypeInfoCount
,
531 HTMLSelectElement_GetTypeInfo
,
532 HTMLSelectElement_GetIDsOfNames
,
533 HTMLSelectElement_Invoke
,
534 HTMLSelectElement_put_size
,
535 HTMLSelectElement_get_size
,
536 HTMLSelectElement_put_multiple
,
537 HTMLSelectElement_get_multiple
,
538 HTMLSelectElement_put_name
,
539 HTMLSelectElement_get_name
,
540 HTMLSelectElement_get_options
,
541 HTMLSelectElement_put_onchange
,
542 HTMLSelectElement_get_onchange
,
543 HTMLSelectElement_put_selectedIndex
,
544 HTMLSelectElement_get_selectedIndex
,
545 HTMLSelectElement_get_type
,
546 HTMLSelectElement_put_value
,
547 HTMLSelectElement_get_value
,
548 HTMLSelectElement_put_disabled
,
549 HTMLSelectElement_get_disabled
,
550 HTMLSelectElement_get_form
,
551 HTMLSelectElement_add
,
552 HTMLSelectElement_remove
,
553 HTMLSelectElement_put_length
,
554 HTMLSelectElement_get_length
,
555 HTMLSelectElement_get__newEnum
,
556 HTMLSelectElement_item
,
557 HTMLSelectElement_tags
560 static inline HTMLSelectElement
*impl_from_HTMLDOMNode(HTMLDOMNode
*iface
)
562 return CONTAINING_RECORD(iface
, HTMLSelectElement
, element
.node
);
565 static HRESULT
HTMLSelectElement_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
567 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
571 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
572 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
573 *ppv
= &This
->IHTMLSelectElement_iface
;
574 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
575 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
576 *ppv
= &This
->IHTMLSelectElement_iface
;
577 }else if(IsEqualGUID(&IID_IHTMLSelectElement
, riid
)) {
578 TRACE("(%p)->(IID_IHTMLSelectElement %p)\n", This
, ppv
);
579 *ppv
= &This
->IHTMLSelectElement_iface
;
583 IUnknown_AddRef((IUnknown
*)*ppv
);
587 return HTMLElement_QI(&This
->element
.node
, riid
, ppv
);
590 static HRESULT
HTMLSelectElementImpl_put_disabled(HTMLDOMNode
*iface
, VARIANT_BOOL v
)
592 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
593 return IHTMLSelectElement_put_disabled(&This
->IHTMLSelectElement_iface
, v
);
596 static HRESULT
HTMLSelectElementImpl_get_disabled(HTMLDOMNode
*iface
, VARIANT_BOOL
*p
)
598 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
599 return IHTMLSelectElement_get_disabled(&This
->IHTMLSelectElement_iface
, p
);
602 #define DISPID_OPTIONCOL_0 MSHTML_DISPID_CUSTOM_MIN
604 static HRESULT
HTMLSelectElement_get_dispid(HTMLDOMNode
*iface
, BSTR name
, DWORD flags
, DISPID
*dispid
)
609 for(ptr
= name
; *ptr
&& isdigitW(*ptr
); ptr
++) {
610 idx
= idx
*10 + (*ptr
-'0');
611 if(idx
> MSHTML_CUSTOM_DISPID_CNT
) {
612 WARN("too big idx\n");
613 return DISP_E_UNKNOWNNAME
;
617 return DISP_E_UNKNOWNNAME
;
619 *dispid
= DISPID_OPTIONCOL_0
+ idx
;
623 static HRESULT
HTMLSelectElement_invoke(HTMLDOMNode
*iface
, DISPID id
, LCID lcid
, WORD flags
, DISPPARAMS
*params
,
624 VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
626 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
628 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This
, id
, lcid
, flags
, params
, res
, ei
, caller
);
631 case DISPATCH_PROPERTYGET
: {
635 hres
= htmlselect_item(This
, id
-DISPID_OPTIONCOL_0
, &ret
);
640 V_VT(res
) = VT_DISPATCH
;
641 V_DISPATCH(res
) = ret
;
649 FIXME("unimplemented flags %x\n", flags
);
656 static void HTMLSelectElement_traverse(HTMLDOMNode
*iface
, nsCycleCollectionTraversalCallback
*cb
)
658 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
661 note_cc_edge((nsISupports
*)This
->nsselect
, "This->nsselect", cb
);
664 static void HTMLSelectElement_unlink(HTMLDOMNode
*iface
)
666 HTMLSelectElement
*This
= impl_from_HTMLDOMNode(iface
);
669 nsIDOMHTMLSelectElement
*nsselect
= This
->nsselect
;
671 This
->nsselect
= NULL
;
672 nsIDOMHTMLSelectElement_Release(nsselect
);
676 static const NodeImplVtbl HTMLSelectElementImplVtbl
= {
677 HTMLSelectElement_QI
,
678 HTMLElement_destructor
,
681 HTMLElement_handle_event
,
682 HTMLElement_get_attr_col
,
685 HTMLSelectElementImpl_put_disabled
,
686 HTMLSelectElementImpl_get_disabled
,
689 HTMLSelectElement_get_dispid
,
690 HTMLSelectElement_invoke
,
692 HTMLSelectElement_traverse
,
693 HTMLSelectElement_unlink
696 static const tid_t HTMLSelectElement_tids
[] = {
698 IHTMLSelectElement_tid
,
702 static dispex_static_data_t HTMLSelectElement_dispex
= {
704 DispHTMLSelectElement_tid
,
706 HTMLSelectElement_tids
709 HRESULT
HTMLSelectElement_Create(HTMLDocumentNode
*doc
, nsIDOMHTMLElement
*nselem
, HTMLElement
**elem
)
711 HTMLSelectElement
*ret
;
714 ret
= heap_alloc_zero(sizeof(HTMLSelectElement
));
716 return E_OUTOFMEMORY
;
718 ret
->IHTMLSelectElement_iface
.lpVtbl
= &HTMLSelectElementVtbl
;
719 ret
->element
.node
.vtbl
= &HTMLSelectElementImplVtbl
;
721 HTMLElement_Init(&ret
->element
, doc
, nselem
, &HTMLSelectElement_dispex
);
723 nsres
= nsIDOMHTMLElement_QueryInterface(nselem
, &IID_nsIDOMHTMLSelectElement
,
724 (void**)&ret
->nsselect
);
725 assert(nsres
== NS_OK
);
727 *elem
= &ret
->element
;