Jacek Caban : mshtml: Added support for VT_UINT name in IHTMLElementCollection::item.
Alexandre Julliard
julliard at winehq.org
Wed Jul 8 14:35:53 CDT 2009
Module: wine
Branch: master
Commit: cf2e8619ef12295daa148c71085e67aa322739ea
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf2e8619ef12295daa148c71085e67aa322739ea
Author: Jacek Caban <jacek at 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);
More information about the wine-cvs
mailing list