Module: wine Branch: master Commit: cf2e8619ef12295daa148c71085e67aa322739ea URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf2e8619ef12295daa148c7108...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 7 21:01:19 2009 +0200
mshtml: Added support for VT_UINT name in IHTMLElementCollection::item.
---
dlls/mshtml/htmlelemcol.c | 51 +++++++++++++++++++++++++------------------- dlls/mshtml/tests/dom.c | 18 ++++++++++++++- 2 files changed, 45 insertions(+), 24 deletions(-)
diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index 049da58..4362890 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -236,39 +236,43 @@ static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name) return ret; }
+static HRESULT get_item_idx(HTMLElementCollection *This, UINT idx, IDispatch **ret) +{ + if(idx < This->len) { + *ret = (IDispatch*)This->elems[idx]; + IDispatch_AddRef(*ret); + } + + return S_OK; +} + static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface, VARIANT name, VARIANT index, IDispatch **pdisp) { HTMLElementCollection *This = ELEMCOL_THIS(iface); + HRESULT hres = S_OK;
- TRACE("(%p)->(v(%d) v(%d) %p)\n", This, V_VT(&name), V_VT(&index), pdisp); + TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
*pdisp = NULL;
- if(V_VT(&name) == VT_I4) { - TRACE("name is VT_I4: %d\n", V_I4(&name)); - + switch(V_VT(&name)) { + case VT_I4: if(V_I4(&name) < 0) return E_INVALIDARG; - if(V_I4(&name) >= This->len) - return S_OK; + hres = get_item_idx(This, V_I4(&name), pdisp); + break;
- *pdisp = (IDispatch*)This->elems[V_I4(&name)]; - IDispatch_AddRef(*pdisp); - TRACE("Returning pdisp=%p\n", pdisp); - return S_OK; - } + case VT_UINT: + hres = get_item_idx(This, V_UINT(&name), pdisp); + break;
- if(V_VT(&name) == VT_BSTR) { + case VT_BSTR: { DWORD i;
- TRACE("name is VT_BSTR: %s\n", debugstr_w(V_BSTR(&name))); - if(V_VT(&index) == VT_I4) { LONG idx = V_I4(&index);
- TRACE("index = %d\n", idx); - if(idx < 0) return E_INVALIDARG;
@@ -281,8 +285,6 @@ static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface, *pdisp = (IDispatch*)HTMLELEM(This->elems[i]); IDispatch_AddRef(*pdisp); } - - return S_OK; }else { elem_vector_t buf = {NULL, 0, 8};
@@ -304,13 +306,18 @@ static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface,
heap_free(buf.buf); } - - return S_OK; } + break; + } + + default: + FIXME("Unsupported name %s\n", debugstr_variant(&name)); + hres = E_NOTIMPL; }
- FIXME("unsupported arguments\n"); - return E_INVALIDARG; + if(SUCCEEDED(hres)) + TRACE("returning %p\n", *pdisp); + return hres; }
static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface, diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index cb25926..a153a14 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -1025,7 +1025,7 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, LONG len; DWORD i; VARIANT name, index; - IDispatch *disp; + IDispatch *disp, *disp2; HRESULT hres;
hres = IUnknown_QueryInterface(unk, &IID_IHTMLElementCollection, (void**)&col); @@ -1041,9 +1041,9 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, len = exlen;
V_VT(&index) = VT_EMPTY; - V_VT(&name) = VT_I4;
for(i=0; i<len; i++) { + V_VT(&name) = VT_I4; V_I4(&name) = i; disp = (void*)0xdeadbeef; hres = IHTMLElementCollection_item(col, name, index, &disp); @@ -1053,15 +1053,29 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, continue;
_test_elem_type(line, (IUnknown*)disp, elem_types[i]); + + if(!i) { + V_VT(&name) = VT_UINT; + V_I4(&name) = 0; + disp2 = (void*)0xdeadbeef; + hres = IHTMLElementCollection_item(col, name, index, &disp2); + ok_(__FILE__,line) (hres == S_OK, "item(%d) failed: %08x\n", i, hres); + ok_(__FILE__,line) (iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n"); + if(disp2) + IDispatch_Release(disp2); + } + IDispatch_Release(disp); }
+ V_VT(&name) = VT_I4; V_I4(&name) = len; disp = (void*)0xdeadbeef; hres = IHTMLElementCollection_item(col, name, index, &disp); ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres); ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
+ V_VT(&name) = VT_I4; V_I4(&name) = -1; disp = (void*)0xdeadbeef; hres = IHTMLElementCollection_item(col, name, index, &disp);