[PATCH 1/3] msxml3/tests: Add some tests for XML loading with site assigned.

Dmitry Timoshkov dmitry at baikal.ru
Tue Jun 23 02:35:37 CDT 2020


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/msxml3/tests/domdoc.c | 144 +++++++++++++++++++++++++++++++++++++
 1 file changed, 144 insertions(+)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index a6acdba366..b7cd57a069 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -37,6 +37,7 @@
 #include "dispex.h"
 #include "objsafe.h"
 #include "mshtml.h"
+#include "docobj.h"
 #include "initguid.h"
 #include "asptlb.h"
 
@@ -13015,6 +13016,148 @@ static void test_namespaces_as_attributes(void)
     free_bstrs();
 }
 
+static const IID *qi_list[32];
+static int qi_count;
+
+static BOOL qi_list_contains(REFIID iid)
+{
+    int i;
+
+    for (i = 0; i < qi_count; i++)
+    {
+        if (IsEqualGUID(qi_list[i], iid))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static BOOL qi_list_contains_service(REFIID service, REFIID iid)
+{
+    int i;
+
+    for (i = 0; i < qi_count; i++)
+    {
+        if (IsEqualGUID(qi_list[i], service) && IsEqualGUID(qi_list[i + 1], iid))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID iid, void **ppv)
+{
+    trace("sp_QueryInterface: %s\n", wine_dbgstr_guid(iid));
+
+    if (qi_count < ARRAY_SIZE(qi_list))
+        qi_list[qi_count++] = iid;
+    else
+        ok(0, "qi_list overflow: %d\n", qi_count);
+
+    if (IsEqualGUID(iid, &IID_IUnknown) ||
+        IsEqualGUID(iid, &IID_IServiceProvider))
+    {
+        *ppv = iface;
+        return S_OK;
+    }
+
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI sp_AddRef(IServiceProvider *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI sp_Release(IServiceProvider *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID service,
+                                      REFIID iid, void **ppv)
+{
+    trace("sp_QueryService: %s, %s\n", wine_dbgstr_guid(service), wine_dbgstr_guid(iid));
+
+    if (IsEqualGUID(service, &SID_SContainerDispatch) ||
+        IsEqualGUID(service, &SID_SInternetHostSecurityManager))
+    {
+        if (qi_count + 1 < ARRAY_SIZE(qi_list))
+        {
+            qi_list[qi_count++] = service;
+            qi_list[qi_count++] = iid;
+        }
+        else
+            ok(0, "qi_list overflow: %d\n", qi_count);
+    }
+
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static const IServiceProviderVtbl sp_vtbl =
+{
+    sp_QueryInterface,
+    sp_AddRef,
+    sp_Release,
+    sp_QueryService
+};
+
+static IServiceProvider sp = { &sp_vtbl };
+
+static void test_load_with_site(void)
+{
+    char path[MAX_PATH];
+    IXMLDOMDocument2 *doc;
+    IObjectWithSite *site;
+    VARIANT var;
+    VARIANT_BOOL b;
+    HRESULT hr;
+
+    GetTempPathA(MAX_PATH, path);
+    strcat(path, "winetest.xml");
+    write_to_file(path, win1252xml);
+
+    doc = create_document(&IID_IXMLDOMDocument2);
+
+    hr = IXMLDOMDocument2_QueryInterface(doc, &IID_IObjectWithSite, (void **)&site);
+    ok(hr == S_OK, "got %#x\n", hr);
+
+    qi_count = 0;
+    hr = IObjectWithSite_SetSite(site, (IUnknown *)&sp);
+    ok(hr == S_OK, "got %#x\n", hr);
+todo_wine
+    ok(qi_count != 0, "got %d QI calls\n", qi_count);
+todo_wine
+    ok(qi_list_contains(&IID_IXMLDOMDocument), "QI(IID_IXMLDOMDocument) was not called\n");
+todo_wine
+    ok(qi_list_contains(&IID_IHTMLDocument2), "QI(IID_IHTMLDocument2) was not called\n");
+todo_wine
+    ok(qi_list_contains(&IID_IServiceProvider), "QI(IID_IServiceProvider) was not called\n");
+todo_wine
+    ok(qi_list_contains(&IID_IOleClientSite), "QI(IID_IOleClientSite) was not called\n");
+todo_wine
+    ok(qi_list_contains_service(&SID_SContainerDispatch, &IID_IHTMLDocument2),
+       "QI(SID_SContainerDispatch, IID_IHTMLDocument2) was not called\n");
+todo_wine
+    ok(qi_list_contains_service(&SID_SInternetHostSecurityManager, &IID_IXMLDOMDocument),
+       "QI(SID_SInternetHostSecurityManager, IID_IXMLDOMDocument) was not called\n");
+
+    qi_count = 0;
+    V_VT(&var) = VT_BSTR;
+    V_BSTR(&var) = _bstr_(path);
+    hr = IXMLDOMDocument2_load(doc, var, &b);
+    ok(hr == S_OK, "got %#x\n", hr);
+    ok(b == VARIANT_TRUE, "got %d\n", b);
+    ok(qi_count == 0, "got %d QI calls\n", qi_count);
+    SysFreeString(V_BSTR(&var));
+
+    IXMLDOMDocument2_Release(doc);
+
+    DeleteFileA(path);
+}
+
 START_TEST(domdoc)
 {
     HRESULT hr;
@@ -13031,6 +13174,7 @@ START_TEST(domdoc)
         return;
     }
 
+    test_load_with_site();
     test_domdoc();
     test_persiststream();
     test_domnode();
-- 
2.26.2




More information about the wine-devel mailing list