diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index d6dfff9aaf9..296de7319b4 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Jacek Caban for CodeWeavers + * Copyright 2007-2011 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -225,6 +225,12 @@ static const IID * const text_iids[] = { NULL }; +static const IID * const attr_iids[] = { + &IID_IHTMLDOMAttribute, + &IID_IDispatchEx, + NULL +}; + static const IID * const location_iids[] = { &IID_IDispatch, &IID_IHTMLLocation, @@ -468,6 +474,18 @@ static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids) } } +#define test_no_iface(a,b) _test_no_iface(__LINE__,a,b) +static void _test_no_iface(unsigned line, IUnknown *iface, REFIID iid) +{ + IUnknown *unk; + HRESULT hres; + + unk = (void*)0xdeadbeef; + hres = IUnknown_QueryInterface(iface, iid, (void**)&unk); + ok_(__FILE__,line)(hres == E_NOINTERFACE, "hres = %08x, expected E_NOINTERFACE\n", hres); + ok_(__FILE__,line)(!unk, "unk = %p\n", unk); +} + #define test_get_dispid(u,id) _test_get_dispid(__LINE__,u,id) static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid) { @@ -589,6 +607,17 @@ static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk) return elem; } +#define get_elem4_iface(u) _get_elem4_iface(__LINE__,u) +static IHTMLElement4 *_get_elem4_iface(unsigned line, IUnknown *unk) +{ + IHTMLElement4 *elem; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement4, (void**)&elem); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement4: %08x\n", hres); + return elem; +} + #define get_node_iface(u) _get_node_iface(__LINE__,u) static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk) { @@ -2795,6 +2824,27 @@ static IHTMLDocument2 *_get_elem_doc(unsigned line, IUnknown *unk) return doc; } +#define get_elem_attr_node(a,b,c) _get_elem_attr_node(__LINE__,a,b,c) +static IHTMLDOMAttribute *_get_elem_attr_node(unsigned line, IUnknown *unk, const char *attr_name, BOOL expect_success) +{ + IHTMLElement4 *elem = _get_elem4_iface(line, unk); + BSTR str = a2bstr(attr_name); + IHTMLDOMAttribute *attr; + HRESULT hres; + + attr = (void*)0xdeadbeef; + hres = IHTMLElement4_getAttributeNode(elem, str, &attr); + ok_(__FILE__,line)(hres == S_OK, "getAttributeNode failed: %08x\n", hres); + if(expect_success) + ok_(__FILE__,line)(attr != NULL, "attr = NULL\n"); + else + ok_(__FILE__,line)(!attr, "attr = %p\n", attr); + + IHTMLElement4_Release(elem); + SysFreeString(str); + return attr; +} + #define get_window_doc(e) _get_window_doc(__LINE__,e) static IHTMLDocument2 *_get_window_doc(unsigned line, IHTMLWindow2 *window) { @@ -6584,6 +6634,26 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLWindow2_Release(window); } +static void test_attr(IHTMLElement *elem) +{ + IHTMLDOMAttribute *attr, *attr2; + + get_elem_attr_node((IUnknown*)elem, "noattr", FALSE); + + attr = get_elem_attr_node((IUnknown*)elem, "id", TRUE); + + test_disp((IUnknown*)attr, &DIID_DispHTMLDOMAttribute, "[object]"); + test_ifaces((IUnknown*)attr, attr_iids); + test_no_iface((IUnknown*)attr, &IID_IHTMLDOMNode); + + attr2 = get_elem_attr_node((IUnknown*)elem, "id", TRUE); + todo_wine + ok(iface_cmp((IUnknown*)attr, (IUnknown*)attr2), "attr != attr2\n"); + IHTMLDOMAttribute_Release(attr2); + + IHTMLDOMAttribute_Release(attr); +} + static void test_elems2(IHTMLDocument2 *doc) { IHTMLElement *elem, *elem2, *div; @@ -6642,6 +6712,8 @@ static void test_elems2(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } + test_attr(div); + IHTMLElement_Release(div); }