Module: wine Branch: master Commit: 7a6494e2272ec2c7f522413ed896e4bddfcbf0b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a6494e2272ec2c7f522413ed8...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Mar 12 20:42:06 2012 +0100
msxml3: Added XMLView IPersistMoniker_Load test.
---
dlls/msxml3/tests/Makefile.in | 2 + dlls/msxml3/tests/rsrc.rc | 23 +++++ dlls/msxml3/tests/xmlview.c | 190 +++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/tests/xmlview.xml | 12 +++ dlls/msxml3/tests/xmlview.xsl | 26 ++++++ 5 files changed, 253 insertions(+), 0 deletions(-)
diff --git a/dlls/msxml3/tests/Makefile.in b/dlls/msxml3/tests/Makefile.in index 22103cd..05c4f50 100644 --- a/dlls/msxml3/tests/Makefile.in +++ b/dlls/msxml3/tests/Makefile.in @@ -9,4 +9,6 @@ C_SRCS = \ xmlparser.c \ xmlview.c
+RC_SRCS = rsrc.rc + @MAKE_TEST_RULES@ diff --git a/dlls/msxml3/tests/rsrc.rc b/dlls/msxml3/tests/rsrc.rc new file mode 100644 index 0000000..94d8bc8 --- /dev/null +++ b/dlls/msxml3/tests/rsrc.rc @@ -0,0 +1,23 @@ +/* + * Copyright 2012 Piotr 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 + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @makedep: xmlview.xml */ +xmlview.xml XML "xmlview.xml" + +/* @makedep: xmlview.xsl */ +xmlview.xsl XML "xmlview.xsl" diff --git a/dlls/msxml3/tests/xmlview.c b/dlls/msxml3/tests/xmlview.c index 65c991e..b238d69 100644 --- a/dlls/msxml3/tests/xmlview.c +++ b/dlls/msxml3/tests/xmlview.c @@ -24,14 +24,128 @@ #include "windows.h" #include "ole2.h" #include "mshtml.h" +#include "mshtmdid.h" #include "initguid.h" #include "perhist.h" #include "docobj.h" +#include "urlmon.h"
#include "wine/test.h"
DEFINE_GUID(CLSID_XMLView, 0x48123bc4, 0x99d9, 0x11d1, 0xa6,0xb3, 0x00,0xc0,0x4f,0xd9,0x15,0x55);
+HRESULT (WINAPI *pCreateURLMoniker)(IMoniker*, LPCWSTR, IMoniker**); + +static const char xmlview_html[] = +"\r\n" +"<BODY><H2>Generated HTML</H2>\r\n" +"<TABLE>\r\n" +"<TBODY>\r\n" +"<TR bgColor=green>\r\n" +"<TH>Title</TH>\r\n" +"<TH>Value</TH></TR>\r\n" +"<TR>\r\n" +"<TD>title1</TD>\r\n" +"<TD>value1</TD></TR>\r\n" +"<TR>\r\n" +"<TD>title2</TD>\r\n" +"<TD>value2</TD></TR></TBODY></TABLE></BODY>"; + +IHTMLDocument2 *html_doc; +BOOL loaded; + +static int html_src_compare(LPCWSTR strw, const char *stra) +{ + char buf[2048], *p1; + const char *p2; + + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + + p1 = buf; + p2 = stra; + while(1) { + while(*p1=='\r' || *p1=='\n' || *p1=='"') p1++; + while(*p2=='\r' || *p2=='\n') p2++; + + if(!*p1 || !*p2 || tolower(*p1)!=tolower(*p2)) + break; + + p1++; + p2++; + } + + return *p1 != *p2; +} + +static HRESULT WINAPI HTMLEvents_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) { + *ppv = iface; + return S_OK; + } + + ok(0, "Unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI HTMLEvents_AddRef(IDispatch *iface) +{ + return 2; +} + +static ULONG WINAPI HTMLEvents_Release(IDispatch *iface) +{ + return 1; +} + +static HRESULT WINAPI HTMLEvents_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEvents_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, + ITypeInfo **ppTInfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEvents_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEvents_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + if(dispIdMember == DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE) { + static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0}; + BSTR state; + + IHTMLDocument2_get_readyState(html_doc, &state); + if(!memcmp(state, completeW, sizeof(completeW))) + loaded = TRUE; + } + + return S_OK; +} + +static const IDispatchVtbl HTMLEventsVtbl = { + HTMLEvents_QueryInterface, + HTMLEvents_AddRef, + HTMLEvents_Release, + HTMLEvents_GetTypeInfoCount, + HTMLEvents_GetTypeInfo, + HTMLEvents_GetIDsOfNames, + HTMLEvents_Invoke +}; + +static IDispatch HTMLEvents = { &HTMLEventsVtbl }; + static void test_QueryInterface(void) { IUnknown *xmlview, *unk; @@ -73,9 +187,85 @@ static void test_QueryInterface(void) IUnknown_Release(xmlview); }
+static void test_Load(void) +{ + static const WCHAR xmlview_xmlW[] = {'/','x','m','l','/','x','m','l','v','i','e','w','.','x','m','l',0}; + static const WCHAR res[] = {'r','e','s',':','/','/',0}; + + WCHAR buf[1024]; + IPersistMoniker *pers_mon; + IConnectionPointContainer *cpc; + IConnectionPoint *cp; + IMoniker *mon; + IBindCtx *bctx; + IHTMLElement *elem; + HRESULT hres; + MSG msg; + BSTR source; + + lstrcpyW(buf, res); + GetModuleFileNameW(NULL, buf+lstrlenW(buf), (sizeof(buf)-sizeof(res))/sizeof(WCHAR)); + lstrcatW(buf, xmlview_xmlW); + + if(!pCreateURLMoniker) { + win_skip("CreateURLMoniker not available\n"); + return; + } + + hres = CoCreateInstance(&CLSID_XMLView, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IPersistMoniker, (void**)&pers_mon); + if(FAILED(hres)) { + win_skip("Failed to create XMLView instance\n"); + return; + } + ok(hres == S_OK, "CoCreateInstance returned %x, expected S_OK\n", hres); + + hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IHTMLDocument2, (void**)&html_doc); + ok(hres == S_OK, "QueryInterface(HTMLDocument2) returned %x, expected S_OK\n", hres); + hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IConnectionPointContainer, (void**)&cpc); + ok(hres == S_OK, "QueryInterface(IConnectionPointContainer) returned %x, expected S_OK\n", hres); + hres = IConnectionPointContainer_FindConnectionPoint(cpc, &IID_IDispatch, &cp); + ok(hres == S_OK, "FindConnectionPoint returned %x, expected S_OK\n", hres); + hres = IConnectionPoint_Advise(cp, (IUnknown*)&HTMLEvents, NULL); + ok(hres == S_OK, "Advise returned %x, expected S_OK\n", hres); + IConnectionPoint_Release(cp); + IConnectionPointContainer_Release(cpc); + + hres = CreateBindCtx(0, &bctx); + ok(hres == S_OK, "CreateBindCtx returned %x, expected S_OK\n", hres); + hres = pCreateURLMoniker(NULL, buf, &mon); + ok(hres == S_OK, "CreateUrlMoniker returned %x, expected S_OK\n", hres); + loaded = FALSE; + hres = IPersistMoniker_Load(pers_mon, TRUE, mon, bctx, 0); + ok(hres == S_OK, "Load returned %x, expected S_OK\n", hres); + IBindCtx_Release(bctx); + IMoniker_Release(mon); + + while(!loaded && GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + hres = IHTMLDocument2_get_body(html_doc, &elem); + ok(hres == S_OK, "get_body returned %x, expected S_OK\n", hres); + hres = IHTMLElement_get_outerHTML(elem, &source); + ok(hres == S_OK, "get_outerHTML returned %x, expected S_OK\n", hres); + ok(!html_src_compare(source, xmlview_html), "Incorrect HTML source: %s\n", wine_dbgstr_w(source)); + IHTMLElement_Release(elem); + SysFreeString(source); + + IHTMLDocument2_Release(html_doc); + html_doc = NULL; + IPersistMoniker_Release(pers_mon); +} + START_TEST(xmlview) { + HMODULE urlmon = LoadLibraryA("urlmon.dll"); + pCreateURLMoniker = (void*)GetProcAddress(urlmon, "CreateURLMoniker"); + CoInitialize(NULL); test_QueryInterface(); + test_Load(); CoUninitialize(); } diff --git a/dlls/msxml3/tests/xmlview.xml b/dlls/msxml3/tests/xmlview.xml new file mode 100644 index 0000000..a3c4bf4 --- /dev/null +++ b/dlls/msxml3/tests/xmlview.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<?xml-stylesheet type="text/xsl" href="xmlview.xsl"?> +<test> + <field> + <title>title1</title> + <value>value1</value> + </field> + <field> + <title>title2</title> + <value>value2</value> + </field> +</test> diff --git a/dlls/msxml3/tests/xmlview.xsl b/dlls/msxml3/tests/xmlview.xsl new file mode 100644 index 0000000..1b20f35 --- /dev/null +++ b/dlls/msxml3/tests/xmlview.xsl @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> + +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform%22%3E + +<xsl:template match="/"> + <html> + <body> + <h2>Generated HTML</h2> + <table> + <tr bgcolor="green"> + <th>Title</th> + <th>Value</th> + </tr> + <xsl:for-each select="test/field"> + <tr> + <td><xsl:value-of select="title"/></td> + <td><xsl:value-of select="value"/></td> + </tr> + </xsl:for-each> + </table> + </body> + </html> +</xsl:template> + +</xsl:stylesheet>