mshtml: Moved getting select's option element by index to separated function.

This commit is contained in:
Jacek Caban 2010-05-11 17:57:27 +02:00 committed by Alexandre Julliard
parent 061fee45c0
commit b52bdff841
1 changed files with 44 additions and 27 deletions

View File

@ -42,6 +42,43 @@ typedef struct {
#define HTMLSELECT(x) ((IHTMLSelectElement*) &(x)->lpHTMLSelectElementVtbl)
static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret)
{
nsIDOMHTMLOptionsCollection *nscol;
nsIDOMNode *nsnode;
nsresult nsres;
nsres = nsIDOMHTMLSelectElement_GetOptions(This->nsselect, &nscol);
if(NS_FAILED(nsres)) {
ERR("GetOptions failed: %08x\n", nsres);
return E_FAIL;
}
nsres = nsIDOMHTMLOptionsCollection_Item(nscol, i, &nsnode);
nsIDOMHTMLOptionsCollection_Release(nscol);
if(NS_FAILED(nsres)) {
ERR("Item failed: %08x\n", nsres);
return E_FAIL;
}
if(nsnode) {
HTMLDOMNode *node;
node = get_node(This->element.node.doc, nsnode, TRUE);
nsIDOMNode_Release(nsnode);
if(!node) {
ERR("Could not find node\n");
return E_FAIL;
}
IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
*ret = (IDispatch*)HTMLDOMNODE(node);
}else {
*ret = NULL;
}
return S_OK;
}
#define HTMLSELECT_THIS(iface) DEFINE_THIS(HTMLSelectElement, HTMLSelectElement, iface)
static HRESULT WINAPI HTMLSelectElement_QueryInterface(IHTMLSelectElement *iface,
@ -534,36 +571,16 @@ static HRESULT HTMLSelectElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid
switch(flags) {
case DISPATCH_PROPERTYGET: {
nsIDOMHTMLOptionsCollection *nscol;
nsIDOMNode *nsnode;
nsresult nsres;
IDispatch *ret;
HRESULT hres;
nsres = nsIDOMHTMLSelectElement_GetOptions(This->nsselect, &nscol);
if(NS_FAILED(nsres)) {
ERR("GetOptions failed: %08x\n", nsres);
return E_FAIL;
}
hres = htmlselect_item(This, id-DISPID_OPTIONCOL_0, &ret);
if(FAILED(hres))
return hres;
nsres = nsIDOMHTMLOptionsCollection_Item(nscol, id-DISPID_OPTIONCOL_0, &nsnode);
nsIDOMHTMLOptionsCollection_Release(nscol);
if(NS_FAILED(nsres)) {
ERR("Item failed: %08x\n", nsres);
return E_FAIL;
}
if(nsnode) {
HTMLDOMNode *node;
node = get_node(This->element.node.doc, nsnode, TRUE);
nsIDOMNode_Release(nsnode);
if(!node) {
ERR("Could not find node\n");
return E_FAIL;
}
IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
if(ret) {
V_VT(res) = VT_DISPATCH;
V_DISPATCH(res) = (IDispatch*)HTMLDOMNODE(node);
V_DISPATCH(res) = ret;
}else {
V_VT(res) = VT_NULL;
}