Jacek Caban : mshtml: Fixed ref count tests on broken IEs.

Alexandre Julliard julliard at winehq.org
Thu Nov 25 11:18:57 CST 2010


Module: wine
Branch: master
Commit: 387ed3c8557ac5beef44a6d68deb3f66ad7c3c50
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=387ed3c8557ac5beef44a6d68deb3f66ad7c3c50

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov 25 14:32:31 2010 +0100

mshtml: Fixed ref count tests on broken IEs.

Also some code clean up.

---

 dlls/mshtml/tests/htmldoc.c |  134 ++++++++++++++++++++-----------------------
 1 files changed, 63 insertions(+), 71 deletions(-)

diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index e8ce9b4..ec55662 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -4358,26 +4358,34 @@ static void test_Hide(void)
     ok(hres == S_OK, "Show failed: %08x\n", hres);
 }
 
-static HRESULT create_document(IHTMLDocument2 **doc)
+static IHTMLDocument2 *create_document(void)
 {
-    IHTMLDocument5 *doc5;
+    IHTMLDocument2 *doc;
     HRESULT hres;
 
     hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
-            &IID_IHTMLDocument2, (void**)doc);
+            &IID_IHTMLDocument2, (void**)&doc);
     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
     if(FAILED(hres))
-        return hres;
+        return NULL;
 
-    hres = IHTMLDocument2_QueryInterface(*doc, &IID_IHTMLDocument5, (void**)&doc5);
-    if(SUCCEEDED(hres)) {
-        IHTMLDocument5_Release(doc5);
-    }else {
-        win_skip("Could not get IHTMLDocument5, probably too old IE\n");
-        IHTMLDocument2_Release(*doc);
-    }
+    return doc;
+}
+
+static void release_document(IHTMLDocument2 *doc)
+{
+    IUnknown *unk;
+    ULONG ref;
+    HRESULT hres;
 
-    return hres;
+    /* Some broken IEs don't like if the last released reference is IHTMLDocument2 iface.
+     * To workaround it, we release it via IUnknown iface */
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
+    ok(hres == S_OK, "Could not get IUnknown iface: %08x\n", hres);
+
+    IHTMLDocument2_Release(doc);
+    ref = IUnknown_Release(unk);
+    ok(!ref, "ref = %d\n", ref);
 }
 
 static void test_Navigate(IHTMLDocument2 *doc)
@@ -4555,16 +4563,12 @@ static void init_test(enum load_state_t ls) {
 static void test_HTMLDocument(BOOL do_load)
 {
     IHTMLDocument2 *doc;
-    HRESULT hres;
-    ULONG ref;
 
     trace("Testing HTMLDocument (%s)...\n", (do_load ? "load" : "no load"));
 
     init_test(do_load ? LD_DOLOAD : LD_NO);
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     test_QueryInterface(doc);
@@ -4645,27 +4649,20 @@ static void test_HTMLDocument(BOOL do_load)
     view = NULL;
 
     ok(IsWindow(hwnd), "hwnd is destroyed\n");
-
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
-
+    release_document(doc);
     ok(!IsWindow(hwnd), "hwnd is not destroyed\n");
 }
 
 static void test_HTMLDocument_hlink(void)
 {
     IHTMLDocument2 *doc;
-    HRESULT hres;
-    ULONG ref;
 
     trace("Testing HTMLDocument (hlink)...\n");
 
     init_test(LD_DOLOAD);
     ipsex = TRUE;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     test_ViewAdviseSink(doc);
@@ -4696,8 +4693,7 @@ static void test_HTMLDocument_hlink(void)
         IOleDocumentView_Release(view);
     view = NULL;
 
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void test_cookies(IHTMLDocument2 *doc)
@@ -4768,9 +4764,7 @@ static void test_HTMLDocument_http(void)
     init_test(LD_DOLOAD);
     ipsex = TRUE;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     hres = CreateURLMoniker(NULL, http_urlW, &http_mon);
@@ -4804,8 +4798,7 @@ static void test_HTMLDocument_http(void)
         IOleDocumentView_Release(view);
     view = NULL;
 
-    ref = IHTMLDocument2_Release(doc);
-    ok(!ref, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 
     ref = IMoniker_Release(http_mon);
     ok(!ref, "ref=%d, expected 0\n", ref);
@@ -4860,16 +4853,13 @@ static void test_HTMLDocument_StreamLoad(void)
     IOleObject *oleobj;
     DWORD conn;
     HRESULT hres;
-    ULONG ref;
 
     trace("Testing HTMLDocument (IPersistStreamInit)...\n");
 
     init_test(LD_DOLOAD);
     load_from_stream = TRUE;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
@@ -4907,9 +4897,7 @@ static void test_HTMLDocument_StreamLoad(void)
         view = NULL;
     }
 
-
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void test_HTMLDocument_StreamInitNew(void)
@@ -4918,16 +4906,13 @@ static void test_HTMLDocument_StreamInitNew(void)
     IOleObject *oleobj;
     DWORD conn;
     HRESULT hres;
-    ULONG ref;
 
     trace("Testing HTMLDocument (IPersistStreamInit)...\n");
 
     init_test(LD_DOLOAD);
     load_from_stream = TRUE;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
@@ -4963,9 +4948,7 @@ static void test_HTMLDocument_StreamInitNew(void)
         view = NULL;
     }
 
-
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void test_edit_uiactivate(IOleObject *oleobj)
@@ -5002,16 +4985,13 @@ static void test_editing_mode(BOOL do_load)
     IOleObject *oleobj;
     DWORD conn;
     HRESULT hres;
-    ULONG ref;
 
     trace("Testing HTMLDocument (edit%s)...\n", do_load ? " load" : "");
 
     init_test(do_load ? LD_DOLOAD : LD_NO);
     call_UIActivate = CallUIActivate_AfterShow;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     unk = doc_unk = (IUnknown*)doc;
 
     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
@@ -5080,8 +5060,7 @@ static void test_editing_mode(BOOL do_load)
         view = NULL;
     }
 
-    ref = IUnknown_Release(unk);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw)
@@ -5090,15 +5069,12 @@ static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw)
     IOleObject *oleobj;
     IOleInPlaceSite *inplacesite;
     HRESULT hres;
-    ULONG ref;
 
     trace("Running OleDocumentView_UIActivate tests (%d %d %d)\n", do_load, use_ipsex, use_ipsw);
 
     init_test(do_load ? LD_DOLOAD : LD_NO);
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
     doc_unk = (IUnknown*)doc;
 
     ipsex = use_ipsex;
@@ -5232,8 +5208,7 @@ static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw)
     IOleDocumentView_Release(view);
     view = NULL;
 
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void register_protocol(void)
@@ -5258,11 +5233,8 @@ static void test_HTMLDoc_ISupportErrorInfo(void)
     IHTMLDocument2 *doc;
     HRESULT hres;
     ISupportErrorInfo *sinfo;
-    LONG ref;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
 
     hres = IUnknown_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&sinfo);
     ok(hres == S_OK, "got %x\n", hres);
@@ -5274,33 +5246,53 @@ static void test_HTMLDoc_ISupportErrorInfo(void)
         IUnknown_Release(sinfo);
     }
 
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
 }
 
 static void test_IPersistHistory(void)
 {
     IHTMLDocument2 *doc;
     HRESULT hres;
-    LONG ref;
     IPersistHistory *phist;
 
-    hres = create_document(&doc);
-    if(FAILED(hres))
-        return;
+    doc = create_document();
 
     hres = IUnknown_QueryInterface(doc, &IID_IPersistHistory, (void**)&phist);
     ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres);
     if(hres == S_OK)
         IPersistHistory_Release(phist);
 
-    ref = IHTMLDocument2_Release(doc);
-    ok(ref == 0, "ref=%d, expected 0\n", ref);
+    release_document(doc);
+}
+
+static BOOL check_ie(void)
+{
+    IHTMLDocument2 *doc;
+    IHTMLDocument5 *doc5;
+    HRESULT hres;
+
+    doc = create_document();
+    if(!doc)
+        return FALSE;
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
+    if(SUCCEEDED(hres))
+        IHTMLDocument5_Release(doc5);
+
+    release_document(doc);
+    return SUCCEEDED(hres);
 }
 
 START_TEST(htmldoc)
 {
     CoInitialize(NULL);
+
+    if(!check_ie()) {
+        CoUninitialize();
+        win_skip("Too old IE\n");
+        return;
+    }
+
     container_hwnd = create_container_window();
     register_protocol();
 




More information about the wine-cvs mailing list