[MSHTML_WINETEST]
[reactos.git] / rostests / winetests / mshtml / events.c
index e985dba..f8f833b 100644 (file)
@@ -83,11 +83,13 @@ DEFINE_EXPECT(submit_onclick_attached);
 DEFINE_EXPECT(submit_onclick_attached_check_cancel);
 DEFINE_EXPECT(submit_onclick_setret);
 DEFINE_EXPECT(elem2_cp_onclick);
+DEFINE_EXPECT(iframe_onload);
 
 static HWND container_hwnd = NULL;
 static IHTMLWindow2 *window;
 static IOleDocumentView *view;
 static BOOL xy_todo;
+static BOOL is_ie9plus;
 
 typedef struct {
     LONG x;
@@ -125,18 +127,6 @@ static const char form_doc_str[] =
     "<input type=\"submit\" id=\"submitid\" />"
     "</form></body></html>";
 
-static const char *debugstr_guid(REFIID riid)
-{
-    static char buf[50];
-
-    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]);
-
-    return buf;
-}
-
 static int strcmp_wa(LPCWSTR strw, const char *stra)
 {
     CHAR buf[512];
@@ -198,7 +188,7 @@ static void _test_disp(unsigned line, IUnknown *unk, const IID *diid)
         hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
         ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08x\n", hres);
         ok_(__FILE__,line) (IsEqualGUID(&type_attr->guid, diid), "unexpected guid %s\n",
-                            debugstr_guid(&type_attr->guid));
+                            wine_dbgstr_guid(&type_attr->guid));
 
         ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
         ITypeInfo_Release(typeinfo);
@@ -255,6 +245,18 @@ static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk)
     return elem3;
 }
 
+#define get_iframe_iface(u) _get_iframe_iface(__LINE__,u)
+static IHTMLIFrameElement *_get_iframe_iface(unsigned line, IUnknown *unk)
+{
+    IHTMLIFrameElement *iframe;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IHTMLIFrameElement, (void**)&iframe);
+    ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLIFrameElement) failed: %08x\n", hres);
+
+    return iframe;
+}
+
 #define doc_get_body(d) _doc_get_body(__LINE__,d)
 static IHTMLElement *_doc_get_body(unsigned line, IHTMLDocument2 *doc)
 {
@@ -729,7 +731,7 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
        || IsEqualGUID(riid, &IID_IDispatchEx))
         *ppv = iface;
     else {
-        ok(0, "unexpected riid %s\n", debugstr_guid(riid));
+        ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
         return E_NOINTERFACE;
     }
 
@@ -746,7 +748,7 @@ static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, v
     }else if(IsEqualGUID(riid, &IID_IDispatchEx)) {
         return E_NOINTERFACE;
     }else {
-        ok(0, "unexpected riid %s\n", debugstr_guid(riid));
+        ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
         return E_NOINTERFACE;
     }
 
@@ -1005,6 +1007,17 @@ static HRESULT WINAPI submit_onclick(IDispatchEx *iface, DISPID id, LCID lcid, W
 
 EVENT_HANDLER_FUNC_OBJ(submit_onclick);
 
+static HRESULT WINAPI iframe_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+        VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
+{
+    CHECK_EXPECT(iframe_onload);
+    test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller);
+    test_event_src("IFRAME");
+    return S_OK;
+}
+
+EVENT_HANDLER_FUNC_OBJ(iframe_onload);
+
 static HRESULT WINAPI submit_onclick_attached(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 {
@@ -1200,7 +1213,7 @@ EVENT_HANDLER_FUNC_OBJ(nocall);
            || IsEqualGUID(riid, &diid)) \
             *ppv = iface; \
         else { \
-            ok(0, "unexpected riid %s\n", debugstr_guid(riid)); \
+            ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); \
             return E_NOINTERFACE; \
         } \
         return S_OK; \
@@ -1227,7 +1240,7 @@ EVENT_HANDLER_FUNC_OBJ(nocall);
 #define test_cp_args(a,b,c,d,e,f) _test_cp_args(__LINE__,a,b,c,d,e,f)
 static void _test_cp_args(unsigned line, REFIID riid, WORD flags, DISPPARAMS *dp, VARIANT *vres, EXCEPINFO *ei, UINT *argerr)
 {
-    ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags);
     ok_(__FILE__,line)(dp != NULL, "dp == NULL\n");
     ok_(__FILE__,line)(!dp->cArgs, "dp->cArgs = %d\n", dp->cArgs);
@@ -1245,7 +1258,7 @@ static void _test_cp_eventarg(unsigned line, REFIID riid, WORD flags, DISPPARAMS
 {
     IHTMLEventObj *event;
 
-    ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags);
     ok_(__FILE__,line)(dp != NULL, "dp == NULL\n");
     ok_(__FILE__,line)(dp->cArgs == 1, "dp->cArgs = %d\n", dp->cArgs);
@@ -1329,7 +1342,7 @@ static HRESULT WINAPI timeoutFunc_Invoke(IDispatchEx *iface, DISPID dispIdMember
     CHECK_EXPECT(timeout);
 
     ok(dispIdMember == DISPID_VALUE, "dispIdMember = %d\n", dispIdMember);
-    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
     ok(!lcid, "lcid = %x\n", lcid);
     ok(pDispParams != NULL, "pDispParams == NULL\n");
@@ -1373,7 +1386,7 @@ static HRESULT WINAPI div_onclick_disp_Invoke(IDispatchEx *iface, DISPID id,
 
     test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
 
-    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok(!puArgErr, "puArgErr = %p\n", puArgErr);
 
     return S_OK;
@@ -1398,12 +1411,12 @@ static void pump_msgs(BOOL *b)
     if(b) {
         while(!*b && GetMessageW(&msg, NULL, 0, 0)) {
             TranslateMessage(&msg);
-            DispatchMessage(&msg);
+            DispatchMessageW(&msg);
         }
     }else {
         while(!b && PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
             TranslateMessage(&msg);
-            DispatchMessage(&msg);
+            DispatchMessageW(&msg);
         }
     }
 }
@@ -1493,7 +1506,7 @@ static HRESULT WINAPI EventDispatch_Invoke(IDispatch *iface, DISPID dispIdMember
         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
         EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
-    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok(pDispParams != NULL, "pDispParams == NULL\n");
     ok(pExcepInfo != NULL, "pExcepInfo == NULL\n");
     ok(puArgErr != NULL, "puArgErr == NULL\n");
@@ -2070,6 +2083,8 @@ static void test_submit(IHTMLDocument2 *doc)
     CHECK_CALLED(submit_onclick_attached_check_cancel);
     CHECK_CALLED(submit_onclick_attached);
 
+    if(1)pump_msgs(NULL);
+
     IHTMLElement_Release(submit);
 }
 
@@ -2156,16 +2171,19 @@ static IHTMLDocument2* get_iframe_doc(IHTMLIFrameElement *iframe)
 
 static void test_iframe_connections(IHTMLDocument2 *doc)
 {
-    HRESULT hres;
     IHTMLIFrameElement *iframe;
     IHTMLDocument2 *iframes_doc;
     DWORD cookie;
     IConnectionPoint *cp;
-    IHTMLElement *element = find_element_by_id(doc, "ifr");
+    IHTMLElement *element;
+    BSTR str;
+    HRESULT hres;
 
-    hres = IHTMLElement_QueryInterface(element, &IID_IHTMLIFrameElement, (void**)&iframe);
+    trace("iframe tests...\n");
+
+    element = find_element_by_id(doc, "ifr");
+    iframe = get_iframe_iface((IUnknown*)element);
     IHTMLElement_Release(element);
-    ok(hres == S_OK, "QueryInterface(IID_IHTMLIFrameElement) failed: %08x\n", hres);
 
     iframes_doc = get_iframe_doc(iframe);
     IHTMLIFrameElement_Release(iframe);
@@ -2177,6 +2195,43 @@ static void test_iframe_connections(IHTMLDocument2 *doc)
     IConnectionPoint_Release(cp);
     ok(hres == CONNECT_E_NOCONNECTION, "Unadvise returned %08x, expected CONNECT_E_NOCONNECTION\n", hres);
 
+    unregister_cp((IUnknown*)iframes_doc, &IID_IDispatch, cookie);
+
+    if(is_ie9plus) {
+        IHTMLFrameBase2 *frame_base2;
+        VARIANT v;
+
+        hres = IHTMLIFrameElement_QueryInterface(iframe, &IID_IHTMLFrameBase2, (void**)&frame_base2);
+        ok(hres == S_OK, "Could not get IHTMLFrameBase2 iface: %08x\n", hres);
+
+        V_VT(&v) = VT_DISPATCH;
+        V_DISPATCH(&v) = (IDispatch*)&iframe_onload_obj;
+        hres = IHTMLFrameBase2_put_onload(frame_base2, v);
+        ok(hres == S_OK, "put_onload failed: %08x\n", hres);
+
+        IHTMLFrameBase2_Release(frame_base2);
+
+        str = a2bstr("about:blank");
+        hres = IHTMLDocument2_put_URL(iframes_doc, str);
+        ok(hres == S_OK, "put_URL failed: %08x\n", hres);
+        SysFreeString(str);
+
+        SET_EXPECT(iframe_onload);
+        pump_msgs(&called_iframe_onload);
+        CHECK_CALLED(iframe_onload);
+
+        str = a2bstr("about:test");
+        hres = IHTMLDocument2_put_URL(iframes_doc, str);
+        ok(hres == S_OK, "put_URL failed: %08x\n", hres);
+        SysFreeString(str);
+
+        SET_EXPECT(iframe_onload);
+        pump_msgs(&called_iframe_onload);
+        CHECK_CALLED(iframe_onload);
+    }else {
+        win_skip("Skipping iframe onload tests on IE older than 9.\n");
+    }
+
     IHTMLDocument2_Release(iframes_doc);
 }
 
@@ -2684,24 +2739,12 @@ static void set_client_site(IHTMLDocument2 *doc, BOOL set)
 static IHTMLDocument2 *create_document(void)
 {
     IHTMLDocument2 *doc;
-    IHTMLDocument5 *doc5;
     HRESULT hres;
 
     hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
             &IID_IHTMLDocument2, (void**)&doc);
     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
-    if (FAILED(hres))
-        return NULL;
-
-    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
-    if(FAILED(hres)) {
-        win_skip("Could not get IHTMLDocument5 interface, probably too old IE\n");
-        IHTMLDocument2_Release(doc);
-        return NULL;
-    }
-
-    IHTMLDocument5_Release(doc5);
-    return doc;
+    return SUCCEEDED(hres) ? doc : NULL;
 }
 
 
@@ -2722,9 +2765,9 @@ static void run_test(const char *str, testfunc_t test)
     doc_load_string(doc, str);
     do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
 
-    while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) {
+    while(!doc_complete && GetMessageA(&msg, NULL, 0, 0)) {
         TranslateMessage(&msg);
-        DispatchMessage(&msg);
+        DispatchMessageA(&msg);
     }
 
     hres = IHTMLDocument2_get_body(doc, &body);
@@ -2751,7 +2794,7 @@ static void run_test(const char *str, testfunc_t test)
 
 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-    return DefWindowProc(hwnd, msg, wParam, lParam);
+    return DefWindowProcA(hwnd, msg, wParam, lParam);
 }
 
 static HWND create_container_window(void)
@@ -2802,24 +2845,57 @@ static void test_empty_document(void)
     IHTMLDocument2_Release(doc);
 }
 
+static BOOL check_ie(void)
+{
+    IHTMLDocument2 *doc;
+    IHTMLDocument5 *doc5;
+    IHTMLDocument7 *doc7;
+    HRESULT hres;
+
+    doc = create_document();
+    if(!doc)
+        return FALSE;
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7);
+    if(SUCCEEDED(hres)) {
+        is_ie9plus = TRUE;
+        IHTMLDocument7_Release(doc7);
+    }
+
+    trace("is_ie9plus %x\n", is_ie9plus);
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
+    if(SUCCEEDED(hres))
+        IHTMLDocument5_Release(doc5);
+
+    IHTMLDocument2_Release(doc);
+    return SUCCEEDED(hres);
+}
+
 START_TEST(events)
 {
     CoInitialize(NULL);
-    container_hwnd = create_container_window();
 
-    if(winetest_interactive)
-        ShowWindow(container_hwnd, SW_SHOW);
+    if(check_ie()) {
+        container_hwnd = create_container_window();
 
-    run_test(empty_doc_str, test_timeout);
-    run_test(click_doc_str, test_onclick);
-    run_test(readystate_doc_str, test_onreadystatechange);
-    run_test(img_doc_str, test_imgload);
-    run_test(input_doc_str, test_focus);
-    run_test(form_doc_str, test_submit);
-    run_test(iframe_doc_str, test_iframe_connections);
+        if(winetest_interactive)
+            ShowWindow(container_hwnd, SW_SHOW);
 
-    test_empty_document();
+        run_test(empty_doc_str, test_timeout);
+        run_test(click_doc_str, test_onclick);
+        run_test(readystate_doc_str, test_onreadystatechange);
+        run_test(img_doc_str, test_imgload);
+        run_test(input_doc_str, test_focus);
+        run_test(form_doc_str, test_submit);
+        run_test(iframe_doc_str, test_iframe_connections);
+
+        test_empty_document();
+
+        DestroyWindow(container_hwnd);
+    }else {
+        win_skip("Too old IE\n");
+    }
 
-    DestroyWindow(container_hwnd);
     CoUninitialize();
 }