From 072852ede06261aba7009ef5f0d9e26385352931 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 7 Oct 2013 14:23:51 +0000 Subject: [PATCH] [MSHTML_WINETEST] * Sync with Wine 1.7.1. CORE-7469 svn path=/trunk/; revision=60579 --- rostests/winetests/mshtml/CMakeLists.txt | 2 - rostests/winetests/mshtml/dom.c | 393 +++++++++++++++++-- rostests/winetests/mshtml/htmldoc.c | 462 +++++++++++++++++++++-- rostests/winetests/mshtml/jstest.html | 37 ++ rostests/winetests/mshtml/protocol.c | 39 +- rostests/winetests/mshtml/rsrc.rc | 8 + rostests/winetests/mshtml/script.c | 2 + rostests/winetests/mshtml/style.c | 42 ++- rostests/winetests/mshtml/testlist.c | 2 +- 9 files changed, 926 insertions(+), 61 deletions(-) diff --git a/rostests/winetests/mshtml/CMakeLists.txt b/rostests/winetests/mshtml/CMakeLists.txt index c387d0288cd..478684c7563 100644 --- a/rostests/winetests/mshtml/CMakeLists.txt +++ b/rostests/winetests/mshtml/CMakeLists.txt @@ -1,6 +1,4 @@ -add_definitions(-D__ROS_LONG64__) - add_idl_Headers(test_tlb_header test_tlb.idl) add_typelib(test_tlb.idl) diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index 4791d0622df..689578561ae 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -781,6 +781,17 @@ static IHTMLDOMNode2 *_get_node2_iface(unsigned line, IUnknown *unk) return node; } +#define get_htmldoc5_iface(u) _get_htmldoc5_iface(__LINE__,u) +static IHTMLDocument5 *_get_htmldoc5_iface(unsigned line, IUnknown *unk) +{ + IHTMLDocument5 *doc; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument5, (void**)&doc); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument5: %08x\n", hres); + return doc; +} + #define get_img_iface(u) _get_img_iface(__LINE__,u) static IHTMLImgElement *_get_img_iface(unsigned line, IUnknown *unk) { @@ -913,6 +924,28 @@ static IHTMLIFrameElement2 *_get_iframe2_iface(unsigned line, IUnknown *unk) return ret; } +#define get_button_iface(u) _get_button_iface(__LINE__,u) +static IHTMLButtonElement *_get_button_iface(unsigned line, IUnknown *unk) +{ + IHTMLButtonElement *ret; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLButtonElement, (void**)&ret); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLButtonElement: %08x\n", hres); + return ret; +} + +#define get_label_iface(u) _get_label_iface(__LINE__,u) +static IHTMLLabelElement *_get_label_iface(unsigned line, IUnknown *unk) +{ + IHTMLLabelElement *ret; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLLabelElement, (void**)&ret); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLLabelElement: %08x\n", hres); + return ret; +} + #define test_node_name(u,n) _test_node_name(__LINE__,u,n) static void _test_node_name(unsigned line, IUnknown *unk, const char *exname) { @@ -1330,6 +1363,35 @@ static void _test_anchor_put_href(unsigned line, IUnknown *unk, const char *exhr _test_disp_value(line, unk, exhref); } +#define test_anchor_rel(a,h) _test_anchor_rel(__LINE__,a,h) +static void _test_anchor_rel(unsigned line, IUnknown *unk, const char *exrel) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk); + BSTR str; + HRESULT hres; + + hres = IHTMLAnchorElement_get_rel(anchor, &str); + ok_(__FILE__,line)(hres == S_OK, "get_rel failed: %08x\n", hres); + if(exrel) + ok_(__FILE__,line)(!strcmp_wa(str, exrel), "rel = %s, expected %s\n", wine_dbgstr_w(str), exrel); + else + ok_(__FILE__,line)(!str, "rel = %s, expected NULL\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + +#define test_anchor_put_rel(a,h) _test_anchor_put_rel(__LINE__,a,h) +static void _test_anchor_put_rel(unsigned line, IUnknown *unk, const char *exrel) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk); + BSTR str; + HRESULT hres; + + str = a2bstr(exrel); + hres = IHTMLAnchorElement_put_rel(anchor, str); + ok_(__FILE__,line)(hres == S_OK, "get_rel failed: %08x\n", hres); + SysFreeString(str); +} + #define test_anchor_get_target(a,h) _test_anchor_get_target(__LINE__,a,h) static void _test_anchor_get_target(unsigned line, IUnknown *unk, const char *target) { @@ -1406,6 +1468,22 @@ static void _test_anchor_hostname(unsigned line, IUnknown *unk, const char *host SysFreeString(str); } +#define test_anchor_hash(a,h) _test_anchor_hash(__LINE__,a,h) +static void _test_anchor_hash(unsigned line, IHTMLElement *elem, const char *exhash) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, (IUnknown*)elem); + BSTR str; + HRESULT hres; + + hres = IHTMLAnchorElement_get_hash(anchor, &str); + ok_(__FILE__,line)(hres == S_OK, "get_hash failed: %08x\n", hres); + if(exhash) + ok_(__FILE__,line)(!strcmp_wa(str, exhash), "hash = %s, expected %s\n", wine_dbgstr_w(str), exhash); + else + ok_(__FILE__,line)(!str, "hash = %s, expected NULL\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + #define test_option_text(o,t) _test_option_text(__LINE__,o,t) static void _test_option_text(unsigned line, IHTMLOptionElement *option, const char *text) { @@ -2014,8 +2092,6 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, IDispatch *disp, *disp2; HRESULT hres; - ok(1,"[_test_elem_collection]\n"); - hres = IUnknown_QueryInterface(unk, &IID_IHTMLElementCollection, (void**)&col); ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElementCollection: %08x\n", hres); @@ -2412,6 +2488,33 @@ static void _test_text_length(unsigned line, IUnknown *unk, LONG l) IHTMLDOMTextNode_Release(text); } +#define test_text_data(a,b) _test_text_data(__LINE__,a,b) +static void _test_text_data(unsigned line, IUnknown *unk, const char *exdata) +{ + IHTMLDOMTextNode *text = _get_text_iface(line, unk); + BSTR str; + HRESULT hres; + + hres = IHTMLDOMTextNode_get_data(text, &str); + ok_(__FILE__,line)(hres == S_OK, "get_data failed: %08x\n", hres); + ok_(__FILE__,line)(!strcmp_wa(str, exdata), "data = %s, expected %s\n", wine_dbgstr_w(str), exdata); + IHTMLDOMTextNode_Release(text); + SysFreeString(str); +} + +#define set_text_data(a,b) _set_text_data(__LINE__,a,b) +static void _set_text_data(unsigned line, IUnknown *unk, const char *data) +{ + IHTMLDOMTextNode *text = _get_text_iface(line, unk); + BSTR str = a2bstr(data); + HRESULT hres; + + hres = IHTMLDOMTextNode_put_data(text, str); + ok_(__FILE__,line)(hres == S_OK, "get_data failed: %08x\n", hres); + IHTMLDOMTextNode_Release(text); + SysFreeString(str); +} + #define test_select_set_disabled(i,b) _test_select_set_disabled(__LINE__,i,b) static void _test_select_set_disabled(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL b) { @@ -4469,22 +4572,18 @@ static void test_txtrange2(IHTMLDocument2 *doc) IHTMLTxtRange_Release(range); } -static void test_compatmode(IHTMLDocument2 *doc) +#define test_compatmode(a,b) _test_compatmode(__LINE__,a,b) +static void _test_compatmode(unsigned line, IHTMLDocument2 *doc2, const char *excompat) { - IHTMLDocument5 *doc5; - BSTR mode; + IHTMLDocument5 *doc = get_htmldoc5_iface((IUnknown*)doc2); + BSTR str; HRESULT hres; - hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); - ok(hres == S_OK, "Could not get IHTMLDocument5 interface: %08x\n", hres); - if(FAILED(hres)) - return; + hres = IHTMLDocument5_get_compatMode(doc, &str); + ok_(__FILE__,line)(hres == S_OK, "get_compatMode failed: %08x\n", hres); + ok_(__FILE__,line)(!strcmp_wa(str, excompat), "compatMode = %s, expected %s\n", wine_dbgstr_w(str), excompat); - hres = IHTMLDocument5_get_compatMode(doc5, &mode); - IHTMLDocument5_Release(doc5); - ok(hres == S_OK, "get_compatMode failed: %08x\n", hres); - ok(!strcmp_wa(mode, "BackCompat"), "compatMode=%s\n", wine_dbgstr_w(mode)); - SysFreeString(mode); + IHTMLDocument5_Release(doc); } static void test_location(IHTMLDocument2 *doc) @@ -5304,7 +5403,7 @@ static void test_defaults(IHTMLDocument2 *doc) SysFreeString(str); test_window(doc); - test_compatmode(doc); + test_compatmode(doc, "BackCompat"); test_location(doc); test_navigator(doc); test_plugins_col(doc); @@ -5350,6 +5449,73 @@ static void test_defaults(IHTMLDocument2 *doc) test_doc_title(doc, ""); } +#define test_button_name(a,b) _test_button_name(__LINE__,a,b) +static void _test_button_name(unsigned line, IHTMLElement *elem, const char *exname) +{ + IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem); + BSTR str; + HRESULT hres; + + str = (void*)0xdeadbeef; + hres = IHTMLButtonElement_get_name(button, &str); + ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres); + if(exname) + ok_(__FILE__,line)(!strcmp_wa(str, exname), "name = %s, expected %s\n", wine_dbgstr_w(str), exname); + else + ok_(__FILE__,line)(!str, "name = %s, expected NULL\n", wine_dbgstr_w(str)); + SysFreeString(str); + IHTMLButtonElement_Release(button); +} + +#define set_button_name(a,b) _set_button_name(__LINE__,a,b) +static void _set_button_name(unsigned line, IHTMLElement *elem, const char *name) +{ + IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem); + BSTR str = a2bstr(name); + HRESULT hres; + + hres = IHTMLButtonElement_put_name(button, str); + ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres); + SysFreeString(str); + IHTMLButtonElement_Release(button); + + _test_button_name(line, elem, name); +} + +#define test_button_get_disabled(i,b) _test_button_get_disabled(__LINE__,i,b) +static void _test_button_get_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL exb) +{ + IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem); + VARIANT_BOOL disabled = 100; + HRESULT hres; + + hres = IHTMLButtonElement_get_disabled(button, &disabled); + ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres); + ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb); + IHTMLButtonElement_Release(button); + + _test_elem3_get_disabled(line, (IUnknown*)elem, exb); +} + +#define test_button_set_disabled(i,b) _test_button_set_disabled(__LINE__,i,b) +static void _test_button_set_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL b) +{ + IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem); + HRESULT hres; + + hres = IHTMLButtonElement_put_disabled(button, b); + ok_(__FILE__,line) (hres == S_OK, "put_disabled failed: %08x\n", hres); + IHTMLButtonElement_Release(button); + + _test_button_get_disabled(line, elem, b); +} + +static void test_button_elem(IHTMLElement *elem) +{ + test_button_name(elem, NULL); + set_button_name(elem, "button name"); +} + static void test_tr_elem(IHTMLElement *elem) { IHTMLElementCollection *col; @@ -5374,15 +5540,72 @@ static void test_tr_elem(IHTMLElement *elem) IHTMLTableRow_Release(row); } +static void test_label_elem(IHTMLElement *elem) +{ + IHTMLLabelElement *label; + BSTR str; + HRESULT hres; + + label = get_label_iface((IUnknown*)elem); + + str = NULL; + hres = IHTMLLabelElement_get_htmlFor(label, &str); + ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres); + ok(!strcmp_wa(str, "in"), "htmlFor = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = a2bstr(""); + hres = IHTMLLabelElement_put_htmlFor(label, str); + ok(hres == S_OK, "put_htmlFor failed: %08x\n", hres); + SysFreeString(str); + + str = (void*)0xdeadbeef; + hres = IHTMLLabelElement_get_htmlFor(label, &str); + ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres); + ok(!strcmp_wa(str, ""), "htmlFor = %s\n", wine_dbgstr_w(str)); + + str = a2bstr("abc"); + hres = IHTMLLabelElement_put_htmlFor(label, str); + ok(hres == S_OK, "put_htmlFor failed: %08x\n", hres); + SysFreeString(str); + + str = NULL; + hres = IHTMLLabelElement_get_htmlFor(label, &str); + ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres); + ok(!strcmp_wa(str, "abc"), "htmlFor = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + IHTMLLabelElement_Release(label); +} + +#define test_table_cell_spacing(a,b) _test_table_cell_spacing(__LINE__,a,b) +static void _test_table_cell_spacing(unsigned line, IHTMLTable *table, const char *exstr) +{ + VARIANT v; + HRESULT hres; + + V_VT(&v) = VT_ERROR; + hres = IHTMLTable_get_cellSpacing(table, &v); + ok_(__FILE__,line)(hres == S_OK, "get_cellSpacing failed: %08x\n", hres); + ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + if(exstr) + ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exstr), "cellSpacing = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exstr); + else + ok_(__FILE__,line)(!V_BSTR(&v), "cellSpacing = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); +} + static void test_table_elem(IHTMLElement *elem) { IHTMLElementCollection *col; IHTMLTable *table; IHTMLDOMNode *node; + VARIANT v; HRESULT hres; static const elem_type_t row_types[] = {ET_TR,ET_TR}; static const elem_type_t all_types[] = {ET_TBODY,ET_TR,ET_TR,ET_TD,ET_TD}; + static const elem_type_t tbodies_types[] = {ET_TBODY}; hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLTable, (void**)&table); ok(hres == S_OK, "Could not get IHTMLTable iface: %08x\n", hres); @@ -5392,7 +5615,7 @@ static void test_table_elem(IHTMLElement *elem) col = NULL; hres = IHTMLTable_get_rows(table, &col); ok(hres == S_OK, "get_rows failed: %08x\n", hres); - ok(col != NULL, "get_ros returned NULL\n"); + ok(col != NULL, "get_rows returned NULL\n"); test_elem_collection((IUnknown*)col, row_types, sizeof(row_types)/sizeof(*row_types)); IHTMLElementCollection_Release(col); @@ -5409,6 +5632,29 @@ static void test_table_elem(IHTMLElement *elem) test_elem_all((IUnknown*)node, NULL, 0); IHTMLDOMNode_Release(node); + col = NULL; + hres = IHTMLTable_get_tBodies(table, &col); + ok(hres == S_OK, "get_tBodies failed: %08x\n", hres); + ok(col != NULL, "get_tBodies returned NULL\n"); + + test_elem_collection((IUnknown*)col, tbodies_types, sizeof(tbodies_types)/sizeof(*tbodies_types)); + IHTMLElementCollection_Release(col); + + test_table_cell_spacing(table, NULL); + + V_VT(&v) = VT_I4; + V_I4(&v) = 10; + hres = IHTMLTable_put_cellSpacing(table, v); + ok(hres == S_OK, "put_cellSpacing = %08x\n", hres); + test_table_cell_spacing(table, "10"); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("11"); + hres = IHTMLTable_put_cellSpacing(table, v); + ok(hres == S_OK, "put_cellSpacing = %08x\n", hres); + test_table_cell_spacing(table, "11"); + VariantClear(&v); + IHTMLTable_Release(table); } @@ -5658,6 +5904,8 @@ static void test_stylesheet(IDispatch *disp) IHTMLStyleSheet *stylesheet; HRESULT hres; + test_disp2((IUnknown*)disp, &DIID_DispHTMLStyleSheet, &IID_IHTMLStyleSheet, "[object]"); + hres = IDispatch_QueryInterface(disp, &IID_IHTMLStyleSheet, (void**)&stylesheet); ok(hres == S_OK, "Could not get IHTMLStyleSheet: %08x\n", hres); @@ -5843,6 +6091,14 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElementCollection_Release(collection); } + hres = IHTMLDocument2_get_scripts(doc, &collection); + ok(hres == S_OK, "get_scripts failed: %08x\n", hres); + if(hres == S_OK) { + static const elem_type_t script_types[] = {ET_SCRIPT}; + test_elem_collection((IUnknown*)collection, script_types, 1); + IHTMLElementCollection_Release(collection); + } + test_plugins_col(doc); elem = get_doc_elem(doc); @@ -6085,6 +6341,13 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } + elem = get_doc_elem_by_id(doc, "labelid"); + ok(elem != NULL, "elem == NULL\n"); + if(elem) { + test_label_elem(elem); + IHTMLElement_Release(elem); + } + elem = get_doc_elem_by_id(doc, "row2"); ok(elem != NULL, "elem == NULL\n"); if(elem) { @@ -6099,6 +6362,17 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } + elem = get_doc_elem_by_id(doc, "btnid"); + ok(elem != NULL, "elem == NULL\n"); + if(elem) { + test_button_elem(elem); + test_button_get_disabled(elem, VARIANT_FALSE); + test_button_set_disabled(elem, VARIANT_TRUE); + test_elem3_set_disabled((IUnknown*)elem, VARIANT_FALSE); + test_button_get_disabled(elem, VARIANT_FALSE); + IHTMLElement_Release(elem); + } + elem = get_doc_elem_by_id(doc, "objid"); ok(elem != NULL, "elem == NULL\n"); if(elem) { @@ -6122,10 +6396,15 @@ static void test_elems(IHTMLDocument2 *doc) test_anchor_put_href((IUnknown*)elem, "http://test/"); test_anchor_href((IUnknown*)elem, "http://test/"); test_anchor_hostname((IUnknown*)elem, "test"); + test_anchor_hash(elem, NULL); /* target */ test_anchor_get_target((IUnknown*)elem, NULL); + test_anchor_rel((IUnknown*)elem, NULL); + test_anchor_put_rel((IUnknown*)elem, "Next"); + test_anchor_rel((IUnknown*)elem, "Next"); + /* Change the target */ test_anchor_put_target((IUnknown*)elem, "wine"); test_anchor_get_target((IUnknown*)elem, "wine"); @@ -6139,6 +6418,9 @@ static void test_elems(IHTMLDocument2 *doc) test_anchor_put_name((IUnknown*)elem, NULL); test_anchor_put_name((IUnknown*)elem, "x"); + test_anchor_put_href((IUnknown*)elem, "http://test/#hash"); + test_anchor_hash(elem, "#hash"); + IHTMLElement_Release(elem); } @@ -6537,10 +6819,13 @@ static void test_create_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); IHTMLDOMNode_Release(node); - node = test_create_text(doc, "test"); + node = test_create_text(doc, "abc"); test_ifaces((IUnknown*)node, text_iids); test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode, "[object]"); - test_text_length((IUnknown*)node, 4); + test_text_length((IUnknown*)node, 3); + test_text_data((IUnknown*)node, "abc"); + set_text_data((IUnknown*)node, "test"); + test_text_data((IUnknown*)node, "test"); V_VT(&var) = VT_NULL; node2 = test_node_insertbefore((IUnknown*)body, node, &var); @@ -6565,9 +6850,8 @@ static void test_create_elems(IHTMLDocument2 *doc) test_elem_innertext(body, "insert test Test"); IHTMLDOMNode_Release(node); - hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); - if(hres == S_OK) - { + doc5 = get_htmldoc5_iface((IUnknown*)doc); + if(doc5) { str = a2bstr("testing"); hres = IHTMLDocument5_createComment(doc5, str, &comment); SysFreeString(str); @@ -6834,12 +7118,37 @@ static void test_cond_comment(IHTMLDocument2 *doc) IHTMLElementCollection_Release(col); } +static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +{ + ok(IsEqualGUID(riid, &IID_IServiceProvider), "riid = %s\n", dbgstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI Unknown_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI Unknown_Release(IUnknown *iface) +{ + return 1; +} + +static const IUnknownVtbl UnknownVtbl = { + Unknown_QueryInterface, + Unknown_AddRef, + Unknown_Release, +}; +static IUnknown obj_ident_test = { &UnknownVtbl }; + static void test_frame(IDispatch *disp, const char *exp_id) { IHTMLWindow2 *frame2, *parent, *top; IHTMLDocument2 *parent_doc, *top_doc; IHTMLWindow4 *frame; IHTMLFrameBase *frame_elem; + IObjectIdentity *obj_ident; + ITravelLogClient *tlc; HRESULT hres; hres = IDispatch_QueryInterface(disp, &IID_IHTMLWindow4, (void**)&frame); @@ -6870,6 +7179,29 @@ static void test_frame(IDispatch *disp, const char *exp_id) return; } + hres = IHTMLWindow2_QueryInterface(frame2, &IID_IObjectIdentity, (void**)&obj_ident); + ok(hres == S_OK, "Could not get IObjectIdentity interface: %08x\n", hres); + hres = IHTMLWindow2_QueryInterface(frame2, &IID_ITravelLogClient, (void**)&tlc); + if(hres == E_NOINTERFACE) { + win_skip("IID_ITravelLogClient not available\n"); + tlc = NULL; + }else { + ok(hres == S_OK, "Could not get ITravelLogClient interface: %08x\n", hres); + + hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)tlc); + ok(hres == S_OK, "IsEqualObject returned: 0x%08x\n", hres); + ITravelLogClient_Release(tlc); + } + + hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)obj_ident); + ok(hres == S_OK, "IsEqualObject returned: 0x%08x\n", hres); + hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)parent); + ok(hres == S_FALSE, "IsEqualObject returned: 0x%08x\n", hres); + hres = IObjectIdentity_IsEqualObject(obj_ident, &obj_ident_test); + ok(hres == E_NOINTERFACE, "IsEqualObject returned: 0x%08x\n", hres); + + IObjectIdentity_Release(obj_ident); + hres = IHTMLWindow2_get_document(parent, &parent_doc); ok(hres == S_OK, "IHTMLWindow2_get_document failed: 0x%08x\n", hres); IHTMLWindow2_Release(parent); @@ -7081,6 +7413,16 @@ static void test_docfrag(IHTMLDocument2 *doc) IHTMLDocument2_Release(frag); } +static void check_quirks_mode(IHTMLDocument2 *doc) +{ + test_compatmode(doc, "BackCompat"); +} + +static void check_strict_mode(IHTMLDocument2 *doc) +{ + test_compatmode(doc, "CSS1Compat"); +} + static IHTMLDocument2 *notif_doc; static BOOL doc_complete; @@ -7212,6 +7554,13 @@ static void run_domtest(const char *str, domtest_t test) "ref = %d\n", ref); } +static void test_quirks_mode(void) +{ + run_domtest("", check_quirks_mode); + run_domtest("\n", check_strict_mode); + run_domtest("\n", check_quirks_mode); +} + START_TEST(dom) { HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); @@ -7242,5 +7591,7 @@ START_TEST(dom) run_domtest(doc_blank, test_replacechild_elems); run_domtest(doctype_str, test_doctype); + test_quirks_mode(); + CoUninitialize(); } diff --git a/rostests/winetests/mshtml/htmldoc.c b/rostests/winetests/mshtml/htmldoc.c index d0b49680cd5..1d5f4d79957 100644 --- a/rostests/winetests/mshtml/htmldoc.c +++ b/rostests/winetests/mshtml/htmldoc.c @@ -43,6 +43,7 @@ //#include "shobjidl.h" #include #include +#include #include "mshtml_test.h" DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); @@ -156,6 +157,7 @@ DEFINE_EXPECT(OnFrameWindowActivate); DEFINE_EXPECT(OnChanged_READYSTATE); DEFINE_EXPECT(OnChanged_1005); DEFINE_EXPECT(OnChanged_1012); +DEFINE_EXPECT(OnChanged_1014); DEFINE_EXPECT(GetDisplayName); DEFINE_EXPECT(BindToStorage); DEFINE_EXPECT(IsSystemMoniker); @@ -194,6 +196,10 @@ DEFINE_EXPECT(ActiveElementChanged); DEFINE_EXPECT(IsErrorUrl); DEFINE_EXPECT(get_LocationURL); DEFINE_EXPECT(CountEntries); +DEFINE_EXPECT(FindConnectionPoint); +DEFINE_EXPECT(EnumConnections); +DEFINE_EXPECT(EnumConnections_Next); +DEFINE_EXPECT(WindowClosing); static IUnknown *doc_unk; static IMoniker *doc_mon; @@ -232,7 +238,7 @@ static const char html_page[] = static const char css_data[] = "body {color: red; margin: 0}"; static const WCHAR http_urlW[] = - {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/','t','e','s','t','s','/','w','i','n','e','h','q','_','s','n','a','p','s','h','o','t','/',0}; static const WCHAR doc_url[] = {'w','i','n','e','t','e','s','t',':','d','o','c',0}; @@ -257,7 +263,7 @@ static const char *debugstr_guid(REFIID riid) if(!riid) return "(null)"; - sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]); @@ -940,6 +946,9 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D case 1012: CHECK_EXPECT2(OnChanged_1012); return S_OK; + case 1014: + CHECK_EXPECT2(OnChanged_1014); + return S_OK; case 1030: case 3000022: case 3000023: @@ -1104,7 +1113,12 @@ static HRESULT WINAPI WinInetHttpInfo_QueryInterface( REFIID riid, void **ppvObject) { - ok(0, "unexpected call\n"); + *ppvObject = NULL; + + if(IsEqualGUID(&IID_IGetBindHandle, riid)) + return E_NOINTERFACE; + + ok(0, "unexpected call %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -1160,6 +1174,8 @@ static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = { static IWinInetHttpInfo WinInetHttpInfo = { &WinInetHttpInfoVtbl }; +DEFINE_GUID(IID_unk_binding, 0xf3d8f080,0xa5eb,0x476f,0x9d,0x19,0xa5,0xef,0x24,0xe5,0xc2,0xe6); + static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IUnknown, riid)) { @@ -1172,7 +1188,12 @@ static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void return S_OK; } - ok(0, "unexpected call\n"); + if(IsEqualGUID(&IID_unk_binding, riid)) { + *ppv = NULL; + return E_NOINTERFACE; + } + + ok(0, "unexpected call %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -2728,12 +2749,9 @@ static void test_save_history(IUnknown *unk) static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { - if((!pguidCmdGroup || !IsEqualGUID(pguidCmdGroup, &CGID_Explorer)) - && (!pguidCmdGroup || !IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup) - || (nCmdID != 63 && (!is_refresh || nCmdID != 37)))) + if(!pguidCmdGroup) { test_readyState(NULL); - if(!pguidCmdGroup) { switch(nCmdID) { case OLECMDID_SETPROGRESSMAX: CHECK_EXPECT2(Exec_SETPROGRESSMAX); @@ -2820,6 +2838,8 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) { + if(nCmdID != 63 && (!is_refresh || nCmdID != 37)) + test_readyState(NULL); ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt); switch(nCmdID) { @@ -2873,7 +2893,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID CHECK_EXPECT(Exec_ShellDocView_67); ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn) = %d\n", V_VT(pvaIn)); - ok(!strcmp_wa(V_BSTR(pvaIn), nav_serv_url), "V_BSTR(pvaIn) = %s, expected %s\n", + ok(!strcmp_wa(V_BSTR(pvaIn), nav_serv_url), "V_BSTR(pvaIn) = %s, expected \"%s\"\n", wine_dbgstr_w(V_BSTR(pvaIn)), nav_serv_url); ok(pvaOut != NULL, "pvaOut == NULL\n"); ok(V_VT(pvaOut) == VT_BOOL, "V_VT(pvaOut) = %d\n", V_VT(pvaOut)); @@ -2922,6 +2942,9 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID return E_NOTIMPL; + case 134: /* TODO */ + case 136: /* TODO */ + case 139: /* TODO */ case 143: /* TODO */ case 144: /* TODO */ return E_NOTIMPL; @@ -2933,6 +2956,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) { + test_readyState(NULL); ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt); switch(nCmdID) { @@ -2950,6 +2974,9 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID switch(nCmdID) { case DOCHOST_DOCCANNAVIGATE: CHECK_EXPECT(Exec_DOCCANNAVIGATE); + + test_readyState(NULL); + ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(pvaOut == NULL, "pvaOut != NULL\n"); ok(V_VT(pvaIn) == VT_UNKNOWN, "V_VT(pvaIn) != VT_UNKNOWN\n"); @@ -2962,6 +2989,8 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID VARIANT var; HRESULT hres; + test_readyState(NULL); + ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(pvaOut != NULL || broken(!pvaOut), "pvaOut != NULL\n"); ok(V_VT(pvaIn) == VT_ARRAY, "V_VT(pvaIn) = %d\n", V_VT(pvaIn)); @@ -3013,6 +3042,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) { + test_readyState(NULL); ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt); switch(nCmdID) { @@ -3042,6 +3072,8 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } if(IsEqualGUID(&CGID_DocHostCommandHandler, pguidCmdGroup)) { + test_readyState(NULL); + switch (nCmdID) { case OLECMDID_PAGEACTIONBLOCKED: /* win2k3 */ SET_EXPECT(SetStatusText); @@ -3213,13 +3245,14 @@ static IDispatch EventDispatch = { &EventDispatchVtbl }; static HRESULT WINAPI TravelLog_QueryInterface(ITravelLog *iface, REFIID riid, void **ppv) { static const IID IID_IIETravelLog2 = {0xb67cefd2,0xe3f1,0x478a,{0x9b,0xfa,0xd8,0x93,0x70,0x37,0x5e,0x94}}; + static const IID IID_unk_travellog = {0x6afc8b7f,0xbc17,0x4a95,{0x90,0x2f,0x6f,0x5c,0xb5,0x54,0xc3,0xd8}}; if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITravelLog, riid)) { *ppv = iface; return S_OK; } - if(!IsEqualGUID(&IID_IIETravelLog2, riid)) + if(!IsEqualGUID(&IID_IIETravelLog2, riid) && !IsEqualGUID(&IID_unk_travellog, riid)) ok(0, "unexpected call %s\n", debugstr_guid(riid)); *ppv = NULL; @@ -3292,10 +3325,13 @@ static HRESULT WINAPI TravelLog_Clone(ITravelLog *iface, ITravelLog **pptl) return E_NOTIMPL; } +static IBrowserService BrowserService; static DWORD WINAPI TravelLog_CountEntries(ITravelLog *iface, IUnknown *punk) { CHECK_EXPECT(CountEntries); - return E_NOTIMPL; + + ok(punk == (IUnknown*)&BrowserService, "punk != &BrowserService (%p)\n", punk); + return 0; } static HRESULT WINAPI TravelLog_Revert(ITravelLog *iface) @@ -3350,7 +3386,7 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(IDocObjectService *i ok(!pDispatch, "pDispatch = %p\n", pDispatch); ok(!strcmp_wa(lpszUrl, nav_url), "lpszUrl = %s, expected %s\n", wine_dbgstr_w(lpszUrl), nav_url); - ok(dwFlags == 0x40 || !dwFlags, "dwFlags = %x\n", dwFlags); + ok(dwFlags == 0x40 || !dwFlags || dwFlags == 0x50, "dwFlags = %x\n", dwFlags); ok(!lpszFrameName, "lpszFrameName = %s\n", wine_dbgstr_w(lpszFrameName)); ok(!pPostData, "pPostData = %p\n", pPostData); ok(!cbPostData, "cbPostData = %d\n", cbPostData); @@ -3940,6 +3976,244 @@ static HRESULT browserservice_qi(REFIID riid, void **ppv) return E_NOINTERFACE; } +static HRESULT WINAPI WBE2Sink_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) { + *ppv = iface; + return S_OK; + } + + *ppv = NULL; + ok(0, "unexpected riid: %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static HRESULT WINAPI WBE2Sink_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n"); + ok(pdp != NULL, "pDispParams == NULL\n"); + ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo); + ok(puArgErr == NULL, "puArgErr != NULL\n"); + ok(pVarResult == NULL, "pVarResult != NULL\n"); + ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags); + ok(!pdp->cNamedArgs, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs = %p\n", pdp->rgdispidNamedArgs); + + switch(dispIdMember) { + case DISPID_WINDOWCLOSING: { + VARIANT *is_child = pdp->rgvarg+1, *cancel = pdp->rgvarg; + + CHECK_EXPECT(WindowClosing); + + ok(pdp->cArgs == 2, "pdp->cArgs = %d\n", pdp->cArgs); + ok(V_VT(is_child) == VT_BOOL, "V_VT(is_child) = %d\n", V_VT(is_child)); + ok(!V_BOOL(is_child), "V_BOOL(is_child) = %x\n", V_BOOL(is_child)); + ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel) = %d\n", V_VT(cancel)); + ok(!*V_BOOLREF(cancel), "*V_BOOLREF(cancel) = %x\n", *V_BOOLREF(cancel)); + + *V_BOOLREF(cancel) = VARIANT_TRUE; + return S_OK; + } + default: + ok(0, "unexpected id %d\n", dispIdMember); + } + + return E_NOTIMPL; +} + +static const IDispatchVtbl WBE2SinkVtbl = { + WBE2Sink_QueryInterface, + Dispatch_AddRef, + Dispatch_Release, + Dispatch_GetTypeInfoCount, + Dispatch_GetTypeInfo, + Dispatch_GetIDsOfNames, + WBE2Sink_Invoke +}; + +static IDispatch WBE2Sink = { &WBE2SinkVtbl }; + +static HRESULT WINAPI EnumConnections_QueryInterface(IEnumConnections *iface, REFIID riid, LPVOID *ppv) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI EnumConnections_AddRef(IEnumConnections *iface) +{ + return 2; +} + +static ULONG WINAPI EnumConnections_Release(IEnumConnections *iface) +{ + return 1; +} + +static BOOL next_called; + +static HRESULT WINAPI EnumConnections_Next(IEnumConnections *iface, ULONG cConnections, CONNECTDATA *rgcd, ULONG *pcFetched) +{ + CHECK_EXPECT2(EnumConnections_Next); + + ok(cConnections == 1, "cConnections = %d\n", cConnections); + ok(pcFetched != NULL, "pcFetched == NULL\n"); + + if(next_called) { + *pcFetched = 0; + return S_FALSE; + } + + next_called = TRUE; + rgcd->pUnk = (IUnknown*)&WBE2Sink; + rgcd->dwCookie = 0xdeadbeef; + *pcFetched = 1; + return S_OK; +} + +static HRESULT WINAPI EnumConnections_Skip(IEnumConnections *iface, ULONG ulConnections) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static HRESULT WINAPI EnumConnections_Reset(IEnumConnections *iface) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static HRESULT WINAPI EnumConnections_Clone(IEnumConnections *iface, IEnumConnections **ppEnum) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static const IEnumConnectionsVtbl EnumConnectionsVtbl = { + EnumConnections_QueryInterface, + EnumConnections_AddRef, + EnumConnections_Release, + EnumConnections_Next, + EnumConnections_Skip, + EnumConnections_Reset, + EnumConnections_Clone +}; + +static IEnumConnections EnumConnections = { &EnumConnectionsVtbl }; + +static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, LPVOID *ppv) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface) +{ + return 2; +} + +static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface) +{ + return 1; +} + +static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, + IConnectionPointContainer **ppCPC) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, IEnumConnections **ppEnum) +{ + CHECK_EXPECT(EnumConnections); + + *ppEnum = &EnumConnections; + next_called = FALSE; + return S_OK; +} + +static const IConnectionPointVtbl ConnectionPointVtbl = +{ + ConnectionPoint_QueryInterface, + ConnectionPoint_AddRef, + ConnectionPoint_Release, + ConnectionPoint_GetConnectionInterface, + ConnectionPoint_GetConnectionPointContainer, + ConnectionPoint_Advise, + ConnectionPoint_Unadvise, + ConnectionPoint_EnumConnections +}; + +static IConnectionPoint ConnectionPointWBE2 = { &ConnectionPointVtbl }; + +static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, + REFIID riid, void **ppv) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) +{ + return 2; +} + +static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) +{ + return 1; +} + +static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, + IEnumConnectionPoints **ppEnum) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, + REFIID riid, IConnectionPoint **ppCP) +{ + CHECK_EXPECT(FindConnectionPoint); + + if(IsEqualGUID(riid, &DIID_DWebBrowserEvents2)) { + *ppCP = &ConnectionPointWBE2; + return S_OK; + } + + ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + return E_NOTIMPL; +} + +static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { + ConnectionPointContainer_QueryInterface, + ConnectionPointContainer_AddRef, + ConnectionPointContainer_Release, + ConnectionPointContainer_EnumConnectionPoints, + ConnectionPointContainer_FindConnectionPoint +}; + +static IConnectionPointContainer ConnectionPointContainer = { &ConnectionPointContainerVtbl }; + static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, void **ppv) { *ppv = NULL; @@ -3953,6 +4227,11 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid if(IsEqualGUID(riid, &IID_IOleObject)) return E_NOINTERFACE; /* TODO */ + if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) { + *ppv = &ConnectionPointContainer; + return S_OK; + } + ok(0, "unexpected call %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -4653,6 +4932,7 @@ DEFINE_GUID(IID_IThumbnailView, 0x7BB0B520,0xB1A7,0x11D2,0xBB,0x23,0x00,0xC0,0x4 DEFINE_GUID(IID_IRenMailEditor, 0x000670BA,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(IID_unk4, 0x305104a6,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b); DEFINE_GUID(IID_IDocHostUIHandlerPriv, 0xf0d241d1,0x5d0e,0x4e85,0xbc,0xb4,0xfa,0xd7,0xf7,0xc5,0x52,0x8c); +DEFINE_GUID(IID_unk5, 0x5f95accc,0xd7a1,0x4574,0xbc,0xcb,0x69,0x71,0x35,0xbc,0x41,0xde); static HRESULT QueryInterface(REFIID riid, void **ppv) { @@ -4692,6 +4972,8 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) return E_NOINTERFACE; /* ? */ else if(IsEqualGUID(&IID_unk4, riid)) return E_NOINTERFACE; /* ? */ + else if(IsEqualGUID(&IID_unk5, riid)) + return E_NOINTERFACE; /* IE10 */ else if(IsEqualGUID(&IID_IDocHostUIHandlerPriv, riid)) return E_NOINTERFACE; /* ? */ else @@ -5031,7 +5313,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) CHECK_CALLED(Exec_ShellDocView_37); todo_wine CHECK_CALLED_BROKEN(IsErrorUrl); }else { - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); } CHECK_CALLED_BROKEN(Exec_ShellDocView_84); todo_wine CHECK_CALLED(GetPendingUrl); @@ -5055,6 +5337,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) #define DWL_EXPECT_HISTUPDATE 0x0080 #define DWL_FROM_HISTORY 0x0100 #define DWL_REFRESH 0x0200 +#define DWL_EX_GETHOSTINFO 0x0400 static void test_download(DWORD flags) { @@ -5077,7 +5360,7 @@ static void test_download(DWORD flags) } if(flags & (DWL_VERBDONE|DWL_HTTP)) SET_EXPECT(Exec_SETPROGRESSMAX); - if((flags & DWL_VERBDONE) && !load_from_stream && !is_js) + if(flags & DWL_EX_GETHOSTINFO) SET_EXPECT(GetHostInfo); SET_EXPECT(SetStatusText); if(!(flags & DWL_EMPTY)) @@ -5163,7 +5446,7 @@ static void test_download(DWORD flags) CHECK_CALLED(Exec_SETPROGRESSMAX); if(flags & DWL_HTTP) SET_CALLED(Exec_SETPROGRESSMAX); - if((flags & DWL_VERBDONE) && !load_from_stream && !is_js) { + if(flags & DWL_EX_GETHOSTINFO) { if(nav_url) todo_wine CHECK_CALLED(GetHostInfo); else @@ -5441,7 +5724,7 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre if(is_js) ignore_external_qi = TRUE; - test_download(DWL_VERBDONE | (is_js ? DWL_JAVASCRIPT : DWL_ONREADY_LOADING) | dwl_flags); + test_download(DWL_VERBDONE | (is_js ? DWL_JAVASCRIPT : DWL_ONREADY_LOADING|DWL_EX_GETHOSTINFO) | dwl_flags); if(is_js) ignore_external_qi = FALSE; @@ -5472,8 +5755,8 @@ static void test_load_history(IHTMLDocument2 *doc) ok(hres == S_OK, "Could not get IPersistHistory iface: %08x\n", hres); prev_url = nav_url; - nav_url = "http://www.winehq.org/#test"; - nav_serv_url = "http://www.winehq.org/"; + nav_url = "http://test.winehq.org/tests/winehq_snapshot/#test"; + nav_serv_url = "http://test.winehq.org/tests/winehq_snapshot/"; SET_EXPECT(Exec_ShellDocView_138); SET_EXPECT(Exec_ShellDocView_67); @@ -5493,13 +5776,36 @@ static void test_load_history(IHTMLDocument2 *doc) load_state = LD_LOADING; test_timer(EXPECT_UPDATEUI|EXPECT_SETTITLE); - test_download(DWL_VERBDONE|DWL_HTTP|DWL_EXPECT_HISTUPDATE|DWL_ONREADY_LOADING|DWL_FROM_HISTORY); + test_download(DWL_VERBDONE|DWL_HTTP|DWL_EXPECT_HISTUPDATE|DWL_ONREADY_LOADING|DWL_FROM_HISTORY|DWL_EX_GETHOSTINFO); IPersistHistory_Release(per_hist); IStream_Release(history_stream); history_stream = NULL; } +static void test_OmHistory(IHTMLDocument2 *doc) +{ + IHTMLWindow2 *win; + IOmHistory *hist; + short len; + HRESULT hres; + + hres = IHTMLDocument2_get_parentWindow(doc, &win); + ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); + + hres = IHTMLWindow2_get_history(win, &hist); + ok(hres == S_OK, "get_history failed: %08x\n", hres); + IHTMLWindow2_Release(win); + + SET_EXPECT(CountEntries); + hres = IOmHistory_get_length(hist, &len); + CHECK_CALLED(CountEntries); + ok(hres == S_OK, "get_length failed: %08x\n", hres); + ok(len == 0, "len = %d\n", len); + + IOmHistory_Release(hist); +} + static void test_refresh(IHTMLDocument2 *doc) { IOleCommandTarget *cmdtrg; @@ -5521,7 +5827,7 @@ static void test_refresh(IHTMLDocument2 *doc) IOleCommandTarget_Release(cmdtrg); - test_download(DWL_VERBDONE|DWL_HTTP|DWL_ONREADY_LOADING|DWL_REFRESH); + test_download(DWL_VERBDONE|DWL_HTTP|DWL_ONREADY_LOADING|DWL_REFRESH|DWL_EX_GETHOSTINFO); } static void test_open_window(IHTMLDocument2 *doc, BOOL do_block) @@ -5575,11 +5881,36 @@ static void test_open_window(IHTMLDocument2 *doc, BOOL do_block) hres = IHTMLWindow2_close(new_window); ok(hres == S_OK, "close failed: %08x\n", hres); + IHTMLWindow2_Release(new_window); } IHTMLWindow2_Release(window); } +static void test_window_close(IHTMLDocument2 *doc) +{ + IHTMLWindow2 *window; + HRESULT hres; + + hres = IHTMLDocument2_get_parentWindow(doc, &window); + ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); + + SET_EXPECT(FindConnectionPoint); + SET_EXPECT(EnumConnections); + SET_EXPECT(EnumConnections_Next); + SET_EXPECT(WindowClosing); + + hres = IHTMLWindow2_close(window); + ok(hres == S_OK, "close failed: %08x\n", hres); + + CHECK_CALLED(FindConnectionPoint); + CHECK_CALLED(EnumConnections); + CHECK_CALLED(EnumConnections_Next); + CHECK_CALLED(WindowClosing); + + IHTMLWindow2_Release(window); +} + static void test_elem_from_point(IHTMLDocument2 *doc) { IHTMLElement *elem; @@ -6092,7 +6423,7 @@ static void test_ClientSite(IOleObject *oleobj, DWORD flags) CHECK_CALLED(Invoke_AMBIENT_USERAGENT); CLEAR_CALLED(Invoke_AMBIENT_PALETTE); /* not called on IE9 */ CLEAR_CALLED(GetOverrideKeyPath); /* Called by IE9 */ - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); CHECK_CALLED_BROKEN(Exec_ShellDocView_84); set_clientsite = TRUE; @@ -6996,9 +7327,9 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_travellog(doc); test_binding_ui((IUnknown*)doc); - nav_url = nav_serv_url = "http://www.winehq.org/"; /* for valid prev nav_url */ + nav_url = nav_serv_url = "http://test.winehq.org/tests/winehq_snapshot/"; /* for valid prev nav_url */ if(support_wbapp) { - test_put_href(doc, FALSE, "#test", "http://www.winehq.org/#test", FALSE, TRUE, 0); + test_put_href(doc, FALSE, "#test", "http://test.winehq.org/tests/winehq_snapshot/#test", FALSE, TRUE, 0); test_travellog(doc); test_refresh(doc); } @@ -7007,6 +7338,7 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_put_href(doc, TRUE, NULL, "about:replace", FALSE, FALSE, 0); if(support_wbapp) { test_load_history(doc); + test_OmHistory(doc); test_put_href(doc, FALSE, NULL, "about:blank", FALSE, FALSE, support_wbapp ? DWL_EXPECT_HISTUPDATE : 0); } @@ -7014,6 +7346,8 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_open_window(doc, TRUE); if(!support_wbapp) /* FIXME */ test_open_window(doc, FALSE); + if(support_wbapp) + test_window_close(doc); test_InPlaceDeactivate(doc, TRUE); test_Close(doc, FALSE); @@ -7216,7 +7550,7 @@ static void test_edit_uiactivate(IOleObject *oleobj) IOleDocumentView_Release(docview); } -static void test_editing_mode(BOOL do_load) +static void test_editing_mode(BOOL do_load, BOOL use_design_mode) { IHTMLDocument2 *doc; IUnknown *unk; @@ -7224,7 +7558,7 @@ static void test_editing_mode(BOOL do_load) DWORD conn; HRESULT hres; - trace("Testing HTMLDocument (edit%s)...\n", do_load ? " load" : ""); + trace("Testing HTMLDocument (edit%s%s)...\n", do_load ? " load" : "", use_design_mode ? " using designMode" : ""); init_test(do_load ? LD_DOLOAD : LD_NO); call_UIActivate = CallUIActivate_AfterShow; @@ -7249,13 +7583,74 @@ static void test_editing_mode(BOOL do_load) if(do_load) test_Persist(doc, &Moniker); stream_read = protocol_read = 0; - test_exec_editmode(unk, do_load); - test_UIDeactivate(); - call_UIActivate = CallUIActivate_None; + + if(!use_design_mode) { + test_exec_editmode(unk, do_load); + test_UIDeactivate(); + call_UIActivate = CallUIActivate_None; + }else { + BSTR on; + + SET_EXPECT(Exec_SETTITLE); + test_download(DWL_VERBDONE|DWL_CSS|DWL_TRYCSS); + CLEAR_CALLED(Exec_SETTITLE); + + editmode = TRUE; + load_state = LD_DOLOAD; + readystate_set_loading = TRUE; + + SET_EXPECT(OnChanged_1005); + SET_EXPECT(ActiveElementChanged); + SET_EXPECT(GetClassID); + SET_EXPECT(SetStatusText); + SET_EXPECT(Exec_ShellDocView_37); + SET_EXPECT(GetHostInfo); + SET_EXPECT(GetDisplayName); + SET_EXPECT(Invoke_AMBIENT_SILENT); + SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + SET_EXPECT(OnChanged_READYSTATE); + SET_EXPECT(Invoke_OnReadyStateChange_Loading); + SET_EXPECT(IsSystemMoniker); + SET_EXPECT(Exec_ShellDocView_84); + SET_EXPECT(BindToStorage); + SET_EXPECT(InPlaceUIWindow_SetActiveObject); + SET_EXPECT(HideUI); + SET_EXPECT(ShowUI); + SET_EXPECT(InPlaceFrame_SetBorderSpace); + SET_EXPECT(OnChanged_1014); + + on = a2bstr("On"); + hres = IHTMLDocument2_put_designMode(doc, on); + SysFreeString(on); + ok(hres == S_OK, "put_designMode failed: %08x\n", hres); + + todo_wine CHECK_CALLED(OnChanged_1005); + todo_wine CHECK_CALLED(ActiveElementChanged); + CHECK_CALLED(GetClassID); + CHECK_CALLED(SetStatusText); + CHECK_CALLED(Exec_ShellDocView_37); + CHECK_CALLED(GetHostInfo); + CHECK_CALLED(GetDisplayName); + CHECK_CALLED(Invoke_AMBIENT_SILENT); + CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + CHECK_CALLED(OnChanged_READYSTATE); + CHECK_CALLED(Invoke_OnReadyStateChange_Loading); + CLEAR_CALLED(IsSystemMoniker); /* IE7 */ + CHECK_CALLED_BROKEN(Exec_ShellDocView_84); + CHECK_CALLED(BindToStorage); + CHECK_CALLED(InPlaceUIWindow_SetActiveObject); + CHECK_CALLED(HideUI); + CHECK_CALLED(ShowUI); + CHECK_CALLED(InPlaceFrame_SetBorderSpace); + CHECK_CALLED(OnChanged_1014); + + test_timer(EXPECT_UPDATEUI|EXPECT_SETTITLE); + } + IOleObject_Release(oleobj); test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED); - test_download(DWL_VERBDONE | (do_load ? DWL_CSS|DWL_TRYCSS : 0)); + test_download(DWL_VERBDONE | DWL_EX_GETHOSTINFO | (do_load ? DWL_CSS|DWL_TRYCSS : 0)); SET_EXPECT(SetStatusText); /* ignore race in native mshtml */ test_timer(EXPECT_UPDATEUI); @@ -7358,7 +7753,7 @@ static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw) CHECK_CALLED(QueryStatus_SETPROGRESSTEXT); CHECK_CALLED(Exec_SETPROGRESSMAX); CHECK_CALLED(Exec_SETPROGRESSPOS); - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); CHECK_CALLED_BROKEN(Exec_ShellDocView_84); hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite); @@ -7575,10 +7970,11 @@ START_TEST(htmldoc) test_HTMLDocument_StreamLoad(); test_HTMLDocument_StreamInitNew(); if (winetest_interactive) - test_editing_mode(FALSE); + test_editing_mode(FALSE, FALSE); else - skip("Skipping test_editing_mode(FALSE). ROSTESTS-113.\n"); - test_editing_mode(TRUE); + skip("Skipping test_editing_mode(FALSE, FALSE). ROSTESTS-113.\n"); + test_editing_mode(TRUE, FALSE); + test_editing_mode(TRUE, TRUE); if (winetest_interactive) { test_HTMLDocument_http(FALSE); diff --git a/rostests/winetests/mshtml/jstest.html b/rostests/winetests/mshtml/jstest.html index ebf28618b89..bfa98c08f0f 100644 --- a/rostests/winetests/mshtml/jstest.html +++ b/rostests/winetests/mshtml/jstest.html @@ -137,6 +137,8 @@ function test_getter_call() { e.onmousedown = function(x) { this.onmousedown_called = x; }; e.onmousedown("test"); ok(e.onmousedown_called === "test", "e.onmousedown_called = " + e.onmousedown_called); + + ok(document.all("divid").tagName === "DIV", "document.all('divid').tagName = " + document.all("divid").tagName); } function test_arg_conv() { @@ -177,6 +179,39 @@ function test_forin() { ok(cnt > 100, "cnt = " + cnt); } +function test_customtag() { + document.body.innerHTML = 'test
'; + + var children = document.body.childNodes; + + ok(children.length === 3, "children.length = " + children.length); + ok(children[0].data === "test", "children[0].data = " + children[0].data); + ok(children[1].tagName === "UNK", "children[1].tagName = " + children[1].tagName); + ok(children[2].tagName === "BR", "children[2].tagName = " + children[2].tagName); +} + +function test_whitespace_nodes() { + document.body.innerHTML = ' \t\n
\n \t
'; + + var t = document.getElementById("tid"); + ok(t.childNodes.length === 1, "t.childNodes.length = " + t.childNodes.length); + ok(t.childNodes[0].tagName === "TBODY", "t.childNodes[0].tagName = " + t.childNodes[0].tagName); + + var row = t.rows[0]; + ok(row.childNodes.length === 1, "row.childNodes.length = " + row.childNodes.length); + ok(row.childNodes[0].tagName === "TD", "row.childNodes[0].tagName = " + row.childNodes[0].tagName); + + var cell = row.cells[0]; + ok(cell.childNodes.length === 1, "cell.childNodes.length = " + cell.childNodes.length); + + + document.body.innerHTML = ' x \tx\n
\n \tx
'; + + t = document.getElementById("tid"); + ok(t.rows[0].cells[0].childNodes.length === 2, + "t.rows[0].cells[0].childNodes.length = " + t.rows[0].cells[0].childNodes.length); +} + var globalVar = false; function runTests() { @@ -198,6 +233,8 @@ function runTests() { test_arg_conv(); test_override_functions(); test_forin(); + test_customtag(); + test_whitespace_nodes(); var r = window.execScript("globalVar = true;"); ok(r === undefined, "execScript returned " + r); diff --git a/rostests/winetests/mshtml/protocol.c b/rostests/winetests/mshtml/protocol.c index bc83604d727..ec6521655d1 100644 --- a/rostests/winetests/mshtml/protocol.c +++ b/rostests/winetests/mshtml/protocol.c @@ -27,6 +27,7 @@ //#include "ole2.h" //#include "urlmon.h" #include +#include #include @@ -73,6 +74,9 @@ static const WCHAR about_test_url[] = {'a','b','o','u','t',':','t','e','s','t',0 static const WCHAR about_res_url[] = {'r','e','s',':','b','l','a','n','k',0}; static const WCHAR javascript_test_url[] = {'j','a','v','a','s','c','r','i','p','t',':','t','e','s','t','(',')',0}; +static WCHAR res_url_base[INTERNET_MAX_URL_LENGTH] = {'r','e','s',':','/','/'}; +static unsigned res_url_base_len; + static const char *debugstr_guid(REFIID riid) { static char buf[50]; @@ -248,7 +252,7 @@ static void test_protocol_fail(IInternetProtocol *protocol, LPCWSTR url, HRESULT CHECK_CALLED(ReportResult); } -static void protocol_start(IInternetProtocol *protocol, LPCWSTR url) +static void protocol_start(IInternetProtocol *protocol, const WCHAR *url) { HRESULT hres; @@ -268,6 +272,33 @@ static void protocol_start(IInternetProtocol *protocol, LPCWSTR url) CHECK_CALLED(ReportResult); } +static void test_res_url(const char *url_suffix) +{ + WCHAR url[INTERNET_MAX_URL_LENGTH]; + IInternetProtocol *protocol; + ULONG size, ref; + BYTE buf[100]; + HRESULT hres; + + memcpy(url, res_url_base, res_url_base_len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, url_suffix, -1, url+res_url_base_len, sizeof(url)/sizeof(WCHAR)-res_url_base_len); + + hres = CoCreateInstance(&CLSID_ResProtocol, NULL, CLSCTX_INPROC_SERVER, &IID_IInternetProtocol, (void**)&protocol); + ok(hres == S_OK, "Could not create ResProtocol instance: %08x\n", hres); + + protocol_start(protocol, url); + + hres = IInternetProtocol_Read(protocol, buf, sizeof(buf), &size); + ok(hres == S_OK, "Read failed: %08x\n", hres); + + hres = IInternetProtocol_Terminate(protocol, 0); + ok(hres == S_OK, "Terminate failed: %08x\n", hres); + + + ref = IInternetProtocol_Release(protocol); + ok(!ref, "ref=%u\n", ref); +} + static void res_sec_url_cmp(LPCWSTR url, DWORD size, LPCWSTR file) { WCHAR buf[MAX_PATH]; @@ -578,6 +609,10 @@ static void test_res_protocol(void) } IUnknown_Release(unk); + + test_res_url("/jstest.html"); + test_res_url("/Test/res.html"); + test_res_url("/test/dir/dir2/res.html"); } static void do_test_about_protocol(IClassFactory *factory, DWORD bf) @@ -908,6 +943,8 @@ static void test_javascript_protocol(void) START_TEST(protocol) { + res_url_base_len = 6 + GetModuleFileNameW(NULL, res_url_base + 6 /* strlen("res://") */, sizeof(res_url_base)/sizeof(WCHAR)-6); + OleInitialize(NULL); test_res_protocol(); diff --git a/rostests/winetests/mshtml/rsrc.rc b/rostests/winetests/mshtml/rsrc.rc index 49aecdfb923..07d816d388c 100644 --- a/rostests/winetests/mshtml/rsrc.rc +++ b/rostests/winetests/mshtml/rsrc.rc @@ -33,3 +33,11 @@ externscr.js HTML "externscr.js" /* @makedep: test_tlb.tlb */ 1 TYPELIB test_tlb.tlb + +/* For res: protocol test: */ + +/* @makedep: jstest.html */ +res.html test "jstest.html" + +/* @makedep: jstest.html */ +dir/dir2/res.html test "jstest.html" diff --git a/rostests/winetests/mshtml/script.c b/rostests/winetests/mshtml/script.c index 91728b74936..ac84e30e241 100644 --- a/rostests/winetests/mshtml/script.c +++ b/rostests/winetests/mshtml/script.c @@ -1768,6 +1768,8 @@ static HRESULT WINAPI ActiveScriptProperty_SetProperty(IActiveScriptProperty *if ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue)); ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue)); break; + case 0x70000003: /* Undocumented property set by IE10 */ + return E_NOTIMPL; default: ok(0, "unexpected property %x\n", dwProperty); return E_NOTIMPL; diff --git a/rostests/winetests/mshtml/style.c b/rostests/winetests/mshtml/style.c index 7bfc766d13b..a8c56d49180 100644 --- a/rostests/winetests/mshtml/style.c +++ b/rostests/winetests/mshtml/style.c @@ -73,6 +73,17 @@ static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk) return elem; } +#define get_current_style2_iface(u) _get_current_style2_iface(__LINE__,u) +static IHTMLCurrentStyle2 *_get_current_style2_iface(unsigned line, IUnknown *unk) +{ + IHTMLCurrentStyle2 *current_style2; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLCurrentStyle2, (void**)¤t_style2); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres); + return current_style2; +} + static IHTMLElement *get_element_by_id(IHTMLDocument2 *doc, const char *id) { HRESULT hres; @@ -2017,6 +2028,22 @@ static void test_body_style(IHTMLStyle *style) ok(hres == S_OK, "get_pageBreakBefore failed: %08x\n", hres); ok(!str, "pageBreakBefore = %s\n", wine_dbgstr_w(str)); + str = (void*)0xdeadbeef; + hres = IHTMLStyle_get_whiteSpace(style, &str); + ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres); + ok(!str, "whiteSpace = %s\n", wine_dbgstr_w(str)); + + str = a2bstr("nowrap"); + hres = IHTMLStyle_put_whiteSpace(style, str); + SysFreeString(str); + ok(hres == S_OK, "put_whiteSpace failed: %08x\n", hres); + + str = NULL; + hres = IHTMLStyle_get_whiteSpace(style, &str); + ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres); + ok(!strcmp_wa(str, "nowrap"), "whiteSpace = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle2, (void**)&style2); ok(hres == S_OK, "Could not get IHTMLStyle2 iface: %08x\n", hres); if(SUCCEEDED(hres)) { @@ -2100,9 +2127,7 @@ static void test_style_filters(IHTMLElement *elem) hres = IHTMLElement2_get_currentStyle(elem2, ¤t_style); ok(hres == S_OK, "get_style failed: %08x\n", hres); - hres = IHTMLCurrentStyle_QueryInterface(current_style, &IID_IHTMLCurrentStyle2, (void**)¤t_style2); - IHTMLCurrentStyle_Release(current_style); - ok(hres == S_OK, "Could not get IHTMLCurrentStyle2 iface: %08x\n", hres); + current_style2 = get_current_style2_iface((IUnknown*)current_style); test_style_filter(style, NULL); test_current_style_filter(current_style2, NULL); @@ -2131,6 +2156,8 @@ static void test_style_filters(IHTMLElement *elem) static void test_current_style(IHTMLCurrentStyle *current_style) { + IHTMLCurrentStyle2 *current_style2; + VARIANT_BOOL b; BSTR str; HRESULT hres; VARIANT v; @@ -2390,6 +2417,15 @@ static void test_current_style(IHTMLCurrentStyle *current_style) ok(hres == S_OK, "get_textIndent failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); VariantClear(&v); + + current_style2 = get_current_style2_iface((IUnknown*)current_style); + + b = 100; + hres = IHTMLCurrentStyle2_get_hasLayout(current_style2, &b); + ok(hres == S_OK, "get_hasLayout failed: %08x\n", hres); + ok(b == VARIANT_TRUE, "hasLayout = %x\n", b); + + IHTMLCurrentStyle2_Release(current_style2); } static const char basic_test_str[] = "
"; diff --git a/rostests/winetests/mshtml/testlist.c b/rostests/winetests/mshtml/testlist.c index af66fba4797..4f71b764ca2 100644 --- a/rostests/winetests/mshtml/testlist.c +++ b/rostests/winetests/mshtml/testlist.c @@ -1,7 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ #define STANDALONE -#include "wine/test.h" +#include extern void func_activex(void); extern void func_dom(void);