diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index e8ce9b4a838..ec556624bb7 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;
+}
- return hres;
+static void release_document(IHTMLDocument2 *doc)
+{
+ IUnknown *unk;
+ ULONG ref;
+ HRESULT 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();