From 9a9c5f9cdfbe890bd60acc6f2faa79eb3b38a64f Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Fri, 20 Nov 2009 16:21:54 -0600 Subject: [PATCH] mshtml: Also get dispid by element name & id in HTMLElementCollection. --- dlls/mshtml/htmlelemcol.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index 70827bcd8e9..c9737077382 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -205,6 +205,26 @@ static HRESULT WINAPI HTMLElementCollection_get__newEnum(IHTMLElementCollection return E_NOTIMPL; } +static BOOL is_elem_id(HTMLElement *elem, LPCWSTR name) +{ + BSTR elem_id; + HRESULT hres; + + hres = IHTMLElement_get_id(HTMLELEM(elem), &elem_id); + if(FAILED(hres)){ + WARN("IHTMLElement_get_id failed: 0x%08x\n", hres); + return FALSE; + } + + if(elem_id && !strcmpW(elem_id, name)) { + SysFreeString(elem_id); + return TRUE; + } + + SysFreeString(elem_id); + return FALSE; +} + static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name) { const PRUnichar *str; @@ -376,7 +396,16 @@ static HRESULT HTMLElementCollection_get_dispid(IUnknown *iface, BSTR name, DWOR for(ptr = name; *ptr && isdigitW(*ptr); ptr++) idx = idx*10 + (*ptr-'0'); - if(*ptr || idx >= This->len) + if(*ptr) { + /* the name contains alpha characters, so search by name & id */ + for(idx = 0; idx < This->len; ++idx) { + if(is_elem_id(This->elems[idx], name) || + is_elem_name(This->elems[idx], name)) + break; + } + } + + if(idx >= This->len) return DISP_E_UNKNOWNNAME; *dispid = DISPID_ELEMCOL_0 + idx;