2 * Copyright 2008-2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <wine/test.h>
27 //#include "winbase.h"
35 #define DEFINE_EXPECT(func) \
36 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
38 #define SET_EXPECT(func) \
39 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
41 #define CHECK_EXPECT2(func) \
44 ok(expect_ ##func, "unexpected call " #func "\n"); \
45 called_ ## func = TRUE; \
48 #define CHECK_EXPECT(func) \
50 CHECK_EXPECT2(func); \
51 expect_ ## func = FALSE; \
54 #define CHECK_CALLED(func) \
56 ok(called_ ## func, "expected " #func "\n"); \
57 expect_ ## func = called_ ## func = FALSE; \
60 DEFINE_EXPECT(document_onclick
);
61 DEFINE_EXPECT(body_onclick
);
62 DEFINE_EXPECT(doc_onclick_attached
);
63 DEFINE_EXPECT(div_onclick
);
64 DEFINE_EXPECT(div_onclick_attached
);
65 DEFINE_EXPECT(timeout
);
66 DEFINE_EXPECT(doccp_onclick
);
67 DEFINE_EXPECT(doccp_onclick_cancel
);
68 DEFINE_EXPECT(div_onclick_disp
);
69 DEFINE_EXPECT(invoke_onclick
);
70 DEFINE_EXPECT(iframe_onreadystatechange_loading
);
71 DEFINE_EXPECT(iframe_onreadystatechange_interactive
);
72 DEFINE_EXPECT(iframe_onreadystatechange_complete
);
73 DEFINE_EXPECT(iframedoc_onreadystatechange
);
74 DEFINE_EXPECT(img_onload
);
75 DEFINE_EXPECT(img_onerror
);
76 DEFINE_EXPECT(input_onfocus
);
77 DEFINE_EXPECT(input_onblur
);
78 DEFINE_EXPECT(form_onsubmit
);
79 DEFINE_EXPECT(form_onclick
);
80 DEFINE_EXPECT(submit_onclick
);
81 DEFINE_EXPECT(submit_onclick_cancel
);
82 DEFINE_EXPECT(submit_onclick_attached
);
83 DEFINE_EXPECT(submit_onclick_attached_check_cancel
);
84 DEFINE_EXPECT(submit_onclick_setret
);
85 DEFINE_EXPECT(elem2_cp_onclick
);
86 DEFINE_EXPECT(iframe_onload
);
88 static HWND container_hwnd
= NULL
;
89 static IHTMLWindow2
*window
;
90 static IOleDocumentView
*view
;
92 static BOOL is_ie9plus
;
101 static const xy_test_t no_xy
= {-10,-10,-10,-10};
102 static const xy_test_t zero_xy
= {0,0,0,0};
104 static const char empty_doc_str
[] =
107 static const char click_doc_str
[] =
109 "<div id=\"clickdiv\" style=\"text-align: center; background: red; font-size: 32\">click here</div>"
112 static const char readystate_doc_str
[] =
113 "<html><body><iframe id=\"iframe\"></iframe></body></html>";
115 static const char img_doc_str
[] =
116 "<html><body><img id=\"imgid\"></img></body></html>";
118 static const char input_doc_str
[] =
119 "<html><body><input id=\"inputid\"></input></body></html>";
121 static const char iframe_doc_str
[] =
122 "<html><body><iframe id=\"ifr\">Testing</iframe></body></html>";
124 static const char form_doc_str
[] =
125 "<html><body><form id=\"formid\" method=\"post\" action=\"about:blank\">"
126 "<input type=\"text\" value=\"test\" name=\"i\"/>"
127 "<input type=\"submit\" id=\"submitid\" />"
128 "</form></body></html>";
130 static int strcmp_wa(LPCWSTR strw
, const char *stra
)
133 WideCharToMultiByte(CP_ACP
, 0, strw
, -1, buf
, sizeof(buf
), NULL
, NULL
);
134 return lstrcmpA(stra
, buf
);
137 static BSTR
a2bstr(const char *str
)
142 len
= MultiByteToWideChar(CP_ACP
, 0, str
, -1, NULL
, 0);
143 ret
= SysAllocStringLen(NULL
, len
-1);
144 MultiByteToWideChar(CP_ACP
, 0, str
, -1, ret
, len
);
149 static BOOL
iface_cmp(IUnknown
*iface1
, IUnknown
*iface2
)
151 IUnknown
*unk1
, *unk2
;
156 IUnknown_QueryInterface(iface1
, &IID_IUnknown
, (void**)&unk1
);
157 IUnknown_Release(unk1
);
158 IUnknown_QueryInterface(iface1
, &IID_IUnknown
, (void**)&unk2
);
159 IUnknown_Release(unk2
);
164 #define test_disp(u,id) _test_disp(__LINE__,u,id)
165 static void _test_disp(unsigned line
, IUnknown
*unk
, const IID
*diid
)
172 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatchEx
, (void**)&dispex
);
173 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IDispatch: %08x\n", hres
);
178 hres
= IDispatchEx_GetTypeInfoCount(dispex
, &ticnt
);
179 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeInfoCount failed: %08x\n", hres
);
180 ok_(__FILE__
,line
) (ticnt
== 1, "ticnt=%u\n", ticnt
);
182 hres
= IDispatchEx_GetTypeInfo(dispex
, 0, 0, &typeinfo
);
183 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeInfo failed: %08x\n", hres
);
185 if(SUCCEEDED(hres
)) {
188 hres
= ITypeInfo_GetTypeAttr(typeinfo
, &type_attr
);
189 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeAttr failed: %08x\n", hres
);
190 ok_(__FILE__
,line
) (IsEqualGUID(&type_attr
->guid
, diid
), "unexpected guid %s\n",
191 wine_dbgstr_guid(&type_attr
->guid
));
193 ITypeInfo_ReleaseTypeAttr(typeinfo
, type_attr
);
194 ITypeInfo_Release(typeinfo
);
197 IDispatchEx_Release(dispex
);
200 #define get_doc3_iface(u) _get_doc3_iface(__LINE__,u)
201 static IHTMLDocument3
*_get_doc3_iface(unsigned line
, IUnknown
*unk
)
203 IHTMLDocument3
*doc3
;
206 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLDocument3
, (void**)&doc3
);
207 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLDocument3 iface: %08x\n", hres
);
212 #define get_elem_iface(u) _get_elem_iface(__LINE__,u)
213 static IHTMLElement
*_get_elem_iface(unsigned line
, IUnknown
*unk
)
218 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement
, (void**)&elem
);
219 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLElement iface: %08x\n", hres
);
224 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
225 static IHTMLElement2
*_get_elem2_iface(unsigned line
, IUnknown
*unk
)
227 IHTMLElement2
*elem2
;
230 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement2
, (void**)&elem2
);
231 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLElement2 iface: %08x\n", hres
);
236 #define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
237 static IHTMLElement3
*_get_elem3_iface(unsigned line
, IUnknown
*unk
)
239 IHTMLElement3
*elem3
;
242 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement3
, (void**)&elem3
);
243 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLElement3 iface: %08x\n", hres
);
248 #define get_iframe_iface(u) _get_iframe_iface(__LINE__,u)
249 static IHTMLIFrameElement
*_get_iframe_iface(unsigned line
, IUnknown
*unk
)
251 IHTMLIFrameElement
*iframe
;
254 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLIFrameElement
, (void**)&iframe
);
255 ok_(__FILE__
,line
)(hres
== S_OK
, "QueryInterface(IID_IHTMLIFrameElement) failed: %08x\n", hres
);
260 #define doc_get_body(d) _doc_get_body(__LINE__,d)
261 static IHTMLElement
*_doc_get_body(unsigned line
, IHTMLDocument2
*doc
)
263 IHTMLElement
*body
= NULL
;
266 hres
= IHTMLDocument2_get_body(doc
, &body
);
267 ok_(__FILE__
,line
) (hres
== S_OK
, "get_body failed: %08x\n", hres
);
268 ok_(__FILE__
,line
) (body
!= NULL
, "body == NULL\n");
273 #define get_elem_id(d,i) _get_elem_id(__LINE__,d,i)
274 static IHTMLElement
*_get_elem_id(unsigned line
, IHTMLDocument2
*doc
, const char *id
)
276 IHTMLDocument3
*doc3
= _get_doc3_iface(line
, (IUnknown
*)doc
);
282 hres
= IHTMLDocument3_getElementById(doc3
, str
, &elem
);
284 IHTMLDocument3_Release(doc3
);
285 ok_(__FILE__
,line
) (hres
== S_OK
, "getElementById failed: %08x\n", hres
);
290 #define test_elem_tag(u,n) _test_elem_tag(__LINE__,u,n)
291 static void _test_elem_tag(unsigned line
, IUnknown
*unk
, const char *extag
)
293 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
297 hres
= IHTMLElement_get_tagName(elem
, &tag
);
298 IHTMLElement_Release(elem
);
299 ok_(__FILE__
, line
) (hres
== S_OK
, "get_tagName failed: %08x\n", hres
);
300 ok_(__FILE__
, line
) (!strcmp_wa(tag
, extag
), "got tag: %s, expected %s\n", wine_dbgstr_w(tag
), extag
);
305 #define get_event_obj() _get_event_obj(__LINE__)
306 static IHTMLEventObj
*_get_event_obj(unsigned line
)
308 IHTMLEventObj
*event
= NULL
;
311 hres
= IHTMLWindow2_get_event(window
, &event
);
312 ok_(__FILE__
,line
) (hres
== S_OK
, "get_event failed: %08x\n", hres
);
313 ok_(__FILE__
,line
) (event
!= NULL
, "event = NULL\n");
314 _test_disp(line
, (IUnknown
*)event
, &DIID_DispCEventObj
);
319 #define elem_fire_event(a,b,c) _elem_fire_event(__LINE__,a,b,c)
320 static void _elem_fire_event(unsigned line
, IUnknown
*unk
, const char *event
, VARIANT
*evobj
)
322 IHTMLElement3
*elem3
= _get_elem3_iface(line
, unk
);
329 hres
= IHTMLElement3_fireEvent(elem3
, str
, evobj
, &b
);
331 ok_(__FILE__
,line
)(hres
== S_OK
, "fireEvent failed: %08x\n", hres
);
332 ok_(__FILE__
,line
)(b
== VARIANT_TRUE
, "fireEvent returned %x\n", b
);
335 #define test_event_args(a,b,c,d,e,f,g) _test_event_args(__LINE__,a,b,c,d,e,f,g)
336 static void _test_event_args(unsigned line
, const IID
*dispiid
, DISPID id
, WORD wFlags
, DISPPARAMS
*pdp
,
337 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
339 ok_(__FILE__
,line
) (id
== DISPID_VALUE
, "id = %d\n", id
);
340 ok_(__FILE__
,line
) (wFlags
== DISPATCH_METHOD
, "wFlags = %x\n", wFlags
);
341 ok_(__FILE__
,line
) (pdp
!= NULL
, "pdp == NULL\n");
342 ok_(__FILE__
,line
) (pdp
->cArgs
== 1, "pdp->cArgs = %d\n", pdp
->cArgs
);
343 ok_(__FILE__
,line
) (pdp
->cNamedArgs
== 1, "pdp->cNamedArgs = %d\n", pdp
->cNamedArgs
);
344 ok_(__FILE__
,line
) (pdp
->rgdispidNamedArgs
[0] == DISPID_THIS
, "pdp->rgdispidNamedArgs[0] = %d\n",
345 pdp
->rgdispidNamedArgs
[0]);
346 ok_(__FILE__
,line
) (V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
347 ok_(__FILE__
,line
) (pvarRes
!= NULL
, "pvarRes == NULL\n");
348 ok_(__FILE__
,line
) (pei
!= NULL
, "pei == NULL");
349 ok_(__FILE__
,line
) (!pspCaller
, "pspCaller != NULL\n");
352 _test_disp(line
, (IUnknown
*)V_DISPATCH(pdp
->rgvarg
), dispiid
);
355 #define test_attached_event_args(a,b,c,d,e) _test_attached_event_args(__LINE__,a,b,c,d,e)
356 static void _test_attached_event_args(unsigned line
, DISPID id
, WORD wFlags
, DISPPARAMS
*pdp
,
357 VARIANT
*pvarRes
, EXCEPINFO
*pei
)
359 IHTMLEventObj
*event
;
361 ok(id
== DISPID_VALUE
, "id = %d\n", id
);
362 ok(wFlags
== DISPATCH_METHOD
, "wFlags = %x\n", wFlags
);
363 ok(pdp
!= NULL
, "pDispParams == NULL\n");
364 ok(pdp
->cArgs
== 1, "pdp->cArgs = %d\n", pdp
->cArgs
);
365 ok(!pdp
->cNamedArgs
, "pdp->cNamedArgs = %d\n", pdp
->cNamedArgs
);
366 ok(!pdp
->rgdispidNamedArgs
, "pdp->rgdispidNamedArgs = %p\n", pdp
->rgdispidNamedArgs
);
367 ok(pdp
->rgvarg
!= NULL
, "rgvarg = NULL\n");
368 ok(pvarRes
!= NULL
, "pvarRes = NULL\n");
369 ok(pei
!= NULL
, "pei = NULL\n");
370 ok(V_VT(pvarRes
) == VT_EMPTY
, "V_VT(pVarRes) = %d\n", V_VT(pvarRes
));
371 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
372 ok(V_DISPATCH(pdp
->rgvarg
) != NULL
, "V_DISPATCH(pdp->rgvarg) = %p\n", V_DISPATCH(pdp
->rgvarg
));
374 event
= _get_event_obj(line
);
375 ok(iface_cmp((IUnknown
*)event
, (IUnknown
*)V_DISPATCH(pdp
->rgvarg
)), "event != arg0\n");
376 IHTMLEventObj_Release(event
);
379 #define get_event_src() _get_event_src(__LINE__)
380 static IHTMLElement
*_get_event_src(unsigned line
)
382 IHTMLEventObj
*event
= _get_event_obj(line
);
383 IHTMLElement
*src_elem
= NULL
;
386 hres
= IHTMLEventObj_get_srcElement(event
, &src_elem
);
387 IHTMLEventObj_Release(event
);
388 ok_(__FILE__
,line
) (hres
== S_OK
, "get_srcElement failed: %08x\n", hres
);
393 #define test_event_src(t) _test_event_src(__LINE__,t)
394 static void _test_event_src(unsigned line
, const char *src_tag
)
396 IHTMLElement
*src_elem
= _get_event_src(line
);
399 ok_(__FILE__
,line
) (src_elem
!= NULL
, "src_elem = NULL\n");
400 _test_elem_tag(line
, (IUnknown
*)src_elem
, src_tag
);
401 IHTMLElement_Release(src_elem
);
403 ok_(__FILE__
,line
) (!src_elem
, "src_elem != NULL\n");
407 static void _test_event_altkey(unsigned line
, IHTMLEventObj
*event
, VARIANT_BOOL exval
)
412 hres
= IHTMLEventObj_get_altKey(event
, &b
);
413 ok_(__FILE__
,line
)(hres
== S_OK
, "get_altKey failed: %08x\n", hres
);
414 ok_(__FILE__
,line
)(b
== exval
, "altKey = %x, expected %x\n", b
, exval
);
417 static void _test_event_ctrlkey(unsigned line
, IHTMLEventObj
*event
, VARIANT_BOOL exval
)
422 hres
= IHTMLEventObj_get_ctrlKey(event
, &b
);
423 ok_(__FILE__
,line
)(hres
== S_OK
, "get_ctrlKey failed: %08x\n", hres
);
424 ok_(__FILE__
,line
)(b
== exval
, "ctrlKey = %x, expected %x\n", b
, exval
);
427 static void _test_event_shiftkey(unsigned line
, IHTMLEventObj
*event
, VARIANT_BOOL exval
)
432 hres
= IHTMLEventObj_get_shiftKey(event
, &b
);
433 ok_(__FILE__
,line
)(hres
== S_OK
, "get_shiftKey failed: %08x\n", hres
);
434 ok_(__FILE__
,line
)(b
== exval
, "shiftKey = %x, expected %x\n", b
, exval
);
437 #define test_event_cancelbubble(a,b) _test_event_cancelbubble(__LINE__,a,b)
438 static void _test_event_cancelbubble(unsigned line
, IHTMLEventObj
*event
, VARIANT_BOOL exval
)
443 hres
= IHTMLEventObj_get_cancelBubble(event
, &b
);
444 ok_(__FILE__
,line
)(hres
== S_OK
, "get_cancelBubble failed: %08x\n", hres
);
445 ok_(__FILE__
,line
)(b
== exval
, "cancelBubble = %x, expected %x\n", b
, exval
);
448 static void _test_event_fromelem(unsigned line
, IHTMLEventObj
*event
, const char *from_tag
)
453 hres
= IHTMLEventObj_get_fromElement(event
, &elem
);
454 ok_(__FILE__
,line
)(hres
== S_OK
, "get_fromElement failed: %08x\n", hres
);
456 _test_elem_tag(line
, (IUnknown
*)elem
, from_tag
);
458 ok_(__FILE__
,line
)(elem
== NULL
, "fromElement != NULL\n");
460 IHTMLElement_Release(elem
);
463 static void _test_event_toelem(unsigned line
, IHTMLEventObj
*event
, const char *to_tag
)
468 hres
= IHTMLEventObj_get_toElement(event
, &elem
);
469 ok_(__FILE__
,line
)(hres
== S_OK
, "get_toElement failed: %08x\n", hres
);
471 _test_elem_tag(line
, (IUnknown
*)elem
, to_tag
);
473 ok_(__FILE__
,line
)(elem
== NULL
, "toElement != NULL\n");
475 IHTMLElement_Release(elem
);
478 static void _test_event_keycode(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
483 hres
= IHTMLEventObj_get_keyCode(event
, &l
);
484 ok_(__FILE__
,line
)(hres
== S_OK
, "get_keyCode failed: %08x\n", hres
);
485 ok_(__FILE__
,line
)(l
== exl
, "keyCode = %x, expected %x\n", l
, exl
);
488 static void _test_event_button(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
493 hres
= IHTMLEventObj_get_button(event
, &l
);
494 ok_(__FILE__
,line
)(hres
== S_OK
, "get_button failed: %08x\n", hres
);
495 ok_(__FILE__
,line
)(l
== exl
, "button = %x, expected %x\n", l
, exl
);
498 static void _test_event_reason(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
503 hres
= IHTMLEventObj_get_reason(event
, &l
);
504 ok_(__FILE__
,line
)(hres
== S_OK
, "get_reason failed: %08x\n", hres
);
505 ok_(__FILE__
,line
)(l
== exl
, "reason = %x, expected %x\n", l
, exl
);
508 static void _test_event_x(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
513 hres
= IHTMLEventObj_get_x(event
, &l
);
514 ok_(__FILE__
,line
)(hres
== S_OK
, "get_x failed: %08x\n", hres
);
515 if(exl
!= -10) /* don't test the exact value */
516 ok_(__FILE__
,line
)(l
== exl
, "x = %d, expected %d\n", l
, exl
);
519 static void _test_event_y(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
524 hres
= IHTMLEventObj_get_y(event
, &l
);
525 ok_(__FILE__
,line
)(hres
== S_OK
, "get_y failed: %08x\n", hres
);
526 if(exl
!= -10) /* don't test the exact value */
527 ok_(__FILE__
,line
)(l
== exl
, "y = %d, expected %d\n", l
, exl
);
530 static void _test_event_clientx(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
535 hres
= IHTMLEventObj_get_clientX(event
, &l
);
536 ok_(__FILE__
,line
)(hres
== S_OK
, "get_clientX failed: %08x\n", hres
);
537 if(exl
!= -10) /* don't test the exact value */
538 ok_(__FILE__
,line
)(l
== exl
, "clientX = %d, expected %d\n", l
, exl
);
541 static void _test_event_clienty(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
546 hres
= IHTMLEventObj_get_clientY(event
, &l
);
547 ok_(__FILE__
,line
)(hres
== S_OK
, "get_clientY failed: %08x\n", hres
);
548 if(exl
!= -10) /* don't test the exact value */
549 ok_(__FILE__
,line
)(l
== exl
, "clientY = %d, expected %d\n", l
, exl
);
552 static void _test_event_offsetx(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
557 hres
= IHTMLEventObj_get_offsetX(event
, &l
);
558 ok_(__FILE__
,line
)(hres
== S_OK
, "get_offsetX failed: %08x\n", hres
);
559 if(exl
!= -10) /* don't test the exact value */
560 ok_(__FILE__
,line
)(l
== exl
, "offsetX = %d, expected %d\n", l
, exl
);
563 static void _test_event_offsety(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
568 hres
= IHTMLEventObj_get_offsetY(event
, &l
);
569 ok_(__FILE__
,line
)(hres
== S_OK
, "get_offsetY failed: %08x\n", hres
);
570 if(exl
!= -10) /* don't test the exact value */
571 ok_(__FILE__
,line
)(l
== exl
, "offsetY = %d, expected %d\n", l
, exl
);
574 static void _test_event_screenx(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
579 hres
= IHTMLEventObj_get_screenX(event
, &l
);
580 ok_(__FILE__
,line
)(hres
== S_OK
, "get_screenX failed: %08x\n", hres
);
581 if(exl
!= -10) /* don't test the exact value */
582 ok_(__FILE__
,line
)(l
== exl
, "screenX = %d, expected %d\n", l
, exl
);
585 static void _test_event_screeny(unsigned line
, IHTMLEventObj
*event
, LONG exl
)
590 hres
= IHTMLEventObj_get_screenY(event
, &l
);
591 ok_(__FILE__
,line
)(hres
== S_OK
, "get_screenY failed: %08x\n", hres
);
592 if(exl
!= -10) /* don't test the exact value for -10 */
593 ok_(__FILE__
,line
)(l
== exl
, "screenY = %d, expected %d\n", l
, exl
);
596 static void _test_event_type(unsigned line
, IHTMLEventObj
*event
, const char *exstr
)
601 hres
= IHTMLEventObj_get_type(event
, &str
);
602 ok_(__FILE__
,line
)(hres
== S_OK
, "get_type failed: %08x\n", hres
);
603 ok_(__FILE__
,line
)(!strcmp_wa(str
, exstr
), "type = %s, expected %s\n", wine_dbgstr_w(str
), exstr
);
606 static void _test_event_qualifier(unsigned line
, IHTMLEventObj
*event
, const char *exstr
)
611 hres
= IHTMLEventObj_get_qualifier(event
, &str
);
612 ok_(__FILE__
,line
)(hres
== S_OK
, "get_qualifier failed: %08x\n", hres
);
614 ok_(__FILE__
,line
)(!strcmp_wa(str
, exstr
), "qualifier = %s, expected %s\n", wine_dbgstr_w(str
), exstr
);
616 ok_(__FILE__
,line
)(!str
, "qualifier != NULL\n");
619 static void _test_event_srcfilter(unsigned line
, IHTMLEventObj
*event
)
624 hres
= IHTMLEventObj_get_srcFilter(event
, &disp
);
625 ok_(__FILE__
,line
)(hres
== S_OK
, "get_srcFilter failed: %08x\n", hres
);
626 ok_(__FILE__
,line
)(!disp
, "srcFilter != NULL\n");
629 #define test_event_obj(t,x) _test_event_obj(__LINE__,t,x)
630 static void _test_event_obj(unsigned line
, const char *type
, const xy_test_t
*xy
)
632 IHTMLEventObj
*event
= _get_event_obj(line
);
636 _test_event_altkey(line
, event
, VARIANT_FALSE
);
637 _test_event_ctrlkey(line
, event
, VARIANT_FALSE
);
638 _test_event_shiftkey(line
, event
, VARIANT_FALSE
);
639 _test_event_cancelbubble(line
, event
, VARIANT_FALSE
);
640 _test_event_fromelem(line
, event
, NULL
);
641 _test_event_toelem(line
, event
, NULL
);
642 _test_event_keycode(line
, event
, 0);
643 _test_event_button(line
, event
, 0);
644 _test_event_type(line
, event
, type
);
645 _test_event_qualifier(line
, event
, NULL
);
646 _test_event_reason(line
, event
, 0);
647 _test_event_srcfilter(line
, event
);
648 _test_event_x(line
, event
, xy
->x
);
649 _test_event_y(line
, event
, xy
->y
);
650 _test_event_clientx(line
, event
, -10);
651 _test_event_clienty(line
, event
, -10);
652 _test_event_offsetx(line
, event
, xy
->offset_x
);
653 _test_event_offsety(line
, event
, xy
->offset_y
);
654 _test_event_screenx(line
, event
, -10);
655 _test_event_screeny(line
, event
, -10);
658 hres
= IHTMLEventObj_get_returnValue(event
, &v
);
659 ok_(__FILE__
,line
)(hres
== S_OK
, "get_returnValue failed: %08x\n", hres
);
660 ok_(__FILE__
,line
)(V_VT(&v
) == VT_EMPTY
, "V_VT(returnValue) = %d\n", V_VT(&v
));
662 IHTMLEventObj_Release(event
);
665 #define elem_attach_event(a,b,c) _elem_attach_event(__LINE__,a,b,c)
666 static void _elem_attach_event(unsigned line
, IUnknown
*unk
, const char *namea
, IDispatch
*disp
)
668 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
673 name
= a2bstr(namea
);
674 hres
= IHTMLElement2_attachEvent(elem
, name
, disp
, &res
);
675 IHTMLElement2_Release(elem
);
677 ok_(__FILE__
,line
)(hres
== S_OK
, "attachEvent failed: %08x\n", hres
);
678 ok_(__FILE__
,line
)(res
== VARIANT_TRUE
, "attachEvent returned %x\n", res
);
681 #define elem_detach_event(a,b,c) _elem_detach_event(__LINE__,a,b,c)
682 static void _elem_detach_event(unsigned line
, IUnknown
*unk
, const char *namea
, IDispatch
*disp
)
684 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
688 name
= a2bstr(namea
);
689 hres
= IHTMLElement2_detachEvent(elem
, name
, disp
);
690 IHTMLElement2_Release(elem
);
692 ok_(__FILE__
,line
)(hres
== S_OK
, "detachEvent failed: %08x\n", hres
);
695 #define doc_attach_event(a,b,c) _doc_attach_event(__LINE__,a,b,c)
696 static void _doc_attach_event(unsigned line
, IHTMLDocument2
*doc
, const char *namea
, IDispatch
*disp
)
698 IHTMLDocument3
*doc3
= _get_doc3_iface(line
, (IUnknown
*)doc
);
703 name
= a2bstr(namea
);
704 hres
= IHTMLDocument3_attachEvent(doc3
, name
, disp
, &res
);
705 IHTMLDocument3_Release(doc3
);
707 ok_(__FILE__
,line
)(hres
== S_OK
, "attachEvent failed: %08x\n", hres
);
708 ok_(__FILE__
,line
)(res
== VARIANT_TRUE
, "attachEvent returned %x\n", res
);
711 #define doc_detach_event(a,b,c) _doc_detach_event(__LINE__,a,b,c)
712 static void _doc_detach_event(unsigned line
, IHTMLDocument2
*doc
, const char *namea
, IDispatch
*disp
)
714 IHTMLDocument3
*doc3
= _get_doc3_iface(line
, (IUnknown
*)doc
);
718 name
= a2bstr(namea
);
719 hres
= IHTMLDocument3_detachEvent(doc3
, name
, disp
);
720 IHTMLDocument3_Release(doc3
);
722 ok_(__FILE__
,line
)(hres
== S_OK
, "detachEvent failed: %08x\n", hres
);
725 static HRESULT WINAPI
DispatchEx_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
729 if(IsEqualGUID(riid
, &IID_IUnknown
)
730 || IsEqualGUID(riid
, &IID_IDispatch
)
731 || IsEqualGUID(riid
, &IID_IDispatchEx
))
734 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid
));
735 return E_NOINTERFACE
;
741 static HRESULT WINAPI
Dispatch_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
745 if(IsEqualGUID(riid
, &IID_IUnknown
)
746 || IsEqualGUID(riid
, &IID_IDispatch
)) {
748 }else if(IsEqualGUID(riid
, &IID_IDispatchEx
)) {
749 return E_NOINTERFACE
;
751 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid
));
752 return E_NOINTERFACE
;
758 static ULONG WINAPI
DispatchEx_AddRef(IDispatchEx
*iface
)
763 static ULONG WINAPI
DispatchEx_Release(IDispatchEx
*iface
)
768 static HRESULT WINAPI
DispatchEx_GetTypeInfoCount(IDispatchEx
*iface
, UINT
*pctinfo
)
770 ok(0, "unexpected call\n");
774 static HRESULT WINAPI
DispatchEx_GetTypeInfo(IDispatchEx
*iface
, UINT iTInfo
,
775 LCID lcid
, ITypeInfo
**ppTInfo
)
777 ok(0, "unexpected call\n");
781 static HRESULT WINAPI
DispatchEx_GetIDsOfNames(IDispatchEx
*iface
, REFIID riid
,
782 LPOLESTR
*rgszNames
, UINT cNames
,
783 LCID lcid
, DISPID
*rgDispId
)
785 ok(0, "unexpected call\n");
789 static HRESULT WINAPI
DispatchEx_Invoke(IDispatchEx
*iface
, DISPID dispIdMember
,
790 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
791 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
793 ok(0, "unexpected call\n");
797 static HRESULT WINAPI
DispatchEx_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
799 ok(0, "unexpected call\n");
803 static HRESULT WINAPI
DispatchEx_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
804 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
806 ok(0, "unexpected call\n");
810 static HRESULT WINAPI
DispatchEx_DeleteMemberByName(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
)
812 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName
), grfdex
);
816 static HRESULT WINAPI
DispatchEx_DeleteMemberByDispID(IDispatchEx
*iface
, DISPID id
)
818 ok(0, "unexpected call\n");
822 static HRESULT WINAPI
DispatchEx_GetMemberProperties(IDispatchEx
*iface
, DISPID id
, DWORD grfdexFetch
, DWORD
*pgrfdex
)
824 ok(0, "unexpected call\n");
828 static HRESULT WINAPI
DispatchEx_GetMemberName(IDispatchEx
*iface
, DISPID id
, BSTR
*pbstrName
)
830 ok(0, "unexpected call\n");
834 static HRESULT WINAPI
DispatchEx_GetNextDispID(IDispatchEx
*iface
, DWORD grfdex
, DISPID id
, DISPID
*pid
)
836 ok(0, "unexpected call\n");
840 static HRESULT WINAPI
DispatchEx_GetNameSpaceParent(IDispatchEx
*iface
, IUnknown
**ppunk
)
842 ok(0, "unexpected call\n");
846 #define EVENT_HANDLER_FUNC_OBJ(event) \
847 static IDispatchExVtbl event ## FuncVtbl = { \
848 DispatchEx_QueryInterface, \
850 DispatchEx_Release, \
851 DispatchEx_GetTypeInfoCount, \
852 DispatchEx_GetTypeInfo, \
853 DispatchEx_GetIDsOfNames, \
855 DispatchEx_GetDispID, \
857 DispatchEx_DeleteMemberByName, \
858 DispatchEx_DeleteMemberByDispID, \
859 DispatchEx_GetMemberProperties, \
860 DispatchEx_GetMemberName, \
861 DispatchEx_GetNextDispID, \
862 DispatchEx_GetNameSpaceParent \
864 static IDispatchEx event ## _obj = { &event ## FuncVtbl };
866 static HRESULT WINAPI
document_onclick(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
867 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
869 IHTMLDocument3
*doc3
;
870 CHECK_EXPECT(document_onclick
);
871 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
872 doc3
= get_doc3_iface((IUnknown
*)V_DISPATCH(pdp
->rgvarg
));
873 IHTMLDocument3_Release(doc3
);
874 test_event_src("DIV");
875 test_event_obj("click", &no_xy
);
879 EVENT_HANDLER_FUNC_OBJ(document_onclick
);
881 static HRESULT WINAPI
div_onclick(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
882 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
884 CHECK_EXPECT(div_onclick
);
885 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
886 test_event_src("DIV");
890 EVENT_HANDLER_FUNC_OBJ(div_onclick
);
892 static HRESULT WINAPI
div_onclick_attached(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
893 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
895 CHECK_EXPECT(div_onclick_attached
);
897 test_attached_event_args(id
, wFlags
, pdp
, pvarRes
, pei
);
898 test_event_src("DIV");
902 EVENT_HANDLER_FUNC_OBJ(div_onclick_attached
);
904 static HRESULT WINAPI
doc_onclick_attached(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
905 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
907 CHECK_EXPECT(doc_onclick_attached
);
909 test_attached_event_args(id
, wFlags
, pdp
, pvarRes
, pei
);
910 test_event_src("DIV");
914 EVENT_HANDLER_FUNC_OBJ(doc_onclick_attached
);
916 static HRESULT WINAPI
body_onclick(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
917 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
919 CHECK_EXPECT(body_onclick
);
920 test_event_args(&DIID_DispHTMLBody
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
921 test_event_src("DIV");
925 EVENT_HANDLER_FUNC_OBJ(body_onclick
);
927 static HRESULT WINAPI
img_onload(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
928 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
930 CHECK_EXPECT(img_onload
);
931 test_event_args(&DIID_DispHTMLImg
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
932 test_event_src("IMG");
936 EVENT_HANDLER_FUNC_OBJ(img_onload
);
938 static HRESULT WINAPI
img_onerror(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
939 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
941 CHECK_EXPECT(img_onerror
);
942 test_event_args(&DIID_DispHTMLImg
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
943 test_event_src("IMG");
947 EVENT_HANDLER_FUNC_OBJ(img_onerror
);
949 static HRESULT WINAPI
input_onfocus(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
950 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
952 CHECK_EXPECT(input_onfocus
);
953 test_event_args(&DIID_DispHTMLInputElement
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
954 test_event_src("INPUT");
958 EVENT_HANDLER_FUNC_OBJ(input_onfocus
);
960 static HRESULT WINAPI
input_onblur(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
961 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
963 CHECK_EXPECT(input_onblur
);
964 test_event_args(&DIID_DispHTMLInputElement
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
965 test_event_src("INPUT");
969 EVENT_HANDLER_FUNC_OBJ(input_onblur
);
971 static HRESULT WINAPI
form_onsubmit(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
972 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
974 CHECK_EXPECT(form_onsubmit
);
975 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
976 test_event_src("FORM");
978 V_VT(pvarRes
) = VT_BOOL
;
979 V_BOOL(pvarRes
) = VARIANT_FALSE
;
983 EVENT_HANDLER_FUNC_OBJ(form_onsubmit
);
985 static HRESULT WINAPI
form_onclick(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
986 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
988 CHECK_EXPECT(form_onclick
);
989 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
994 EVENT_HANDLER_FUNC_OBJ(form_onclick
);
996 static HRESULT WINAPI
submit_onclick(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
997 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
999 CHECK_EXPECT(submit_onclick
);
1000 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1001 test_event_src("INPUT");
1003 V_VT(pvarRes
) = VT_BOOL
;
1004 V_BOOL(pvarRes
) = VARIANT_FALSE
;
1008 EVENT_HANDLER_FUNC_OBJ(submit_onclick
);
1010 static HRESULT WINAPI
iframe_onload(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1011 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1013 CHECK_EXPECT(iframe_onload
);
1014 test_event_args(&DIID_DispHTMLIFrame
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1015 test_event_src("IFRAME");
1019 EVENT_HANDLER_FUNC_OBJ(iframe_onload
);
1021 static HRESULT WINAPI
submit_onclick_attached(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1022 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1024 CHECK_EXPECT(submit_onclick_attached
);
1025 test_attached_event_args(id
, wFlags
, pdp
, pvarRes
, pei
);
1026 test_event_src("INPUT");
1028 V_VT(pvarRes
) = VT_BOOL
;
1029 V_BOOL(pvarRes
) = VARIANT_FALSE
;
1033 EVENT_HANDLER_FUNC_OBJ(submit_onclick_attached
);
1035 static HRESULT WINAPI
submit_onclick_attached_check_cancel(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1036 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1038 IHTMLEventObj
*event
;
1041 CHECK_EXPECT(submit_onclick_attached_check_cancel
);
1042 test_attached_event_args(id
, wFlags
, pdp
, pvarRes
, pei
);
1043 test_event_src("INPUT");
1046 hres
= IHTMLWindow2_get_event(window
, &event
);
1047 ok(hres
== S_OK
, "get_event failed: %08x\n", hres
);
1048 ok(event
!= NULL
, "event == NULL\n");
1050 test_event_cancelbubble(event
, VARIANT_TRUE
);
1054 EVENT_HANDLER_FUNC_OBJ(submit_onclick_attached_check_cancel
);
1056 static VARIANT onclick_retval
, onclick_event_retval
;
1058 static HRESULT WINAPI
submit_onclick_setret(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1059 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1061 IHTMLEventObj
*event
;
1064 CHECK_EXPECT(submit_onclick_setret
);
1065 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1066 test_event_src("INPUT");
1069 hres
= IHTMLWindow2_get_event(window
, &event
);
1070 ok(hres
== S_OK
, "get_event failed: %08x\n", hres
);
1071 ok(event
!= NULL
, "event == NULL\n");
1073 hres
= IHTMLEventObj_put_returnValue(event
, onclick_event_retval
);
1074 ok(hres
== S_OK
, "put_returnValue failed: %08x\n", hres
);
1075 IHTMLEventObj_Release(event
);
1077 *pvarRes
= onclick_retval
;
1081 EVENT_HANDLER_FUNC_OBJ(submit_onclick_setret
);
1083 static HRESULT WINAPI
submit_onclick_cancel(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1084 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1086 IHTMLEventObj
*event
;
1089 CHECK_EXPECT(submit_onclick_cancel
);
1090 test_event_args(NULL
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1091 test_event_src("INPUT");
1094 hres
= IHTMLWindow2_get_event(window
, &event
);
1095 ok(hres
== S_OK
, "get_event failed: %08x\n", hres
);
1096 ok(event
!= NULL
, "event == NULL\n");
1098 test_event_cancelbubble(event
, VARIANT_FALSE
);
1100 hres
= IHTMLEventObj_put_cancelBubble(event
, VARIANT_TRUE
);
1101 ok(hres
== S_OK
, "put_returnValue failed: %08x\n", hres
);
1102 IHTMLEventObj_Release(event
);
1104 test_event_cancelbubble(event
, VARIANT_TRUE
);
1108 EVENT_HANDLER_FUNC_OBJ(submit_onclick_cancel
);
1110 static HRESULT WINAPI
iframedoc_onreadystatechange(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1111 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1113 IHTMLEventObj
*event
= NULL
;
1116 CHECK_EXPECT2(iframedoc_onreadystatechange
);
1117 test_event_args(&DIID_DispHTMLDocument
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1119 event
= (void*)0xdeadbeef;
1120 hres
= IHTMLWindow2_get_event(window
, &event
);
1121 ok(hres
== S_OK
, "get_event failed: %08x\n", hres
);
1122 ok(!event
, "event = %p\n", event
);
1127 EVENT_HANDLER_FUNC_OBJ(iframedoc_onreadystatechange
);
1129 static HRESULT WINAPI
iframe_onreadystatechange(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1130 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1132 IHTMLWindow2
*iframe_window
;
1133 IHTMLDocument2
*iframe_doc
;
1134 IHTMLFrameBase2
*iframe
;
1135 IHTMLElement2
*elem2
;
1141 test_event_args(&DIID_DispHTMLIFrame
, id
, wFlags
, pdp
, pvarRes
, pei
, pspCaller
);
1142 test_event_src("IFRAME");
1144 elem
= get_event_src();
1145 elem2
= get_elem2_iface((IUnknown
*)elem
);
1146 IHTMLElement_Release(elem
);
1148 V_VT(&v
) = VT_EMPTY
;
1149 hres
= IHTMLElement2_get_readyState(elem2
, &v
);
1150 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
1151 ok(V_VT(&v
) == VT_BSTR
, "V_VT(readyState) = %d\n", V_VT(&v
));
1153 hres
= IHTMLElement2_QueryInterface(elem2
, &IID_IHTMLFrameBase2
, (void**)&iframe
);
1154 IHTMLElement2_Release(elem2
);
1155 ok(hres
== S_OK
, "Could not get IHTMLFrameBase2 iface: %08x\n", hres
);
1158 hres
= IHTMLFrameBase2_get_readyState(iframe
, &str
);
1159 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
1160 ok(str
!= NULL
, "readyState == NULL\n");
1161 ok(!lstrcmpW(str
, V_BSTR(&v
)), "ready states differ\n");
1164 hres
= IHTMLFrameBase2_get_contentWindow(iframe
, &iframe_window
);
1165 ok(hres
== S_OK
, "get_contentDocument failed: %08x\n", hres
);
1167 hres
= IHTMLWindow2_get_document(iframe_window
, &iframe_doc
);
1168 IHTMLWindow2_Release(iframe_window
);
1169 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
1171 hres
= IHTMLDocument2_get_readyState(iframe_doc
, &str2
);
1172 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
1173 ok(!lstrcmpW(str
, str2
), "unexpected document readyState %s\n", wine_dbgstr_w(str2
));
1174 SysFreeString(str2
);
1176 if(!strcmp_wa(str
, "loading")) {
1177 CHECK_EXPECT(iframe_onreadystatechange_loading
);
1179 V_VT(&v
) = VT_DISPATCH
;
1180 V_DISPATCH(&v
) = (IDispatch
*)&iframedoc_onreadystatechange_obj
;
1181 hres
= IHTMLDocument2_put_onreadystatechange(iframe_doc
, v
);
1182 ok(hres
== S_OK
, "put_onreadystatechange: %08x\n", hres
);
1183 }else if(!strcmp_wa(str
, "interactive"))
1184 CHECK_EXPECT(iframe_onreadystatechange_interactive
);
1185 else if(!strcmp_wa(str
, "complete"))
1186 CHECK_EXPECT(iframe_onreadystatechange_complete
);
1188 ok(0, "unexpected state %s\n", wine_dbgstr_w(str
));
1191 IHTMLDocument2_Release(iframe_doc
);
1192 IHTMLFrameBase2_Release(iframe
);
1196 EVENT_HANDLER_FUNC_OBJ(iframe_onreadystatechange
);
1198 static HRESULT WINAPI
nocall(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1199 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1201 ok(0, "unexpected call\n");
1205 EVENT_HANDLER_FUNC_OBJ(nocall
);
1207 #define CONNECTION_POINT_OBJ(cpname, diid) \
1208 static HRESULT WINAPI cpname ## _QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) \
1211 if(IsEqualGUID(riid, &IID_IUnknown) \
1212 || IsEqualGUID(riid, &IID_IDispatch) \
1213 || IsEqualGUID(riid, &diid)) \
1216 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); \
1217 return E_NOINTERFACE; \
1221 static IDispatchExVtbl cpname ## Vtbl = { \
1222 cpname ## _QueryInterface, \
1223 DispatchEx_AddRef, \
1224 DispatchEx_Release, \
1225 DispatchEx_GetTypeInfoCount, \
1226 DispatchEx_GetTypeInfo, \
1227 DispatchEx_GetIDsOfNames, \
1229 DispatchEx_GetDispID, \
1230 DispatchEx_InvokeEx, \
1231 DispatchEx_DeleteMemberByName, \
1232 DispatchEx_DeleteMemberByDispID, \
1233 DispatchEx_GetMemberProperties, \
1234 DispatchEx_GetMemberName, \
1235 DispatchEx_GetNextDispID, \
1236 DispatchEx_GetNameSpaceParent \
1238 static IDispatchEx cpname ## _obj = { &cpname ## Vtbl }
1240 #define test_cp_args(a,b,c,d,e,f) _test_cp_args(__LINE__,a,b,c,d,e,f)
1241 static void _test_cp_args(unsigned line
, REFIID riid
, WORD flags
, DISPPARAMS
*dp
, VARIANT
*vres
, EXCEPINFO
*ei
, UINT
*argerr
)
1243 ok_(__FILE__
,line
)(IsEqualGUID(&IID_NULL
, riid
), "riid = %s\n", wine_dbgstr_guid(riid
));
1244 ok_(__FILE__
,line
)(flags
== DISPATCH_METHOD
, "flags = %x\n", flags
);
1245 ok_(__FILE__
,line
)(dp
!= NULL
, "dp == NULL\n");
1246 ok_(__FILE__
,line
)(!dp
->cArgs
, "dp->cArgs = %d\n", dp
->cArgs
);
1247 ok_(__FILE__
,line
)(!dp
->rgvarg
, "dp->rgvarg = %p\n", dp
->rgvarg
);
1248 ok_(__FILE__
,line
)(!dp
->cNamedArgs
, "dp->cNamedArgs = %d\n", dp
->cNamedArgs
);
1249 ok_(__FILE__
,line
)(!dp
->rgdispidNamedArgs
, "dp->rgdispidNamedArgs = %p\n", dp
->rgdispidNamedArgs
);
1250 ok_(__FILE__
,line
)(vres
!= NULL
, "vres == NULL\n");
1251 ok_(__FILE__
,line
)(V_VT(vres
) == VT_EMPTY
, "V_VT(vres) = %d\n", V_VT(vres
));
1252 ok_(__FILE__
,line
)(ei
!= NULL
, "ei == NULL\n");
1253 ok_(__FILE__
,line
)(argerr
!= NULL
, "argerr == NULL\n");
1256 #define test_cp_eventarg(a,b,c,d,e,f) _test_cp_eventarg(__LINE__,a,b,c,d,e,f)
1257 static void _test_cp_eventarg(unsigned line
, REFIID riid
, WORD flags
, DISPPARAMS
*dp
, VARIANT
*vres
, EXCEPINFO
*ei
, UINT
*argerr
)
1259 IHTMLEventObj
*event
;
1261 ok_(__FILE__
,line
)(IsEqualGUID(&IID_NULL
, riid
), "riid = %s\n", wine_dbgstr_guid(riid
));
1262 ok_(__FILE__
,line
)(flags
== DISPATCH_METHOD
, "flags = %x\n", flags
);
1263 ok_(__FILE__
,line
)(dp
!= NULL
, "dp == NULL\n");
1264 ok_(__FILE__
,line
)(dp
->cArgs
== 1, "dp->cArgs = %d\n", dp
->cArgs
);
1265 ok_(__FILE__
,line
)(dp
->rgvarg
!= NULL
, "dp->rgvarg = %p\n", dp
->rgvarg
);
1266 ok_(__FILE__
,line
)(!dp
->cNamedArgs
, "dp->cNamedArgs = %d\n", dp
->cNamedArgs
);
1267 ok_(__FILE__
,line
)(!dp
->rgdispidNamedArgs
, "dp->rgdispidNamedArgs = %p\n", dp
->rgdispidNamedArgs
);
1268 ok_(__FILE__
,line
)(vres
!= NULL
, "vres == NULL\n");
1269 ok_(__FILE__
,line
)(V_VT(vres
) == VT_EMPTY
, "V_VT(vres) = %d\n", V_VT(vres
));
1270 ok_(__FILE__
,line
)(ei
!= NULL
, "ei == NULL\n");
1271 ok_(__FILE__
,line
)(argerr
!= NULL
, "argerr == NULL\n");
1273 ok(V_VT(dp
->rgvarg
) == VT_DISPATCH
, "V_VT(dp->rgvarg) = %d\n", V_VT(dp
->rgvarg
));
1274 ok(V_DISPATCH(dp
->rgvarg
) != NULL
, "V_DISPATCH(dp->rgvarg) = %p\n", V_DISPATCH(dp
->rgvarg
));
1276 event
= _get_event_obj(line
);
1277 ok(iface_cmp((IUnknown
*)event
, (IUnknown
*)V_DISPATCH(dp
->rgvarg
)), "event != arg0\n");
1278 IHTMLEventObj_Release(event
);
1281 static HRESULT WINAPI
doccp(IDispatchEx
*iface
, DISPID dispIdMember
,
1282 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1283 VARIANT
*pVarResult
, EXCEPINFO
*pei
, UINT
*puArgErr
)
1285 switch(dispIdMember
) {
1286 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK
:
1287 CHECK_EXPECT(doccp_onclick
);
1288 test_cp_args(riid
, wFlags
, pdp
, pVarResult
, pei
, puArgErr
);
1291 ok(0, "unexpected call %d\n", dispIdMember
);
1298 CONNECTION_POINT_OBJ(doccp
, DIID_HTMLDocumentEvents
);
1300 static HRESULT WINAPI
doccp_onclick_cancel(IDispatchEx
*iface
, DISPID dispIdMember
,
1301 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
, VARIANT
*pVarResult
, EXCEPINFO
*pei
, UINT
*puArgErr
)
1303 switch(dispIdMember
) {
1304 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK
:
1305 CHECK_EXPECT(doccp_onclick_cancel
);
1306 test_cp_args(riid
, wFlags
, pdp
, pVarResult
, pei
, puArgErr
);
1307 V_VT(pVarResult
) = VT_BOOL
;
1308 V_BOOL(pVarResult
) = VARIANT_FALSE
;
1311 ok(0, "unexpected call %d\n", dispIdMember
);
1318 CONNECTION_POINT_OBJ(doccp_onclick_cancel
, DIID_HTMLDocumentEvents
);
1320 static HRESULT WINAPI
elem2_cp(IDispatchEx
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1321 WORD wFlags
, DISPPARAMS
*pdp
, VARIANT
*pVarResult
, EXCEPINFO
*pei
, UINT
*puArgErr
)
1323 switch(dispIdMember
) {
1324 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK
:
1325 CHECK_EXPECT(elem2_cp_onclick
);
1326 test_cp_eventarg(riid
, wFlags
, pdp
, pVarResult
, pei
, puArgErr
);
1329 ok(0, "unexpected call %d\n", dispIdMember
);
1336 CONNECTION_POINT_OBJ(elem2_cp
, DIID_HTMLElementEvents2
);
1338 static HRESULT WINAPI
timeoutFunc_Invoke(IDispatchEx
*iface
, DISPID dispIdMember
,
1339 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
1340 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1342 CHECK_EXPECT(timeout
);
1344 ok(dispIdMember
== DISPID_VALUE
, "dispIdMember = %d\n", dispIdMember
);
1345 ok(IsEqualGUID(&IID_NULL
, riid
), "riid = %s\n", wine_dbgstr_guid(riid
));
1346 ok(wFlags
== DISPATCH_METHOD
, "wFlags = %x\n", wFlags
);
1347 ok(!lcid
, "lcid = %x\n", lcid
);
1348 ok(pDispParams
!= NULL
, "pDispParams == NULL\n");
1349 ok(!pDispParams
->cArgs
, "pdp->cArgs = %d\n", pDispParams
->cArgs
);
1350 ok(!pDispParams
->cNamedArgs
, "pdp->cNamedArgs = %d\n", pDispParams
->cNamedArgs
);
1351 ok(!pDispParams
->rgdispidNamedArgs
, "pdp->rgdispidNamedArgs = %p\n", pDispParams
->rgdispidNamedArgs
);
1352 ok(!pDispParams
->rgvarg
, "rgvarg = %p\n", pDispParams
->rgvarg
);
1353 ok(pVarResult
!= NULL
, "pVarResult = NULL\n");
1354 ok(pExcepInfo
!= NULL
, "pExcepInfo = NULL\n");
1355 ok(!puArgErr
, "puArgErr = %p\n", puArgErr
);
1356 ok(V_VT(pVarResult
) == VT_EMPTY
, "V_VT(pVarResult) = %d\n", V_VT(pVarResult
));
1361 static const IDispatchExVtbl timeoutFuncVtbl
= {
1362 DispatchEx_QueryInterface
,
1365 DispatchEx_GetTypeInfoCount
,
1366 DispatchEx_GetTypeInfo
,
1367 DispatchEx_GetIDsOfNames
,
1369 DispatchEx_GetDispID
,
1370 DispatchEx_InvokeEx
,
1371 DispatchEx_DeleteMemberByName
,
1372 DispatchEx_DeleteMemberByDispID
,
1373 DispatchEx_GetMemberProperties
,
1374 DispatchEx_GetMemberName
,
1375 DispatchEx_GetNextDispID
,
1376 DispatchEx_GetNameSpaceParent
1379 static IDispatchEx timeoutFunc
= { &timeoutFuncVtbl
};
1381 static HRESULT WINAPI
div_onclick_disp_Invoke(IDispatchEx
*iface
, DISPID id
,
1382 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1383 VARIANT
*pvarRes
, EXCEPINFO
*pei
, UINT
*puArgErr
)
1385 CHECK_EXPECT(div_onclick_disp
);
1387 test_attached_event_args(id
, wFlags
, pdp
, pvarRes
, pei
);
1389 ok(IsEqualGUID(&IID_NULL
, riid
), "riid = %s\n", wine_dbgstr_guid(riid
));
1390 ok(!puArgErr
, "puArgErr = %p\n", puArgErr
);
1395 static const IDispatchExVtbl div_onclick_dispVtbl
= {
1396 Dispatch_QueryInterface
,
1399 DispatchEx_GetTypeInfoCount
,
1400 DispatchEx_GetTypeInfo
,
1401 DispatchEx_GetIDsOfNames
,
1402 div_onclick_disp_Invoke
,
1405 static IDispatchEx div_onclick_disp
= { &div_onclick_dispVtbl
};
1407 static void pump_msgs(BOOL
*b
)
1412 while(!*b
&& GetMessageW(&msg
, NULL
, 0, 0)) {
1413 TranslateMessage(&msg
);
1414 DispatchMessageW(&msg
);
1417 while(!b
&& PeekMessageW(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
1418 TranslateMessage(&msg
);
1419 DispatchMessageW(&msg
);
1424 static IConnectionPoint
*get_cp(IUnknown
*unk
, REFIID riid
)
1426 IConnectionPointContainer
*cp_container
;
1427 IConnectionPoint
*cp
;
1430 hres
= IUnknown_QueryInterface(unk
, &IID_IConnectionPointContainer
, (void**)&cp_container
);
1431 ok(hres
== S_OK
, "Could not get IConnectionPointContainer: %08x\n", hres
);
1433 hres
= IConnectionPointContainer_FindConnectionPoint(cp_container
, riid
, &cp
);
1434 IConnectionPointContainer_Release(cp_container
);
1435 ok(hres
== S_OK
, "FindConnectionPoint failed: %08x\n", hres
);
1440 static DWORD
register_cp(IUnknown
*unk
, REFIID riid
, IUnknown
*sink
)
1442 IConnectionPoint
*cp
;
1446 cp
= get_cp(unk
, riid
);
1447 hres
= IConnectionPoint_Advise(cp
, sink
, &cookie
);
1448 IConnectionPoint_Release(cp
);
1449 ok(hres
== S_OK
, "Advise failed: %08x\n", hres
);
1454 static void unregister_cp(IUnknown
*unk
, REFIID riid
, DWORD cookie
)
1456 IConnectionPoint
*cp
;
1459 cp
= get_cp(unk
, riid
);
1460 hres
= IConnectionPoint_Unadvise(cp
, cookie
);
1461 IConnectionPoint_Release(cp
);
1462 ok(hres
== S_OK
, "Unadvise failed: %08x\n", hres
);
1465 static HRESULT WINAPI
EventDispatch_QueryInterface(IDispatch
*iface
, REFIID riid
, void **ppv
)
1467 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IDispatch
, riid
)) {
1472 ok(0, "Unexpected call\n");
1473 return E_NOINTERFACE
;
1476 static DWORD WINAPI
EventDispatch_AddRef(IDispatch
*iface
)
1481 static DWORD WINAPI
EventDispatch_Release(IDispatch
*iface
)
1486 static HRESULT WINAPI
EventDispatch_GetTypeInfoCount(IDispatch
*iface
, UINT
*pctinfo
)
1488 ok(0, "Unexpected call\n");
1492 static HRESULT WINAPI
EventDispatch_GetTypeInfo(IDispatch
*iface
, UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1494 ok(0, "Unexpected call\n");
1498 static HRESULT WINAPI
EventDispatch_GetIDsOfNames(IDispatch
*iface
, REFIID riid
, LPOLESTR
*rgszNames
,
1499 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1501 ok(0, "Unexpected call\n");
1505 static HRESULT WINAPI
EventDispatch_Invoke(IDispatch
*iface
, DISPID dispIdMember
, REFIID riid
,
1506 LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
1507 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1509 ok(IsEqualGUID(&IID_NULL
, riid
), "riid = %s\n", wine_dbgstr_guid(riid
));
1510 ok(pDispParams
!= NULL
, "pDispParams == NULL\n");
1511 ok(pExcepInfo
!= NULL
, "pExcepInfo == NULL\n");
1512 ok(puArgErr
!= NULL
, "puArgErr == NULL\n");
1513 ok(V_VT(pVarResult
) == 0, "V_VT(pVarResult) = %d\n", V_VT(pVarResult
));
1514 ok(wFlags
== DISPATCH_METHOD
, "wFlags = %d\n", wFlags
);
1516 switch(dispIdMember
) {
1517 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK
:
1518 CHECK_EXPECT2(invoke_onclick
);
1520 case DISPID_HTMLDOCUMENTEVENTS2_ONPROPERTYCHANGE
:
1521 case DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE
:
1532 ok(0, "Unexpected call: %d\n", dispIdMember
);
1538 static const IDispatchVtbl EventDispatchVtbl
= {
1539 EventDispatch_QueryInterface
,
1540 EventDispatch_AddRef
,
1541 EventDispatch_Release
,
1542 EventDispatch_GetTypeInfoCount
,
1543 EventDispatch_GetTypeInfo
,
1544 EventDispatch_GetIDsOfNames
,
1545 EventDispatch_Invoke
1548 static IDispatch EventDispatch
= { &EventDispatchVtbl
};
1550 static void test_onclick(IHTMLDocument2
*doc
)
1552 DWORD cp_cookie
, elem2_cp_cookie
;
1553 IHTMLElement
*div
, *body
;
1557 register_cp((IUnknown
*)doc
, &IID_IDispatch
, (IUnknown
*)&EventDispatch
);
1559 div
= get_elem_id(doc
, "clickdiv");
1561 elem_attach_event((IUnknown
*)div
, "abcde", (IDispatch
*)&nocall_obj
);
1562 elem_attach_event((IUnknown
*)div
, "onclick", (IDispatch
*)&div_onclick_attached_obj
);
1564 V_VT(&v
) = VT_EMPTY
;
1565 hres
= IHTMLElement_get_onclick(div
, &v
);
1566 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1567 ok(V_VT(&v
) == VT_NULL
, "V_VT(onclick) = %d\n", V_VT(&v
));
1569 V_VT(&v
) = VT_EMPTY
;
1570 hres
= IHTMLElement_put_onclick(div
, v
);
1571 ok(hres
== E_NOTIMPL
, "put_onclick failed: %08x\n", hres
);
1574 V_BSTR(&v
) = a2bstr("function();");
1575 hres
= IHTMLElement_put_onclick(div
, v
);
1576 todo_wine
ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1579 V_VT(&v
) = VT_EMPTY
;
1580 hres
= IHTMLElement_get_onclick(div
, &v
);
1581 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1582 ok(V_VT(&v
) == VT_BSTR
, "V_VT(onclick) = %d\n", V_VT(&v
));
1583 ok(!strcmp_wa(V_BSTR(&v
), "function();"), "V_BSTR(onclick) = %s\n", wine_dbgstr_w(V_BSTR(&v
)));
1587 V_VT(&v
) = VT_DISPATCH
;
1588 V_DISPATCH(&v
) = (IDispatch
*)&div_onclick_obj
;
1589 hres
= IHTMLElement_put_onclick(div
, v
);
1590 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1593 hres
= IHTMLElement_put_ondblclick(div
, v
);
1594 ok(hres
== S_OK
, "put_ondblclick failed: %08x\n", hres
);
1596 V_VT(&v
) = VT_EMPTY
;
1597 hres
= IHTMLElement_get_onclick(div
, &v
);
1598 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1599 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onclick) = %d\n", V_VT(&v
));
1600 ok(V_DISPATCH(&v
) == (IDispatch
*)&div_onclick_obj
, "V_DISPATCH(onclick) != onclickFunc\n");
1603 V_VT(&v
) = VT_EMPTY
;
1604 hres
= IHTMLDocument2_get_onclick(doc
, &v
);
1605 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1606 ok(V_VT(&v
) == VT_NULL
, "V_VT(onclick) = %d\n", V_VT(&v
));
1608 V_VT(&v
) = VT_DISPATCH
;
1609 V_DISPATCH(&v
) = (IDispatch
*)&document_onclick_obj
;
1610 hres
= IHTMLDocument2_put_onclick(doc
, v
);
1611 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1613 V_VT(&v
) = VT_EMPTY
;
1614 hres
= IHTMLDocument2_get_onclick(doc
, &v
);
1615 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1616 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onclick) = %d\n", V_VT(&v
));
1617 ok(V_DISPATCH(&v
) == (IDispatch
*)&document_onclick_obj
, "V_DISPATCH(onclick) != onclickFunc\n");
1620 body
= doc_get_body(doc
);
1622 V_VT(&v
) = VT_DISPATCH
;
1623 V_DISPATCH(&v
) = (IDispatch
*)&body_onclick_obj
;
1624 hres
= IHTMLElement_put_onclick(body
, v
);
1625 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1627 if(winetest_interactive
) {
1628 SET_EXPECT(div_onclick
);
1629 SET_EXPECT(div_onclick_attached
);
1630 SET_EXPECT(body_onclick
);
1631 SET_EXPECT(document_onclick
);
1632 SET_EXPECT(invoke_onclick
);
1633 pump_msgs(&called_document_onclick
);
1634 CHECK_CALLED(div_onclick
);
1635 CHECK_CALLED(div_onclick_attached
);
1636 CHECK_CALLED(body_onclick
);
1637 CHECK_CALLED(document_onclick
);
1638 CHECK_CALLED(invoke_onclick
);
1643 SET_EXPECT(div_onclick
);
1644 SET_EXPECT(div_onclick_attached
);
1645 SET_EXPECT(body_onclick
);
1646 SET_EXPECT(document_onclick
);
1647 SET_EXPECT(invoke_onclick
);
1649 hres
= IHTMLElement_click(div
);
1650 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1652 CHECK_CALLED(div_onclick
);
1653 CHECK_CALLED(div_onclick_attached
);
1654 CHECK_CALLED(body_onclick
);
1655 CHECK_CALLED(document_onclick
);
1656 CHECK_CALLED(invoke_onclick
);
1658 SET_EXPECT(div_onclick
);
1659 SET_EXPECT(div_onclick_attached
);
1660 SET_EXPECT(body_onclick
);
1661 SET_EXPECT(document_onclick
);
1662 SET_EXPECT(invoke_onclick
);
1664 V_VT(&v
) = VT_EMPTY
;
1665 elem_fire_event((IUnknown
*)div
, "onclick", &v
);
1667 CHECK_CALLED(div_onclick
);
1668 CHECK_CALLED(div_onclick_attached
);
1669 CHECK_CALLED(body_onclick
);
1670 CHECK_CALLED(document_onclick
);
1671 CHECK_CALLED(invoke_onclick
);
1673 cp_cookie
= register_cp((IUnknown
*)doc
, &DIID_HTMLDocumentEvents
, (IUnknown
*)&doccp_obj
);
1674 elem_attach_event((IUnknown
*)div
, "onclick", (IDispatch
*)&div_onclick_disp
);
1675 doc_attach_event(doc
, "onclick", (IDispatch
*)&doc_onclick_attached_obj
);
1677 SET_EXPECT(div_onclick
);
1678 SET_EXPECT(div_onclick_disp
);
1679 SET_EXPECT(div_onclick_attached
);
1680 SET_EXPECT(body_onclick
);
1681 SET_EXPECT(document_onclick
);
1682 SET_EXPECT(doc_onclick_attached
);
1683 SET_EXPECT(doccp_onclick
);
1684 SET_EXPECT(invoke_onclick
);
1686 hres
= IHTMLElement_click(div
);
1687 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1689 CHECK_CALLED(div_onclick
);
1690 CHECK_CALLED(div_onclick_disp
);
1691 CHECK_CALLED(div_onclick_attached
);
1692 CHECK_CALLED(body_onclick
);
1693 CHECK_CALLED(document_onclick
);
1694 CHECK_CALLED(doc_onclick_attached
);
1695 CHECK_CALLED(doccp_onclick
);
1696 CHECK_CALLED(invoke_onclick
);
1698 elem2_cp_cookie
= register_cp((IUnknown
*)div
, &DIID_HTMLElementEvents2
, (IUnknown
*)&elem2_cp_obj
);
1700 SET_EXPECT(div_onclick
);
1701 SET_EXPECT(div_onclick_disp
);
1702 SET_EXPECT(div_onclick_attached
);
1703 SET_EXPECT(elem2_cp_onclick
);
1704 SET_EXPECT(body_onclick
);
1705 SET_EXPECT(document_onclick
);
1706 SET_EXPECT(doc_onclick_attached
);
1707 SET_EXPECT(doccp_onclick
);
1708 SET_EXPECT(invoke_onclick
);
1710 trace("click >>>\n");
1711 hres
= IHTMLElement_click(div
);
1712 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1713 trace("click <<<\n");
1715 CHECK_CALLED(div_onclick
);
1716 CHECK_CALLED(div_onclick_disp
);
1717 CHECK_CALLED(div_onclick_attached
);
1718 CHECK_CALLED(elem2_cp_onclick
);
1719 CHECK_CALLED(body_onclick
);
1720 CHECK_CALLED(document_onclick
);
1721 CHECK_CALLED(doc_onclick_attached
);
1722 CHECK_CALLED(doccp_onclick
);
1723 CHECK_CALLED(invoke_onclick
);
1725 unregister_cp((IUnknown
*)div
, &DIID_HTMLElementEvents2
, elem2_cp_cookie
);
1726 unregister_cp((IUnknown
*)doc
, &DIID_HTMLDocumentEvents
, cp_cookie
);
1729 hres
= IHTMLElement_put_onclick(div
, v
);
1730 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1732 hres
= IHTMLElement_get_onclick(div
, &v
);
1733 ok(hres
== S_OK
, "get_onclick failed: %08x\n", hres
);
1734 ok(V_VT(&v
) == VT_NULL
, "get_onclick returned vt %d\n", V_VT(&v
));
1736 elem_detach_event((IUnknown
*)div
, "onclick", (IDispatch
*)&div_onclick_disp
);
1737 elem_detach_event((IUnknown
*)div
, "onclick", (IDispatch
*)&div_onclick_disp
);
1738 elem_detach_event((IUnknown
*)div
, "test", (IDispatch
*)&div_onclick_disp
);
1739 doc_detach_event(doc
, "onclick", (IDispatch
*)&doc_onclick_attached_obj
);
1741 SET_EXPECT(div_onclick_attached
);
1742 SET_EXPECT(body_onclick
);
1743 SET_EXPECT(document_onclick
);
1744 SET_EXPECT(invoke_onclick
);
1746 hres
= IHTMLElement_click(div
);
1747 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1749 CHECK_CALLED(div_onclick_attached
);
1750 CHECK_CALLED(body_onclick
);
1751 CHECK_CALLED(document_onclick
);
1752 CHECK_CALLED(invoke_onclick
);
1754 IHTMLElement_Release(div
);
1755 IHTMLElement_Release(body
);
1758 static void test_onreadystatechange(IHTMLDocument2
*doc
)
1760 IHTMLFrameBase
*iframe
;
1761 IHTMLElement2
*elem2
;
1767 elem
= get_elem_id(doc
, "iframe");
1768 elem2
= get_elem2_iface((IUnknown
*)elem
);
1769 IHTMLElement_Release(elem
);
1771 V_VT(&v
) = VT_EMPTY
;
1772 hres
= IHTMLElement2_get_onreadystatechange(elem2
, &v
);
1773 ok(hres
== S_OK
, "get_onreadystatechange failed: %08x\n", hres
);
1774 ok(V_VT(&v
) == VT_NULL
, "V_VT(onreadystatechange) = %d\n", V_VT(&v
));
1776 V_VT(&v
) = VT_DISPATCH
;
1777 V_DISPATCH(&v
) = (IDispatch
*)&iframe_onreadystatechange_obj
;
1778 hres
= IHTMLElement2_put_onreadystatechange(elem2
, v
);
1779 ok(hres
== S_OK
, "put_onreadystatechange failed: %08x\n", hres
);
1781 V_VT(&v
) = VT_EMPTY
;
1782 hres
= IHTMLElement2_get_onreadystatechange(elem2
, &v
);
1783 ok(hres
== S_OK
, "get_onreadystatechange failed: %08x\n", hres
);
1784 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onreadystatechange) = %d\n", V_VT(&v
));
1785 ok(V_DISPATCH(&v
) == (IDispatch
*)&iframe_onreadystatechange_obj
, "unexpected onreadystatechange value\n");
1787 hres
= IHTMLElement2_QueryInterface(elem2
, &IID_IHTMLFrameBase
, (void**)&iframe
);
1788 IHTMLElement2_Release(elem2
);
1789 ok(hres
== S_OK
, "Could not get IHTMLFrameBase iface: %08x\n", hres
);
1791 hres
= IHTMLFrameBase_put_src(iframe
, (str
= a2bstr("about:blank")));
1793 ok(hres
== S_OK
, "put_src failed: %08x\n", hres
);
1795 SET_EXPECT(iframe_onreadystatechange_loading
);
1796 SET_EXPECT(iframedoc_onreadystatechange
);
1797 SET_EXPECT(iframe_onreadystatechange_interactive
);
1798 SET_EXPECT(iframe_onreadystatechange_complete
);
1799 pump_msgs(&called_iframe_onreadystatechange_complete
);
1800 CHECK_CALLED(iframe_onreadystatechange_loading
);
1801 CHECK_CALLED(iframedoc_onreadystatechange
);
1802 CHECK_CALLED(iframe_onreadystatechange_interactive
);
1803 CHECK_CALLED(iframe_onreadystatechange_complete
);
1805 IHTMLFrameBase_Release(iframe
);
1808 static void test_imgload(IHTMLDocument2
*doc
)
1810 IHTMLImgElement
*img
;
1816 elem
= get_elem_id(doc
, "imgid");
1817 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLImgElement
, (void**)&img
);
1818 IHTMLElement_Release(elem
);
1819 ok(hres
== S_OK
, "Could not get IHTMLImgElement iface: %08x\n", hres
);
1821 V_VT(&v
) = VT_EMPTY
;
1822 hres
= IHTMLImgElement_get_onload(img
, &v
);
1823 ok(hres
== S_OK
, "get_onload failed: %08x\n", hres
);
1824 ok(V_VT(&v
) == VT_NULL
, "V_VT(onload) = %d\n", V_VT(&v
));
1826 V_VT(&v
) = VT_DISPATCH
;
1827 V_DISPATCH(&v
) = (IDispatch
*)&img_onload_obj
;
1828 hres
= IHTMLImgElement_put_onload(img
, v
);
1829 ok(hres
== S_OK
, "put_onload failed: %08x\n", hres
);
1831 V_VT(&v
) = VT_EMPTY
;
1832 hres
= IHTMLImgElement_get_onload(img
, &v
);
1833 ok(hres
== S_OK
, "get_onload failed: %08x\n", hres
);
1834 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onload) = %d\n", V_VT(&v
));
1835 ok(V_DISPATCH(&v
) == (IDispatch
*)&img_onload_obj
, "V_DISPATCH(onload) != onloadkFunc\n");
1838 V_VT(&v
) = VT_DISPATCH
;
1839 V_DISPATCH(&v
) = (IDispatch
*)&img_onerror_obj
;
1840 hres
= IHTMLImgElement_put_onerror(img
, v
);
1841 ok(hres
== S_OK
, "put_onerror failed: %08x\n", hres
);
1843 V_VT(&v
) = VT_EMPTY
;
1844 hres
= IHTMLImgElement_get_onerror(img
, &v
);
1845 ok(hres
== S_OK
, "get_onerror failed: %08x\n", hres
);
1846 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onerror) = %d\n", V_VT(&v
));
1847 ok(V_DISPATCH(&v
) == (IDispatch
*)&img_onerror_obj
, "V_DISPATCH(onerror) != onerrorFunc\n");
1850 str
= a2bstr("http://www.winehq.org/images/winehq_logo_text.png");
1851 hres
= IHTMLImgElement_put_src(img
, str
);
1852 ok(hres
== S_OK
, "put_src failed: %08x\n", hres
);
1855 SET_EXPECT(img_onload
);
1856 pump_msgs(&called_img_onload
);
1857 CHECK_CALLED(img_onload
);
1859 SET_EXPECT(img_onerror
);
1861 str
= a2bstr("about:blank");
1862 hres
= IHTMLImgElement_put_src(img
, str
);
1863 ok(hres
== S_OK
, "put_src failed: %08x\n", hres
);
1866 pump_msgs(&called_img_onerror
); /* FIXME: should not be needed */
1868 CHECK_CALLED(img_onerror
);
1870 IHTMLImgElement_Release(img
);
1873 static void test_focus(IHTMLDocument2
*doc
)
1875 IHTMLElement2
*elem2
;
1880 elem
= get_elem_id(doc
, "inputid");
1881 elem2
= get_elem2_iface((IUnknown
*)elem
);
1882 IHTMLElement_Release(elem
);
1884 V_VT(&v
) = VT_EMPTY
;
1885 hres
= IHTMLElement2_get_onfocus(elem2
, &v
);
1886 ok(hres
== S_OK
, "get_onfocus failed: %08x\n", hres
);
1887 ok(V_VT(&v
) == VT_NULL
, "V_VT(onfocus) = %d\n", V_VT(&v
));
1889 V_VT(&v
) = VT_DISPATCH
;
1890 V_DISPATCH(&v
) = (IDispatch
*)&input_onfocus_obj
;
1891 hres
= IHTMLElement2_put_onfocus(elem2
, v
);
1892 ok(hres
== S_OK
, "put_onfocus failed: %08x\n", hres
);
1894 V_VT(&v
) = VT_EMPTY
;
1895 hres
= IHTMLElement2_get_onfocus(elem2
, &v
);
1896 ok(hres
== S_OK
, "get_onfocus failed: %08x\n", hres
);
1897 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(onfocus) = %d\n", V_VT(&v
));
1898 ok(V_DISPATCH(&v
) == (IDispatch
*)&input_onfocus_obj
, "V_DISPATCH(onfocus) != onfocusFunc\n");
1901 if(!winetest_interactive
)
1902 ShowWindow(container_hwnd
, SW_SHOW
);
1905 ok(!IsChild(container_hwnd
, GetFocus()), "focus belongs to document window\n");
1907 hres
= IHTMLWindow2_focus(window
);
1908 ok(hres
== S_OK
, "focus failed: %08x\n", hres
);
1910 ok(IsChild(container_hwnd
, GetFocus()), "focus does not belong to document window\n");
1913 SET_EXPECT(input_onfocus
);
1914 hres
= IHTMLElement2_focus(elem2
);
1916 CHECK_CALLED(input_onfocus
);
1917 ok(hres
== S_OK
, "focus failed: %08x\n", hres
);
1919 V_VT(&v
) = VT_DISPATCH
;
1920 V_DISPATCH(&v
) = (IDispatch
*)&input_onblur_obj
;
1921 hres
= IHTMLElement2_put_onblur(elem2
, v
);
1922 ok(hres
== S_OK
, "put_onblur failed: %08x\n", hres
);
1924 SET_EXPECT(input_onblur
);
1925 hres
= IHTMLElement2_blur(elem2
);
1927 CHECK_CALLED(input_onblur
);
1928 ok(hres
== S_OK
, "blur failed: %08x\n", hres
);
1930 if(!winetest_interactive
)
1931 ShowWindow(container_hwnd
, SW_HIDE
);
1933 IHTMLElement2_Release(elem2
);
1936 static void test_submit(IHTMLDocument2
*doc
)
1938 IHTMLElement
*elem
, *submit
;
1939 IHTMLFormElement
*form
;
1944 elem
= get_elem_id(doc
, "formid");
1946 V_VT(&v
) = VT_DISPATCH
;
1947 V_DISPATCH(&v
) = (IDispatch
*)&form_onclick_obj
;
1948 hres
= IHTMLElement_put_onclick(elem
, v
);
1949 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1951 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLFormElement
, (void**)&form
);
1952 IHTMLElement_Release(elem
);
1953 ok(hres
== S_OK
, "Could not get IHTMLFormElement iface: %08x\n", hres
);
1955 V_VT(&v
) = VT_DISPATCH
;
1956 V_DISPATCH(&v
) = (IDispatch
*)&form_onsubmit_obj
;
1957 hres
= IHTMLFormElement_put_onsubmit(form
, v
);
1958 ok(hres
== S_OK
, "put_onsubmit failed: %08x\n", hres
);
1960 IHTMLFormElement_Release(form
);
1962 submit
= get_elem_id(doc
, "submitid");
1964 SET_EXPECT(form_onclick
);
1965 SET_EXPECT(form_onsubmit
);
1966 hres
= IHTMLElement_click(submit
);
1967 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1968 CHECK_CALLED(form_onclick
);
1969 CHECK_CALLED(form_onsubmit
);
1971 V_VT(&v
) = VT_DISPATCH
;
1972 V_DISPATCH(&v
) = (IDispatch
*)&submit_onclick_obj
;
1973 hres
= IHTMLElement_put_onclick(submit
, v
);
1974 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1976 SET_EXPECT(form_onclick
);
1977 SET_EXPECT(submit_onclick
);
1978 hres
= IHTMLElement_click(submit
);
1979 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1980 CHECK_CALLED(form_onclick
);
1981 CHECK_CALLED(submit_onclick
);
1983 elem_attach_event((IUnknown
*)submit
, "onclick", (IDispatch
*)&submit_onclick_attached_obj
);
1985 SET_EXPECT(form_onclick
);
1986 SET_EXPECT(submit_onclick
);
1987 SET_EXPECT(submit_onclick_attached
);
1988 hres
= IHTMLElement_click(submit
);
1989 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
1990 CHECK_CALLED(form_onclick
);
1991 CHECK_CALLED(submit_onclick
);
1992 CHECK_CALLED(submit_onclick_attached
);
1995 hres
= IHTMLElement_put_onclick(submit
, v
);
1996 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
1998 SET_EXPECT(form_onclick
);
1999 SET_EXPECT(submit_onclick_attached
);
2000 hres
= IHTMLElement_click(submit
);
2001 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2002 CHECK_CALLED(form_onclick
);
2003 CHECK_CALLED(submit_onclick_attached
);
2005 elem_detach_event((IUnknown
*)submit
, "onclick", (IDispatch
*)&submit_onclick_attached_obj
);
2007 cp_cookie
= register_cp((IUnknown
*)doc
, &DIID_HTMLDocumentEvents
, (IUnknown
*)&doccp_onclick_cancel_obj
);
2009 SET_EXPECT(form_onclick
);
2010 SET_EXPECT(doccp_onclick_cancel
);
2011 hres
= IHTMLElement_click(submit
);
2012 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2013 CHECK_CALLED(form_onclick
);
2014 CHECK_CALLED(doccp_onclick_cancel
);
2016 unregister_cp((IUnknown
*)doc
, &DIID_HTMLDocumentEvents
, cp_cookie
);
2018 V_VT(&v
) = VT_DISPATCH
;
2019 V_DISPATCH(&v
) = (IDispatch
*)&submit_onclick_setret_obj
;
2020 hres
= IHTMLElement_put_onclick(submit
, v
);
2021 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
2023 V_VT(&onclick_retval
) = VT_BOOL
;
2024 V_BOOL(&onclick_retval
) = VARIANT_TRUE
;
2025 V_VT(&onclick_event_retval
) = VT_BOOL
;
2026 V_BOOL(&onclick_event_retval
) = VARIANT_TRUE
;
2028 SET_EXPECT(submit_onclick_setret
);
2029 SET_EXPECT(form_onclick
);
2030 SET_EXPECT(form_onsubmit
);
2031 hres
= IHTMLElement_click(submit
);
2032 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2033 CHECK_CALLED(submit_onclick_setret
);
2034 CHECK_CALLED(form_onclick
);
2035 CHECK_CALLED(form_onsubmit
);
2037 V_VT(&onclick_event_retval
) = VT_BOOL
;
2038 V_BOOL(&onclick_event_retval
) = VARIANT_FALSE
;
2040 SET_EXPECT(submit_onclick_setret
);
2041 SET_EXPECT(form_onclick
);
2042 hres
= IHTMLElement_click(submit
);
2043 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2044 CHECK_CALLED(submit_onclick_setret
);
2045 CHECK_CALLED(form_onclick
);
2047 V_VT(&onclick_retval
) = VT_BOOL
;
2048 V_BOOL(&onclick_retval
) = VARIANT_FALSE
;
2049 V_VT(&onclick_event_retval
) = VT_BOOL
;
2050 V_BOOL(&onclick_event_retval
) = VARIANT_TRUE
;
2052 SET_EXPECT(submit_onclick_setret
);
2053 SET_EXPECT(form_onclick
);
2054 hres
= IHTMLElement_click(submit
);
2055 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2056 CHECK_CALLED(submit_onclick_setret
);
2057 CHECK_CALLED(form_onclick
);
2059 V_VT(&onclick_event_retval
) = VT_BOOL
;
2060 V_BOOL(&onclick_event_retval
) = VARIANT_FALSE
;
2062 SET_EXPECT(submit_onclick_setret
);
2063 SET_EXPECT(form_onclick
);
2064 hres
= IHTMLElement_click(submit
);
2065 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2066 CHECK_CALLED(submit_onclick_setret
);
2067 CHECK_CALLED(form_onclick
);
2069 elem_attach_event((IUnknown
*)submit
, "onclick", (IDispatch
*)&submit_onclick_attached_obj
);
2070 elem_attach_event((IUnknown
*)submit
, "onclick", (IDispatch
*)&submit_onclick_attached_check_cancel_obj
);
2072 V_VT(&v
) = VT_DISPATCH
;
2073 V_DISPATCH(&v
) = (IDispatch
*)&submit_onclick_cancel_obj
;
2074 hres
= IHTMLElement_put_onclick(submit
, v
);
2075 ok(hres
== S_OK
, "put_onclick failed: %08x\n", hres
);
2077 SET_EXPECT(submit_onclick_cancel
);
2078 SET_EXPECT(submit_onclick_attached_check_cancel
);
2079 SET_EXPECT(submit_onclick_attached
);
2080 hres
= IHTMLElement_click(submit
);
2081 ok(hres
== S_OK
, "click failed: %08x\n", hres
);
2082 CHECK_CALLED(submit_onclick_cancel
);
2083 CHECK_CALLED(submit_onclick_attached_check_cancel
);
2084 CHECK_CALLED(submit_onclick_attached
);
2086 if(1)pump_msgs(NULL
);
2088 IHTMLElement_Release(submit
);
2091 static void test_timeout(IHTMLDocument2
*doc
)
2098 hres
= IHTMLWindow2_QueryInterface(window
, &IID_IHTMLWindow3
, (void**)&win3
);
2099 ok(hres
== S_OK
, "Could not get IHTMLWindow3 iface: %08x\n", hres
);
2101 V_VT(&expr
) = VT_DISPATCH
;
2102 V_DISPATCH(&expr
) = (IDispatch
*)&timeoutFunc
;
2103 V_VT(&var
) = VT_EMPTY
;
2105 hres
= IHTMLWindow3_setTimeout(win3
, &expr
, 0, &var
, &id
);
2106 ok(hres
== S_OK
, "setTimeout failed: %08x\n", hres
);
2109 SET_EXPECT(timeout
);
2110 pump_msgs(&called_timeout
);
2111 CHECK_CALLED(timeout
);
2113 V_VT(&expr
) = VT_DISPATCH
;
2114 V_DISPATCH(&expr
) = (IDispatch
*)&timeoutFunc
;
2115 V_VT(&var
) = VT_EMPTY
;
2117 hres
= IHTMLWindow3_setTimeout(win3
, &expr
, 0, &var
, &id
);
2118 ok(hres
== S_OK
, "setTimeout failed: %08x\n", hres
);
2121 hres
= IHTMLWindow2_clearTimeout(window
, id
);
2122 ok(hres
== S_OK
, "clearTimeout failed: %08x\n", hres
);
2124 IHTMLWindow3_Release(win3
);
2127 static IHTMLElement
* find_element_by_id(IHTMLDocument2
*doc
, const char *id
)
2130 IHTMLDocument3
*doc3
;
2131 IHTMLElement
*result
;
2132 BSTR idW
= a2bstr(id
);
2134 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument3
, (void**)&doc3
);
2135 ok(hres
== S_OK
, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres
);
2137 hres
= IHTMLDocument3_getElementById(doc3
, idW
, &result
);
2138 ok(hres
== S_OK
, "getElementById failed: %08x\n", hres
);
2139 ok(result
!= NULL
, "result == NULL\n");
2142 IHTMLDocument3_Release(doc3
);
2146 static IHTMLDocument2
* get_iframe_doc(IHTMLIFrameElement
*iframe
)
2149 IHTMLFrameBase2
*base
;
2150 IHTMLDocument2
*result
= NULL
;
2152 hres
= IHTMLIFrameElement_QueryInterface(iframe
, &IID_IHTMLFrameBase2
, (void**)&base
);
2153 ok(hres
== S_OK
, "QueryInterface(IID_IHTMLFrameBase2) failed: %08x\n", hres
);
2155 IHTMLWindow2
*window
;
2157 hres
= IHTMLFrameBase2_get_contentWindow(base
, &window
);
2158 ok(hres
== S_OK
, "get_contentWindow failed: %08x\n", hres
);
2159 ok(window
!= NULL
, "window == NULL\n");
2161 hres
= IHTMLWindow2_get_document(window
, &result
);
2162 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
2163 ok(result
!= NULL
, "result == NULL\n");
2164 IHTMLWindow2_Release(window
);
2167 if(base
) IHTMLFrameBase2_Release(base
);
2172 static void test_iframe_connections(IHTMLDocument2
*doc
)
2174 IHTMLIFrameElement
*iframe
;
2175 IHTMLDocument2
*iframes_doc
;
2177 IConnectionPoint
*cp
;
2178 IHTMLElement
*element
;
2182 trace("iframe tests...\n");
2184 element
= find_element_by_id(doc
, "ifr");
2185 iframe
= get_iframe_iface((IUnknown
*)element
);
2186 IHTMLElement_Release(element
);
2188 iframes_doc
= get_iframe_doc(iframe
);
2189 IHTMLIFrameElement_Release(iframe
);
2191 cookie
= register_cp((IUnknown
*)iframes_doc
, &IID_IDispatch
, (IUnknown
*)&div_onclick_disp
);
2193 cp
= get_cp((IUnknown
*)doc
, &IID_IDispatch
);
2194 hres
= IConnectionPoint_Unadvise(cp
, cookie
);
2195 IConnectionPoint_Release(cp
);
2196 ok(hres
== CONNECT_E_NOCONNECTION
, "Unadvise returned %08x, expected CONNECT_E_NOCONNECTION\n", hres
);
2198 unregister_cp((IUnknown
*)iframes_doc
, &IID_IDispatch
, cookie
);
2201 IHTMLFrameBase2
*frame_base2
;
2204 hres
= IHTMLIFrameElement_QueryInterface(iframe
, &IID_IHTMLFrameBase2
, (void**)&frame_base2
);
2205 ok(hres
== S_OK
, "Could not get IHTMLFrameBase2 iface: %08x\n", hres
);
2207 V_VT(&v
) = VT_DISPATCH
;
2208 V_DISPATCH(&v
) = (IDispatch
*)&iframe_onload_obj
;
2209 hres
= IHTMLFrameBase2_put_onload(frame_base2
, v
);
2210 ok(hres
== S_OK
, "put_onload failed: %08x\n", hres
);
2212 IHTMLFrameBase2_Release(frame_base2
);
2214 str
= a2bstr("about:blank");
2215 hres
= IHTMLDocument2_put_URL(iframes_doc
, str
);
2216 ok(hres
== S_OK
, "put_URL failed: %08x\n", hres
);
2219 SET_EXPECT(iframe_onload
);
2220 pump_msgs(&called_iframe_onload
);
2221 CHECK_CALLED(iframe_onload
);
2223 str
= a2bstr("about:test");
2224 hres
= IHTMLDocument2_put_URL(iframes_doc
, str
);
2225 ok(hres
== S_OK
, "put_URL failed: %08x\n", hres
);
2228 SET_EXPECT(iframe_onload
);
2229 pump_msgs(&called_iframe_onload
);
2230 CHECK_CALLED(iframe_onload
);
2232 win_skip("Skipping iframe onload tests on IE older than 9.\n");
2235 IHTMLDocument2_Release(iframes_doc
);
2238 static HRESULT
QueryInterface(REFIID
,void**);
2240 static HRESULT WINAPI
InPlaceFrame_QueryInterface(IOleInPlaceFrame
*iface
, REFIID riid
, void **ppv
)
2242 return E_NOINTERFACE
;
2245 static ULONG WINAPI
InPlaceFrame_AddRef(IOleInPlaceFrame
*iface
)
2250 static ULONG WINAPI
InPlaceFrame_Release(IOleInPlaceFrame
*iface
)
2255 static HRESULT WINAPI
InPlaceFrame_GetWindow(IOleInPlaceFrame
*iface
, HWND
*phwnd
)
2260 static HRESULT WINAPI
InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame
*iface
, BOOL fEnterMode
)
2265 static HRESULT WINAPI
InPlaceFrame_GetBorder(IOleInPlaceFrame
*iface
, LPRECT lprectBorder
)
2270 static HRESULT WINAPI
InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame
*iface
,
2271 LPCBORDERWIDTHS pborderwidths
)
2276 static HRESULT WINAPI
InPlaceFrame_SetBorderSpace(IOleInPlaceFrame
*iface
,
2277 LPCBORDERWIDTHS pborderwidths
)
2282 static HRESULT WINAPI
InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame
*iface
,
2283 IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR pszObjName
)
2288 static HRESULT WINAPI
InPlaceFrame_SetActiveObject(IOleInPlaceFrame
*iface
,
2289 IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR pszObjName
)
2294 static HRESULT WINAPI
InPlaceFrame_InsertMenus(IOleInPlaceFrame
*iface
, HMENU hmenuShared
,
2295 LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2300 static HRESULT WINAPI
InPlaceFrame_SetMenu(IOleInPlaceFrame
*iface
, HMENU hmenuShared
,
2301 HOLEMENU holemenu
, HWND hwndActiveObject
)
2303 ok(0, "unexpected call\n");
2307 static HRESULT WINAPI
InPlaceFrame_RemoveMenus(IOleInPlaceFrame
*iface
, HMENU hmenuShared
)
2309 ok(0, "unexpected call\n");
2313 static HRESULT WINAPI
InPlaceFrame_SetStatusText(IOleInPlaceFrame
*iface
, LPCOLESTR pszStatusText
)
2318 static HRESULT WINAPI
InPlaceFrame_EnableModeless(IOleInPlaceFrame
*iface
, BOOL fEnable
)
2323 static HRESULT WINAPI
InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame
*iface
, LPMSG lpmsg
, WORD wID
)
2325 ok(0, "unexpected call\n");
2329 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl
= {
2330 InPlaceFrame_QueryInterface
,
2331 InPlaceFrame_AddRef
,
2332 InPlaceFrame_Release
,
2333 InPlaceFrame_GetWindow
,
2334 InPlaceFrame_ContextSensitiveHelp
,
2335 InPlaceFrame_GetBorder
,
2336 InPlaceFrame_RequestBorderSpace
,
2337 InPlaceFrame_SetBorderSpace
,
2338 InPlaceFrame_SetActiveObject
,
2339 InPlaceFrame_InsertMenus
,
2340 InPlaceFrame_SetMenu
,
2341 InPlaceFrame_RemoveMenus
,
2342 InPlaceFrame_SetStatusText
,
2343 InPlaceFrame_EnableModeless
,
2344 InPlaceFrame_TranslateAccelerator
2347 static IOleInPlaceFrame InPlaceFrame
= { &InPlaceFrameVtbl
};
2349 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl
= {
2350 InPlaceFrame_QueryInterface
,
2351 InPlaceFrame_AddRef
,
2352 InPlaceFrame_Release
,
2353 InPlaceFrame_GetWindow
,
2354 InPlaceFrame_ContextSensitiveHelp
,
2355 InPlaceFrame_GetBorder
,
2356 InPlaceFrame_RequestBorderSpace
,
2357 InPlaceFrame_SetBorderSpace
,
2358 InPlaceUIWindow_SetActiveObject
,
2361 static IOleInPlaceFrame InPlaceUIWindow
= { &InPlaceUIWindowVtbl
};
2363 static HRESULT WINAPI
InPlaceSite_QueryInterface(IOleInPlaceSite
*iface
, REFIID riid
, void **ppv
)
2365 return QueryInterface(riid
, ppv
);
2368 static ULONG WINAPI
InPlaceSite_AddRef(IOleInPlaceSite
*iface
)
2373 static ULONG WINAPI
InPlaceSite_Release(IOleInPlaceSite
*iface
)
2378 static HRESULT WINAPI
InPlaceSite_GetWindow(IOleInPlaceSite
*iface
, HWND
*phwnd
)
2380 *phwnd
= container_hwnd
;
2384 static HRESULT WINAPI
InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite
*iface
, BOOL fEnterMode
)
2386 ok(0, "unexpected call\n");
2390 static HRESULT WINAPI
InPlaceSite_CanInPlaceActivate(IOleInPlaceSite
*iface
)
2395 static HRESULT WINAPI
InPlaceSite_OnInPlaceActivate(IOleInPlaceSite
*iface
)
2400 static HRESULT WINAPI
InPlaceSite_OnUIActivate(IOleInPlaceSite
*iface
)
2405 static HRESULT WINAPI
InPlaceSite_GetWindowContext(IOleInPlaceSite
*iface
,
2406 IOleInPlaceFrame
**ppFrame
, IOleInPlaceUIWindow
**ppDoc
, LPRECT lprcPosRect
,
2407 LPRECT lprcClipRect
, LPOLEINPLACEFRAMEINFO lpFrameInfo
)
2409 static const RECT rect
= {0,0,300,300};
2411 *ppFrame
= &InPlaceFrame
;
2412 *ppDoc
= (IOleInPlaceUIWindow
*)&InPlaceUIWindow
;
2413 *lprcPosRect
= rect
;
2414 *lprcClipRect
= rect
;
2416 ok(lpFrameInfo
->cb
== sizeof(*lpFrameInfo
), "lpFrameInfo->cb = %u, expected %u\n", lpFrameInfo
->cb
, (unsigned)sizeof(*lpFrameInfo
));
2417 lpFrameInfo
->fMDIApp
= FALSE
;
2418 lpFrameInfo
->hwndFrame
= container_hwnd
;
2419 lpFrameInfo
->haccel
= NULL
;
2420 lpFrameInfo
->cAccelEntries
= 0;
2425 static HRESULT WINAPI
InPlaceSite_Scroll(IOleInPlaceSite
*iface
, SIZE scrollExtant
)
2430 static HRESULT WINAPI
InPlaceSite_OnUIDeactivate(IOleInPlaceSite
*iface
, BOOL fUndoable
)
2435 static HRESULT WINAPI
InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite
*iface
)
2440 static HRESULT WINAPI
InPlaceSite_DiscardUndoState(IOleInPlaceSite
*iface
)
2445 static HRESULT WINAPI
InPlaceSite_DeactivateAndUndo(IOleInPlaceSite
*iface
)
2450 static HRESULT WINAPI
InPlaceSite_OnPosRectChange(IOleInPlaceSite
*iface
, LPCRECT lprcPosRect
)
2455 static const IOleInPlaceSiteVtbl InPlaceSiteVtbl
= {
2456 InPlaceSite_QueryInterface
,
2458 InPlaceSite_Release
,
2459 InPlaceSite_GetWindow
,
2460 InPlaceSite_ContextSensitiveHelp
,
2461 InPlaceSite_CanInPlaceActivate
,
2462 InPlaceSite_OnInPlaceActivate
,
2463 InPlaceSite_OnUIActivate
,
2464 InPlaceSite_GetWindowContext
,
2466 InPlaceSite_OnUIDeactivate
,
2467 InPlaceSite_OnInPlaceDeactivate
,
2468 InPlaceSite_DiscardUndoState
,
2469 InPlaceSite_DeactivateAndUndo
,
2470 InPlaceSite_OnPosRectChange
,
2473 static IOleInPlaceSite InPlaceSite
= { &InPlaceSiteVtbl
};
2475 static HRESULT WINAPI
ClientSite_QueryInterface(IOleClientSite
*iface
, REFIID riid
, void **ppv
)
2477 return QueryInterface(riid
, ppv
);
2480 static ULONG WINAPI
ClientSite_AddRef(IOleClientSite
*iface
)
2485 static ULONG WINAPI
ClientSite_Release(IOleClientSite
*iface
)
2490 static HRESULT WINAPI
ClientSite_SaveObject(IOleClientSite
*iface
)
2492 ok(0, "unexpected call\n");
2496 static HRESULT WINAPI
ClientSite_GetMoniker(IOleClientSite
*iface
, DWORD dwAssign
, DWORD dwWhichMoniker
,
2499 ok(0, "unexpected call\n");
2503 static HRESULT WINAPI
ClientSite_GetContainer(IOleClientSite
*iface
, IOleContainer
**ppContainer
)
2508 static HRESULT WINAPI
ClientSite_ShowObject(IOleClientSite
*iface
)
2510 ok(0, "unexpected call\n");
2514 static HRESULT WINAPI
ClientSite_OnShowWindow(IOleClientSite
*iface
, BOOL fShow
)
2516 ok(0, "unexpected call\n");
2520 static HRESULT WINAPI
ClientSite_RequestNewObjectLayout(IOleClientSite
*iface
)
2522 ok(0, "unexpected call\n");
2526 static const IOleClientSiteVtbl ClientSiteVtbl
= {
2527 ClientSite_QueryInterface
,
2530 ClientSite_SaveObject
,
2531 ClientSite_GetMoniker
,
2532 ClientSite_GetContainer
,
2533 ClientSite_ShowObject
,
2534 ClientSite_OnShowWindow
,
2535 ClientSite_RequestNewObjectLayout
2538 static IOleClientSite ClientSite
= { &ClientSiteVtbl
};
2540 static HRESULT WINAPI
DocumentSite_QueryInterface(IOleDocumentSite
*iface
, REFIID riid
, void **ppv
)
2542 return QueryInterface(riid
, ppv
);
2545 static ULONG WINAPI
DocumentSite_AddRef(IOleDocumentSite
*iface
)
2550 static ULONG WINAPI
DocumentSite_Release(IOleDocumentSite
*iface
)
2555 static HRESULT WINAPI
DocumentSite_ActivateMe(IOleDocumentSite
*iface
, IOleDocumentView
*pViewToActivate
)
2557 RECT rect
= {0,0,300,300};
2558 IOleDocument
*document
;
2561 hres
= IOleDocumentView_QueryInterface(pViewToActivate
, &IID_IOleDocument
, (void**)&document
);
2562 ok(hres
== S_OK
, "could not get IOleDocument: %08x\n", hres
);
2564 hres
= IOleDocument_CreateView(document
, &InPlaceSite
, NULL
, 0, &view
);
2565 IOleDocument_Release(document
);
2566 ok(hres
== S_OK
, "CreateView failed: %08x\n", hres
);
2568 hres
= IOleDocumentView_SetInPlaceSite(view
, &InPlaceSite
);
2569 ok(hres
== S_OK
, "SetInPlaceSite failed: %08x\n", hres
);
2571 hres
= IOleDocumentView_UIActivate(view
, TRUE
);
2572 ok(hres
== S_OK
, "UIActivate failed: %08x\n", hres
);
2574 hres
= IOleDocumentView_SetRect(view
, &rect
);
2575 ok(hres
== S_OK
, "SetRect failed: %08x\n", hres
);
2577 hres
= IOleDocumentView_Show(view
, TRUE
);
2578 ok(hres
== S_OK
, "Show failed: %08x\n", hres
);
2583 static const IOleDocumentSiteVtbl DocumentSiteVtbl
= {
2584 DocumentSite_QueryInterface
,
2585 DocumentSite_AddRef
,
2586 DocumentSite_Release
,
2587 DocumentSite_ActivateMe
2590 static IOleDocumentSite DocumentSite
= { &DocumentSiteVtbl
};
2592 static HRESULT
QueryInterface(REFIID riid
, void **ppv
)
2596 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IOleClientSite
, riid
))
2598 else if(IsEqualGUID(&IID_IOleDocumentSite
, riid
))
2599 *ppv
= &DocumentSite
;
2600 else if(IsEqualGUID(&IID_IOleWindow
, riid
) || IsEqualGUID(&IID_IOleInPlaceSite
, riid
))
2601 *ppv
= &InPlaceSite
;
2603 return *ppv
? S_OK
: E_NOINTERFACE
;
2606 static IHTMLDocument2
*notif_doc
;
2607 static BOOL doc_complete
;
2609 static HRESULT WINAPI
PropertyNotifySink_QueryInterface(IPropertyNotifySink
*iface
,
2610 REFIID riid
, void**ppv
)
2612 if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
2617 ok(0, "unexpected call\n");
2618 return E_NOINTERFACE
;
2621 static ULONG WINAPI
PropertyNotifySink_AddRef(IPropertyNotifySink
*iface
)
2626 static ULONG WINAPI
PropertyNotifySink_Release(IPropertyNotifySink
*iface
)
2631 static HRESULT WINAPI
PropertyNotifySink_OnChanged(IPropertyNotifySink
*iface
, DISPID dispID
)
2633 if(dispID
== DISPID_READYSTATE
){
2637 hres
= IHTMLDocument2_get_readyState(notif_doc
, &state
);
2638 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
2640 if(!strcmp_wa(state
, "complete"))
2641 doc_complete
= TRUE
;
2643 SysFreeString(state
);
2649 static HRESULT WINAPI
PropertyNotifySink_OnRequestEdit(IPropertyNotifySink
*iface
, DISPID dispID
)
2651 ok(0, "unexpected call\n");
2655 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
= {
2656 PropertyNotifySink_QueryInterface
,
2657 PropertyNotifySink_AddRef
,
2658 PropertyNotifySink_Release
,
2659 PropertyNotifySink_OnChanged
,
2660 PropertyNotifySink_OnRequestEdit
2663 static IPropertyNotifySink PropertyNotifySink
= { &PropertyNotifySinkVtbl
};
2665 static void doc_load_string(IHTMLDocument2
*doc
, const char *str
)
2667 IPersistStreamInit
*init
;
2674 doc_complete
= FALSE
;
2676 mem
= GlobalAlloc(0, len
);
2677 memcpy(mem
, str
, len
);
2678 CreateStreamOnHGlobal(mem
, TRUE
, &stream
);
2680 IHTMLDocument2_QueryInterface(doc
, &IID_IPersistStreamInit
, (void**)&init
);
2682 IPersistStreamInit_Load(init
, stream
);
2683 IPersistStreamInit_Release(init
);
2684 IStream_Release(stream
);
2687 static void do_advise(IUnknown
*unk
, REFIID riid
, IUnknown
*unk_advise
)
2689 IConnectionPointContainer
*container
;
2690 IConnectionPoint
*cp
;
2694 hres
= IUnknown_QueryInterface(unk
, &IID_IConnectionPointContainer
, (void**)&container
);
2695 ok(hres
== S_OK
, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres
);
2697 hres
= IConnectionPointContainer_FindConnectionPoint(container
, riid
, &cp
);
2698 IConnectionPointContainer_Release(container
);
2699 ok(hres
== S_OK
, "FindConnectionPoint failed: %08x\n", hres
);
2701 hres
= IConnectionPoint_Advise(cp
, unk_advise
, &cookie
);
2702 IConnectionPoint_Release(cp
);
2703 ok(hres
== S_OK
, "Advise failed: %08x\n", hres
);
2706 static void set_client_site(IHTMLDocument2
*doc
, BOOL set
)
2712 IOleDocumentView_Show(view
, FALSE
);
2713 IOleDocumentView_CloseView(view
, 0);
2714 IOleDocumentView_SetInPlaceSite(view
, NULL
);
2715 IOleDocumentView_Release(view
);
2719 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IOleObject
, (void**)&oleobj
);
2720 ok(hres
== S_OK
, "Could not et IOleObject: %08x\n", hres
);
2722 hres
= IOleObject_SetClientSite(oleobj
, set
? &ClientSite
: NULL
);
2723 ok(hres
== S_OK
, "SetClientSite failed: %08x\n", hres
);
2726 IHlinkTarget
*hlink
;
2728 hres
= IOleObject_QueryInterface(oleobj
, &IID_IHlinkTarget
, (void**)&hlink
);
2729 ok(hres
== S_OK
, "Could not get IHlinkTarget iface: %08x\n", hres
);
2731 hres
= IHlinkTarget_Navigate(hlink
, 0, NULL
);
2732 ok(hres
== S_OK
, "Navgate failed: %08x\n", hres
);
2734 IHlinkTarget_Release(hlink
);
2737 IOleObject_Release(oleobj
);
2739 static IHTMLDocument2
*create_document(void)
2741 IHTMLDocument2
*doc
;
2744 hres
= CoCreateInstance(&CLSID_HTMLDocument
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
2745 &IID_IHTMLDocument2
, (void**)&doc
);
2746 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
2747 return SUCCEEDED(hres
) ? doc
: NULL
;
2751 typedef void (*testfunc_t
)(IHTMLDocument2
*);
2753 static void run_test(const char *str
, testfunc_t test
)
2755 IHTMLDocument2
*doc
;
2756 IHTMLElement
*body
= NULL
;
2761 doc
= create_document();
2764 set_client_site(doc
, TRUE
);
2765 doc_load_string(doc
, str
);
2766 do_advise((IUnknown
*)doc
, &IID_IPropertyNotifySink
, (IUnknown
*)&PropertyNotifySink
);
2768 while(!doc_complete
&& GetMessageA(&msg
, NULL
, 0, 0)) {
2769 TranslateMessage(&msg
);
2770 DispatchMessageA(&msg
);
2773 hres
= IHTMLDocument2_get_body(doc
, &body
);
2774 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
2777 IHTMLElement_Release(body
);
2779 hres
= IHTMLDocument2_get_parentWindow(doc
, &window
);
2780 ok(hres
== S_OK
, "get_parentWindow failed: %08x\n", hres
);
2781 ok(window
!= NULL
, "window == NULL\n");
2785 IHTMLWindow2_Release(window
);
2788 skip("Could not get document body. Assuming no Gecko installed.\n");
2791 set_client_site(doc
, FALSE
);
2792 IHTMLDocument2_Release(doc
);
2795 static LRESULT WINAPI
wnd_proc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
2797 return DefWindowProcA(hwnd
, msg
, wParam
, lParam
);
2800 static HWND
create_container_window(void)
2802 static const CHAR szHTMLDocumentTest
[] = "HTMLDocumentTest";
2803 static WNDCLASSEXA wndclass
= {
2804 sizeof(WNDCLASSEXA
),
2807 0, 0, NULL
, NULL
, NULL
, NULL
, NULL
,
2812 RegisterClassExA(&wndclass
);
2813 return CreateWindowA(szHTMLDocumentTest
, szHTMLDocumentTest
,
2814 WS_OVERLAPPEDWINDOW
, CW_USEDEFAULT
, CW_USEDEFAULT
,
2815 300, 300, NULL
, NULL
, NULL
, NULL
);
2818 static void test_empty_document(void)
2821 IHTMLWindow2
*window
;
2822 IHTMLDocument2
*windows_doc
, *doc
;
2823 IConnectionPoint
*cp
;
2826 doc
= create_document();
2830 hres
= IHTMLDocument2_get_parentWindow(doc
, &window
);
2831 ok(hres
== S_OK
, "get_parentWindow failed: %08x\n", hres
);
2833 hres
= IHTMLWindow2_get_document(window
, &windows_doc
);
2834 IHTMLWindow2_Release(window
);
2835 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
2837 cookie
= register_cp((IUnknown
*)windows_doc
, &IID_IDispatch
, (IUnknown
*)&div_onclick_disp
);
2839 cp
= get_cp((IUnknown
*)doc
, &IID_IDispatch
);
2840 hres
= IConnectionPoint_Unadvise(cp
, cookie
);
2841 IConnectionPoint_Release(cp
);
2842 ok(hres
== S_OK
, "Unadvise failed: %08x\n", hres
);
2844 IHTMLDocument2_Release(windows_doc
);
2845 IHTMLDocument2_Release(doc
);
2848 static BOOL
check_ie(void)
2850 IHTMLDocument2
*doc
;
2851 IHTMLDocument5
*doc5
;
2852 IHTMLDocument7
*doc7
;
2855 doc
= create_document();
2859 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument7
, (void**)&doc7
);
2860 if(SUCCEEDED(hres
)) {
2862 IHTMLDocument7_Release(doc7
);
2865 trace("is_ie9plus %x\n", is_ie9plus
);
2867 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument5
, (void**)&doc5
);
2869 IHTMLDocument5_Release(doc5
);
2871 IHTMLDocument2_Release(doc
);
2872 return SUCCEEDED(hres
);
2880 container_hwnd
= create_container_window();
2882 if(winetest_interactive
)
2883 ShowWindow(container_hwnd
, SW_SHOW
);
2885 run_test(empty_doc_str
, test_timeout
);
2886 run_test(click_doc_str
, test_onclick
);
2887 run_test(readystate_doc_str
, test_onreadystatechange
);
2888 run_test(img_doc_str
, test_imgload
);
2889 run_test(input_doc_str
, test_focus
);
2890 run_test(form_doc_str
, test_submit
);
2891 run_test(iframe_doc_str
, test_iframe_connections
);
2893 test_empty_document();
2895 DestroyWindow(container_hwnd
);
2897 win_skip("Too old IE\n");