wined3d: Rename WINED3D_MAX_TEXTURES to WINED3D_MAX_FFP_TEXTURES.
[wine.git] / dlls / mshtml / tests / events.c
blobf972c2a8316e87300da9e6c9c9c5e46461142676
1 /*
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
19 #define COBJMACROS
20 #define CONST_VTABLE
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "ole2.h"
29 #include "mshtml.h"
30 #include "mshtmdid.h"
31 #include "mshtmhst.h"
32 #include "docobj.h"
33 #include "hlink.h"
34 #include "wininet.h"
35 #include "shdeprecated.h"
36 #include "dispex.h"
38 #define DEFINE_EXPECT(func) \
39 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
41 #define SET_EXPECT(func) \
42 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
44 #define CHECK_EXPECT2(func) \
45 do { \
46 trace(#func "\n"); \
47 ok(expect_ ##func, "unexpected call " #func "\n"); \
48 called_ ## func = TRUE; \
49 }while(0)
51 #define CHECK_EXPECT(func) \
52 do { \
53 CHECK_EXPECT2(func); \
54 expect_ ## func = FALSE; \
55 }while(0)
57 #define CHECK_CALLED(func) \
58 do { \
59 ok(called_ ## func, "expected " #func "\n"); \
60 expect_ ## func = called_ ## func = FALSE; \
61 }while(0)
63 #define CLEAR_CALLED(func) \
64 expect_ ## func = called_ ## func = FALSE
66 DEFINE_EXPECT(docobj_onclick);
67 DEFINE_EXPECT(document_onclick);
68 DEFINE_EXPECT(body_onclick);
69 DEFINE_EXPECT(doc_onclick_attached);
70 DEFINE_EXPECT(div_onclick);
71 DEFINE_EXPECT(div_onclick_attached);
72 DEFINE_EXPECT(div_onclick_capture);
73 DEFINE_EXPECT(div_onclick_bubble);
74 DEFINE_EXPECT(timeout);
75 DEFINE_EXPECT(doccp_onclick);
76 DEFINE_EXPECT(doccp2_onclick);
77 DEFINE_EXPECT(doccp_onclick_cancel);
78 DEFINE_EXPECT(div_onclick_disp);
79 DEFINE_EXPECT(invoke_onclick);
80 DEFINE_EXPECT(iframe_onreadystatechange_loading);
81 DEFINE_EXPECT(iframe_onreadystatechange_interactive);
82 DEFINE_EXPECT(iframe_onreadystatechange_complete);
83 DEFINE_EXPECT(iframedoc_onreadystatechange);
84 DEFINE_EXPECT(img_onload);
85 DEFINE_EXPECT(img_onerror);
86 DEFINE_EXPECT(input_onload);
87 DEFINE_EXPECT(link_onload);
88 DEFINE_EXPECT(input_onfocus);
89 DEFINE_EXPECT(input_onblur);
90 DEFINE_EXPECT(div_onfocusin);
91 DEFINE_EXPECT(div_onfocusout);
92 DEFINE_EXPECT(form_onsubmit);
93 DEFINE_EXPECT(form_onclick);
94 DEFINE_EXPECT(submit_onclick);
95 DEFINE_EXPECT(submit_onclick_cancel);
96 DEFINE_EXPECT(submit_onclick_attached);
97 DEFINE_EXPECT(submit_onclick_attached_check_cancel);
98 DEFINE_EXPECT(submit_onclick_setret);
99 DEFINE_EXPECT(elem2_cp_onclick);
100 DEFINE_EXPECT(iframe_onload);
101 DEFINE_EXPECT(visibilitychange);
102 DEFINE_EXPECT(onbeforeunload);
103 DEFINE_EXPECT(iframe_onbeforeunload);
104 DEFINE_EXPECT(onunload);
105 DEFINE_EXPECT(pagehide);
106 DEFINE_EXPECT(iframe_onunload);
107 DEFINE_EXPECT(iframe_pagehide);
108 DEFINE_EXPECT(doc1_onstorage);
109 DEFINE_EXPECT(doc1_onstoragecommit);
110 DEFINE_EXPECT(window1_onstorage);
111 DEFINE_EXPECT(doc2_onstorage);
112 DEFINE_EXPECT(doc2_onstoragecommit);
113 DEFINE_EXPECT(window2_onstorage);
114 DEFINE_EXPECT(async_xhr_done);
115 DEFINE_EXPECT(sync_xhr_done);
117 static HWND container_hwnd = NULL;
118 static IHTMLWindow2 *window;
119 static IOleDocumentView *view;
120 static BOOL is_ie9plus;
121 static int document_mode;
122 static unsigned in_fire_event;
124 typedef struct {
125 LONG x;
126 LONG y;
127 LONG offset_x;
128 LONG offset_y;
129 } xy_test_t;
131 static const xy_test_t no_xy = {-10,-10,-10,-10};
133 static const char empty_doc_str[] =
134 "<html></html>";
136 static const char empty_doc_ie9_str[] =
137 "<html>"
138 "<head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
139 "</html>";
141 static const char readystate_doc_str[] =
142 "<html><body><iframe id=\"iframe\"></iframe></body></html>";
144 static const char readystate_doc_ie9_str[] =
145 "<html>"
146 "<head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
147 "<body><iframe id=\"iframe\"></iframe></body></html>";
149 static const char img_doc_str[] =
150 "<html><head><meta http-equiv=\"x-ua-compatible\" content=\"IE=8\" /></head>"
151 "<body><img id=\"imgid\"></img></body></html>";
153 static const char img_doc_ie9_str[] =
154 "<html><head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
155 "<body><img id=\"imgid\"></img></body></html>";
157 static const char input_image_doc_str[] =
158 "<html><head><meta http-equiv=\"x-ua-compatible\" content=\"IE=8\" /></head>"
159 "<body><input type=\"image\" id=\"inputid\"></input></body></html>";
161 static const char input_image_doc_ie9_str[] =
162 "<html><head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
163 "<body><input type=\"image\" id=\"inputid\"></input></body></html>";
165 static const char link_doc_str[] =
166 "<html><body><link id=\"linkid\" rel=\"stylesheet\" type=\"text/css\"></link></body></html>";
168 static const char input_doc_str[] =
169 "<html><body><div id=\"divid\"><input id=\"inputid\"></input></div></body></html>";
171 static const char iframe_doc_str[] =
172 "<html><body><iframe id=\"ifr\">Testing</iframe></body></html>";
174 static void navigate(IHTMLDocument2*,const WCHAR*);
176 static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
178 IUnknown *unk1, *unk2;
180 if(iface1 == iface2)
181 return TRUE;
183 IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
184 IUnknown_Release(unk1);
185 IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
186 IUnknown_Release(unk2);
188 return unk1 == unk2;
191 #define test_disp(u,id) _test_disp(__LINE__,u,id)
192 static void _test_disp(unsigned line, IUnknown *unk, const IID *diid)
194 IDispatchEx *dispex;
195 ITypeInfo *typeinfo;
196 UINT ticnt;
197 HRESULT hres;
199 hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
200 ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatch: %08lx\n", hres);
201 if(FAILED(hres))
202 return;
204 ticnt = 0xdeadbeef;
205 hres = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
206 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfoCount failed: %08lx\n", hres);
207 ok_(__FILE__,line) (ticnt == 1, "ticnt=%u\n", ticnt);
209 hres = IDispatchEx_GetTypeInfo(dispex, 0, 0, &typeinfo);
210 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfo failed: %08lx\n", hres);
212 if(SUCCEEDED(hres)) {
213 TYPEATTR *type_attr;
215 hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
216 ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08lx\n", hres);
217 if(diid)
218 ok_(__FILE__,line) (IsEqualGUID(&type_attr->guid, diid), "unexpected guid %s\n",
219 wine_dbgstr_guid(&type_attr->guid));
221 ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
222 ITypeInfo_Release(typeinfo);
225 IDispatchEx_Release(dispex);
228 #define get_doc3_iface(u) _get_doc3_iface(__LINE__,u)
229 static IHTMLDocument3 *_get_doc3_iface(unsigned line, IUnknown *unk)
231 IHTMLDocument3 *doc3;
232 HRESULT hres;
234 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument3, (void**)&doc3);
235 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3 iface: %08lx\n", hres);
237 return doc3;
240 #define get_elem_iface(u) _get_elem_iface(__LINE__,u)
241 static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk)
243 IHTMLElement *elem;
244 HRESULT hres;
246 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement, (void**)&elem);
247 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement iface: %08lx\n", hres);
249 return elem;
252 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
253 static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk)
255 IHTMLElement2 *elem2;
256 HRESULT hres;
258 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement2, (void**)&elem2);
259 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2 iface: %08lx\n", hres);
261 return elem2;
264 #define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
265 static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk)
267 IHTMLElement3 *elem3;
268 HRESULT hres;
270 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement3, (void**)&elem3);
271 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement3 iface: %08lx\n", hres);
273 return elem3;
276 #define get_elem4_iface(u) _get_elem4_iface(__LINE__,u)
277 static IHTMLElement4 *_get_elem4_iface(unsigned line, IUnknown *unk)
279 IHTMLElement4 *elem4;
280 HRESULT hres;
282 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement4, (void**)&elem4);
283 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement4 iface: %08lx\n", hres);
285 return elem4;
288 #define get_iframe_iface(u) _get_iframe_iface(__LINE__,u)
289 static IHTMLIFrameElement *_get_iframe_iface(unsigned line, IUnknown *unk)
291 IHTMLIFrameElement *iframe;
292 HRESULT hres;
294 hres = IUnknown_QueryInterface(unk, &IID_IHTMLIFrameElement, (void**)&iframe);
295 ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLIFrameElement) failed: %08lx\n", hres);
297 return iframe;
300 #define doc_get_body(d) _doc_get_body(__LINE__,d)
301 static IHTMLElement *_doc_get_body(unsigned line, IHTMLDocument2 *doc)
303 IHTMLElement *body = NULL;
304 HRESULT hres;
306 hres = IHTMLDocument2_get_body(doc, &body);
307 ok_(__FILE__,line) (hres == S_OK, "get_body failed: %08lx\n", hres);
308 ok_(__FILE__,line) (body != NULL, "body == NULL\n");
310 return body;
313 #define get_elem_id(d,i) _get_elem_id(__LINE__,d,i)
314 static IHTMLElement *_get_elem_id(unsigned line, IHTMLDocument2 *doc, const WCHAR *id)
316 IHTMLDocument3 *doc3 = _get_doc3_iface(line, (IUnknown*)doc);
317 IHTMLElement *elem;
318 BSTR str;
319 HRESULT hres;
321 str = SysAllocString(id);
322 hres = IHTMLDocument3_getElementById(doc3, str, &elem);
323 SysFreeString(str);
324 IHTMLDocument3_Release(doc3);
325 ok_(__FILE__,line) (hres == S_OK, "getElementById failed: %08lx\n", hres);
326 ok_(__FILE__,line) (elem != NULL, "elem == NULL\n");
328 return elem;
331 #define test_elem_tag(u,n) _test_elem_tag(__LINE__,u,n)
332 static void _test_elem_tag(unsigned line, IUnknown *unk, const WCHAR *extag)
334 IHTMLElement *elem = _get_elem_iface(line, unk);
335 BSTR tag;
336 HRESULT hres;
338 hres = IHTMLElement_get_tagName(elem, &tag);
339 IHTMLElement_Release(elem);
340 ok_(__FILE__, line) (hres == S_OK, "get_tagName failed: %08lx\n", hres);
341 ok_(__FILE__, line) (!lstrcmpW(tag, extag), "got tag: %s, expected %s\n", wine_dbgstr_w(tag), wine_dbgstr_w(extag));
343 SysFreeString(tag);
346 #define get_event_obj() _get_event_obj(__LINE__)
347 static IHTMLEventObj *_get_event_obj(unsigned line)
349 IHTMLEventObj *event = NULL;
350 HRESULT hres;
352 hres = IHTMLWindow2_get_event(window, &event);
353 ok_(__FILE__,line) (hres == S_OK, "get_event failed: %08lx\n", hres);
354 ok_(__FILE__,line) (event != NULL, "event = NULL\n");
356 /* Native IE uses an undocumented DIID in IE9+ mode */
357 _test_disp(line, (IUnknown*)event, document_mode < 9 ? &DIID_DispCEventObj : NULL);
359 return event;
362 #define set_elem_innerhtml(e,t) _set_elem_innerhtml(__LINE__,e,t)
363 static void _set_elem_innerhtml(unsigned line, IHTMLElement *elem, const WCHAR *inner_html)
365 BSTR html;
366 HRESULT hres;
368 html = SysAllocString(inner_html);
369 hres = IHTMLElement_put_innerHTML(elem, html);
370 ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08lx\n", hres);
371 SysFreeString(html);
374 #define elem_fire_event(a,b,c) _elem_fire_event(__LINE__,a,b,c)
375 static void _elem_fire_event(unsigned line, IUnknown *unk, const WCHAR *event, VARIANT *evobj)
377 IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
378 VARIANT_BOOL b;
379 BSTR str;
380 HRESULT hres;
382 b = 100;
383 str = SysAllocString(event);
384 in_fire_event++;
385 hres = IHTMLElement3_fireEvent(elem3, str, evobj, &b);
386 IHTMLElement3_Release(elem3);
387 in_fire_event--;
388 SysFreeString(str);
389 ok_(__FILE__,line)(hres == S_OK, "fireEvent failed: %08lx\n", hres);
390 ok_(__FILE__,line)(b == VARIANT_TRUE, "fireEvent returned %x\n", b);
393 #define test_event_args(a,b,c,d,e,f,g) _test_event_args(__LINE__,a,b,c,d,e,f,g)
394 static void _test_event_args(unsigned line, const IID *dispiid, DISPID id, WORD wFlags, DISPPARAMS *pdp,
395 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
397 ok_(__FILE__,line) (id == DISPID_VALUE, "id = %ld\n", id);
398 ok_(__FILE__,line) (wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
399 ok_(__FILE__,line) (pdp != NULL, "pdp == NULL\n");
400 ok_(__FILE__,line) (pdp->cArgs == (document_mode < 9 ? 1 : 2), "pdp->cArgs = %d\n", pdp->cArgs);
401 ok_(__FILE__,line) (pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
402 ok_(__FILE__,line) (pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %ld\n",
403 pdp->rgdispidNamedArgs[0]);
404 ok_(__FILE__,line) (V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg));
405 if(pdp->cArgs > 1)
406 ok_(__FILE__,line) (V_VT(pdp->rgvarg+1) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg+1));
407 ok_(__FILE__,line) (pvarRes != NULL, "pvarRes == NULL\n");
408 ok_(__FILE__,line) (pei != NULL, "pei == NULL\n");
409 ok_(__FILE__,line) (!pspCaller, "pspCaller != NULL\n");
411 if(dispiid)
412 _test_disp(line, (IUnknown*)V_DISPATCH(pdp->rgvarg), dispiid);
414 if(pdp->cArgs > 1) {
415 IHTMLEventObj *window_event, *event_obj;
416 IDOMEvent *event;
417 HRESULT hres;
419 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg+1), &IID_IDOMEvent, (void**)&event);
420 if(in_fire_event)
421 ok(hres == E_NOINTERFACE, "QI(IID_IDOMEvent) returned %08lx\n", hres);
422 else
423 ok(hres == S_OK, "Could not get IDOMEvent iface: %08lx\n", hres);
425 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg+1), &IID_IHTMLEventObj, (void**)&event_obj);
426 if(in_fire_event)
427 ok(hres == S_OK, "Could not get IDOMEventObj iface: %08lx\n", hres);
428 else
429 ok(hres == E_NOINTERFACE, "QI(IID_IHTMLEventObj) returned %08lx\n", hres);
431 if(event)
432 IDOMEvent_Release(event);
433 if(event_obj)
434 IHTMLEventObj_Release(event_obj);
436 hres = IHTMLWindow2_get_event(window, &window_event);
437 ok(hres == S_OK, "get_event failed: %08lx\n", hres);
438 if(window_event) {
439 todo_wine_if(in_fire_event)
440 ok(!iface_cmp((IUnknown*)V_DISPATCH(pdp->rgvarg+1), (IUnknown*)window_event),
441 "window_event != event arg\n");
442 IHTMLEventObj_Release(window_event);
447 #define test_attached_event_args(a,b,c,d,e) _test_attached_event_args(__LINE__,a,b,c,d,e)
448 static void _test_attached_event_args(unsigned line, DISPID id, WORD wFlags, DISPPARAMS *pdp,
449 VARIANT *pvarRes, EXCEPINFO *pei)
451 IHTMLEventObj *event;
453 ok(id == DISPID_VALUE, "id = %ld\n", id);
454 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
455 ok(pdp != NULL, "pDispParams == NULL\n");
456 ok(pdp->cArgs == 1, "pdp->cArgs = %d\n", pdp->cArgs);
457 ok(!pdp->cNamedArgs, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
458 ok(!pdp->rgdispidNamedArgs, "pdp->rgdispidNamedArgs = %p\n", pdp->rgdispidNamedArgs);
459 ok(pdp->rgvarg != NULL, "rgvarg = NULL\n");
460 ok(pvarRes != NULL, "pvarRes = NULL\n");
461 ok(pei != NULL, "pei = NULL\n");
462 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pVarRes) = %d\n", V_VT(pvarRes));
463 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
464 ok(V_DISPATCH(pdp->rgvarg) != NULL, "V_DISPATCH(pdp->rgvarg) = %p\n", V_DISPATCH(pdp->rgvarg));
466 event = _get_event_obj(line);
467 todo_wine
468 ok(!iface_cmp((IUnknown*)event, (IUnknown*)V_DISPATCH(pdp->rgvarg)), "event != arg0\n");
469 IHTMLEventObj_Release(event);
472 #define get_event_src() _get_event_src(__LINE__)
473 static IHTMLElement *_get_event_src(unsigned line)
475 IHTMLEventObj *event = _get_event_obj(line);
476 IHTMLElement *src_elem = NULL;
477 HRESULT hres;
479 hres = IHTMLEventObj_get_srcElement(event, &src_elem);
480 IHTMLEventObj_Release(event);
481 ok_(__FILE__,line) (hres == S_OK, "get_srcElement failed: %08lx\n", hres);
483 return src_elem;
486 #define test_event_src(t) _test_event_src(__LINE__,t)
487 static void _test_event_src(unsigned line, const WCHAR *src_tag)
489 IHTMLElement *src_elem = _get_event_src(line);
491 if(src_tag) {
492 ok_(__FILE__,line) (src_elem != NULL, "src_elem = NULL\n");
493 _test_elem_tag(line, (IUnknown*)src_elem, src_tag);
494 IHTMLElement_Release(src_elem);
495 }else {
496 ok_(__FILE__,line) (!src_elem, "src_elem != NULL\n");
500 static void _test_event_altkey(unsigned line, IHTMLEventObj *event, VARIANT_BOOL exval)
502 VARIANT_BOOL b;
503 HRESULT hres;
505 hres = IHTMLEventObj_get_altKey(event, &b);
506 ok_(__FILE__,line)(hres == S_OK, "get_altKey failed: %08lx\n", hres);
507 ok_(__FILE__,line)(b == exval, "altKey = %x, expected %x\n", b, exval);
510 static void _test_event_ctrlkey(unsigned line, IHTMLEventObj *event, VARIANT_BOOL exval)
512 VARIANT_BOOL b;
513 HRESULT hres;
515 hres = IHTMLEventObj_get_ctrlKey(event, &b);
516 ok_(__FILE__,line)(hres == S_OK, "get_ctrlKey failed: %08lx\n", hres);
517 ok_(__FILE__,line)(b == exval, "ctrlKey = %x, expected %x\n", b, exval);
520 static void _test_event_shiftkey(unsigned line, IHTMLEventObj *event, VARIANT_BOOL exval)
522 VARIANT_BOOL b;
523 HRESULT hres;
525 hres = IHTMLEventObj_get_shiftKey(event, &b);
526 ok_(__FILE__,line)(hres == S_OK, "get_shiftKey failed: %08lx\n", hres);
527 ok_(__FILE__,line)(b == exval, "shiftKey = %x, expected %x\n", b, exval);
530 #define test_event_cancelbubble(a,b) _test_event_cancelbubble(__LINE__,a,b)
531 static void _test_event_cancelbubble(unsigned line, IHTMLEventObj *event, VARIANT_BOOL exval)
533 VARIANT_BOOL b;
534 HRESULT hres;
536 hres = IHTMLEventObj_get_cancelBubble(event, &b);
537 ok_(__FILE__,line)(hres == S_OK, "get_cancelBubble failed: %08lx\n", hres);
538 ok_(__FILE__,line)(b == exval, "cancelBubble = %x, expected %x\n", b, exval);
541 static void _test_event_fromelem(unsigned line, IHTMLEventObj *event, const WCHAR *from_tag)
543 IHTMLElement *elem;
544 HRESULT hres;
546 hres = IHTMLEventObj_get_fromElement(event, &elem);
547 ok_(__FILE__,line)(hres == S_OK, "get_fromElement failed: %08lx\n", hres);
548 if(from_tag)
549 _test_elem_tag(line, (IUnknown*)elem, from_tag);
550 else
551 ok_(__FILE__,line)(elem == NULL, "fromElement != NULL\n");
552 if(elem)
553 IHTMLElement_Release(elem);
556 static void _test_event_toelem(unsigned line, IHTMLEventObj *event, const WCHAR *to_tag)
558 IHTMLElement *elem;
559 HRESULT hres;
561 hres = IHTMLEventObj_get_toElement(event, &elem);
562 ok_(__FILE__,line)(hres == S_OK, "get_toElement failed: %08lx\n", hres);
563 if(to_tag)
564 _test_elem_tag(line, (IUnknown*)elem, to_tag);
565 else
566 ok_(__FILE__,line)(elem == NULL, "toElement != NULL\n");
567 if(elem)
568 IHTMLElement_Release(elem);
571 static void _test_event_keycode(unsigned line, IHTMLEventObj *event, LONG exl)
573 LONG l;
574 HRESULT hres;
576 hres = IHTMLEventObj_get_keyCode(event, &l);
577 ok_(__FILE__,line)(hres == S_OK, "get_keyCode failed: %08lx\n", hres);
578 ok_(__FILE__,line)(l == exl, "keyCode = %lx, expected %lx\n", l, exl);
581 static void _test_event_button(unsigned line, IHTMLEventObj *event, LONG exl)
583 LONG l;
584 HRESULT hres;
586 hres = IHTMLEventObj_get_button(event, &l);
587 ok_(__FILE__,line)(hres == S_OK, "get_button failed: %08lx\n", hres);
588 ok_(__FILE__,line)(l == exl, "button = %lx, expected %lx\n", l, exl);
591 static void _test_event_reason(unsigned line, IHTMLEventObj *event, LONG exl)
593 LONG l;
594 HRESULT hres;
596 hres = IHTMLEventObj_get_reason(event, &l);
597 ok_(__FILE__,line)(hres == S_OK, "get_reason failed: %08lx\n", hres);
598 ok_(__FILE__,line)(l == exl, "reason = %lx, expected %lx\n", l, exl);
601 static void _test_event_x(unsigned line, IHTMLEventObj *event, LONG exl)
603 LONG l;
604 HRESULT hres;
606 hres = IHTMLEventObj_get_x(event, &l);
607 ok_(__FILE__,line)(hres == S_OK, "get_x failed: %08lx\n", hres);
608 if(exl != -10) /* don't test the exact value */
609 ok_(__FILE__,line)(l == exl, "x = %ld, expected %ld\n", l, exl);
612 static void _test_event_y(unsigned line, IHTMLEventObj *event, LONG exl)
614 LONG l;
615 HRESULT hres;
617 hres = IHTMLEventObj_get_y(event, &l);
618 ok_(__FILE__,line)(hres == S_OK, "get_y failed: %08lx\n", hres);
619 if(exl != -10) /* don't test the exact value */
620 ok_(__FILE__,line)(l == exl, "y = %ld, expected %ld\n", l, exl);
623 static void _test_event_clientx(unsigned line, IHTMLEventObj *event, LONG exl)
625 LONG l;
626 HRESULT hres;
628 hres = IHTMLEventObj_get_clientX(event, &l);
629 ok_(__FILE__,line)(hres == S_OK, "get_clientX failed: %08lx\n", hres);
630 if(exl != -10) /* don't test the exact value */
631 ok_(__FILE__,line)(l == exl, "clientX = %ld, expected %ld\n", l, exl);
634 static void _test_event_clienty(unsigned line, IHTMLEventObj *event, LONG exl)
636 LONG l;
637 HRESULT hres;
639 hres = IHTMLEventObj_get_clientY(event, &l);
640 ok_(__FILE__,line)(hres == S_OK, "get_clientY failed: %08lx\n", hres);
641 if(exl != -10) /* don't test the exact value */
642 ok_(__FILE__,line)(l == exl, "clientY = %ld, expected %ld\n", l, exl);
645 static void _test_event_offsetx(unsigned line, IHTMLEventObj *event, LONG exl)
647 LONG l;
648 HRESULT hres;
650 hres = IHTMLEventObj_get_offsetX(event, &l);
651 ok_(__FILE__,line)(hres == S_OK, "get_offsetX failed: %08lx\n", hres);
652 if(exl != -10) /* don't test the exact value */
653 ok_(__FILE__,line)(l == exl, "offsetX = %ld, expected %ld\n", l, exl);
656 static void _test_event_offsety(unsigned line, IHTMLEventObj *event, LONG exl)
658 LONG l;
659 HRESULT hres;
661 hres = IHTMLEventObj_get_offsetY(event, &l);
662 ok_(__FILE__,line)(hres == S_OK, "get_offsetY failed: %08lx\n", hres);
663 if(exl != -10) /* don't test the exact value */
664 ok_(__FILE__,line)(l == exl, "offsetY = %ld, expected %ld\n", l, exl);
667 static void _test_event_screenx(unsigned line, IHTMLEventObj *event, LONG exl)
669 LONG l;
670 HRESULT hres;
672 hres = IHTMLEventObj_get_screenX(event, &l);
673 ok_(__FILE__,line)(hres == S_OK, "get_screenX failed: %08lx\n", hres);
674 if(exl != -10) /* don't test the exact value */
675 ok_(__FILE__,line)(l == exl, "screenX = %ld, expected %ld\n", l, exl);
678 static void _test_event_screeny(unsigned line, IHTMLEventObj *event, LONG exl)
680 LONG l;
681 HRESULT hres;
683 hres = IHTMLEventObj_get_screenY(event, &l);
684 ok_(__FILE__,line)(hres == S_OK, "get_screenY failed: %08lx\n", hres);
685 if(exl != -10) /* don't test the exact value for -10 */
686 ok_(__FILE__,line)(l == exl, "screenY = %ld, expected %ld\n", l, exl);
689 static void _test_event_type(unsigned line, IHTMLEventObj *event, const WCHAR *exstr)
691 BSTR str;
692 HRESULT hres;
694 hres = IHTMLEventObj_get_type(event, &str);
695 ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08lx\n", hres);
696 ok_(__FILE__,line)(!lstrcmpW(str, exstr), "type = %s, expected %s\n", wine_dbgstr_w(str), wine_dbgstr_w(exstr));
699 static void _test_event_qualifier(unsigned line, IHTMLEventObj *event, const WCHAR *exstr)
701 BSTR str;
702 HRESULT hres;
704 hres = IHTMLEventObj_get_qualifier(event, &str);
705 ok_(__FILE__,line)(hres == S_OK, "get_qualifier failed: %08lx\n", hres);
706 if(exstr)
707 ok_(__FILE__,line)(!lstrcmpW(str, exstr), "qualifier = %s, expected %s\n", wine_dbgstr_w(str),
708 wine_dbgstr_w(exstr));
709 else
710 ok_(__FILE__,line)(!str, "qualifier != NULL\n");
713 static void _test_event_srcfilter(unsigned line, IHTMLEventObj *event)
715 IDispatch *disp;
716 HRESULT hres;
718 hres = IHTMLEventObj_get_srcFilter(event, &disp);
719 ok_(__FILE__,line)(hres == S_OK, "get_srcFilter failed: %08lx\n", hres);
720 ok_(__FILE__,line)(!disp, "srcFilter != NULL\n");
723 #define test_event_obj(t,x) _test_event_obj(__LINE__,t,x)
724 static void _test_event_obj(unsigned line, const WCHAR *type, const xy_test_t *xy)
726 IHTMLEventObj *event = _get_event_obj(line);
727 IDOMEvent *dom_event;
728 VARIANT v;
729 HRESULT hres;
731 _test_event_altkey(line, event, VARIANT_FALSE);
732 _test_event_ctrlkey(line, event, VARIANT_FALSE);
733 _test_event_shiftkey(line, event, VARIANT_FALSE);
734 _test_event_cancelbubble(line, event, VARIANT_FALSE);
735 _test_event_fromelem(line, event, NULL);
736 _test_event_toelem(line, event, NULL);
737 _test_event_keycode(line, event, 0);
738 _test_event_button(line, event, 0);
739 _test_event_type(line, event, type);
740 _test_event_qualifier(line, event, NULL);
741 _test_event_reason(line, event, 0);
742 _test_event_srcfilter(line, event);
743 _test_event_x(line, event, xy->x);
744 _test_event_y(line, event, xy->y);
745 _test_event_clientx(line, event, -10);
746 _test_event_clienty(line, event, -10);
747 _test_event_offsetx(line, event, xy->offset_x);
748 _test_event_offsety(line, event, xy->offset_y);
749 _test_event_screenx(line, event, -10);
750 _test_event_screeny(line, event, -10);
752 V_VT(&v) = VT_NULL;
753 hres = IHTMLEventObj_get_returnValue(event, &v);
754 ok_(__FILE__,line)(hres == S_OK, "get_returnValue failed: %08lx\n", hres);
755 /* Depending on source of event, returnValue may be true bool in IE9+ mode */
756 ok_(__FILE__,line)(V_VT(&v) == VT_EMPTY || (document_mode >= 9 && V_VT(&v) == VT_BOOL),
757 "V_VT(returnValue) = %d\n", V_VT(&v));
758 if(V_VT(&v) == VT_BOOL)
759 ok_(__FILE__,line)(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(returnValue) = %x\n", V_BOOL(&v));
761 hres = IHTMLEventObj_QueryInterface(event, &IID_IDOMEvent, (void**)&dom_event);
762 ok(hres == E_NOINTERFACE, "Could not get IDOMEvent iface: %08lx\n", hres);
764 IHTMLEventObj_Release(event);
767 #define elem_attach_event(a,b,c) _elem_attach_event(__LINE__,a,b,c)
768 static void _elem_attach_event(unsigned line, IUnknown *unk, const WCHAR *namew, IDispatch *disp)
770 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
771 VARIANT_BOOL res;
772 BSTR name;
773 HRESULT hres;
775 name = SysAllocString(namew);
776 hres = IHTMLElement2_attachEvent(elem, name, disp, &res);
777 IHTMLElement2_Release(elem);
778 SysFreeString(name);
779 ok_(__FILE__,line)(hres == S_OK, "attachEvent failed: %08lx\n", hres);
780 ok_(__FILE__,line)(res == VARIANT_TRUE, "attachEvent returned %x\n", res);
783 #define add_event_listener(a,b,c,d) _add_event_listener(__LINE__,a,b,c,d)
784 static void _add_event_listener(unsigned line, IUnknown *unk, const WCHAR *type, IDispatch *listener, VARIANT_BOOL use_capture)
786 IEventTarget *event_target;
787 BSTR str;
788 HRESULT hres;
790 hres = IUnknown_QueryInterface(unk, &IID_IEventTarget, (void**)&event_target);
791 ok_(__FILE__,line)(hres == S_OK, "Could not get IEventTarget iface: %08lx\n", hres);
793 str = SysAllocString(type);
794 hres = IEventTarget_addEventListener(event_target, str, listener, use_capture);
795 SysFreeString(str);
796 ok_(__FILE__,line)(hres == S_OK, "addEventListener failed: %08lx\n", hres);
798 IEventTarget_Release(event_target);
801 #define remove_event_listener(a,b,c,d) _remove_event_listener(__LINE__,a,b,c,d)
802 static void _remove_event_listener(unsigned line, IUnknown *unk, const WCHAR *type, IDispatch *listener, VARIANT_BOOL use_capture)
804 IEventTarget *event_target;
805 BSTR str;
806 HRESULT hres;
808 hres = IUnknown_QueryInterface(unk, &IID_IEventTarget, (void**)&event_target);
809 ok_(__FILE__,line)(hres == S_OK, "Could not get IEventTarget iface: %08lx\n", hres);
811 str = SysAllocString(type);
812 hres = IEventTarget_removeEventListener(event_target, str, listener, use_capture);
813 SysFreeString(str);
814 ok_(__FILE__,line)(hres == S_OK, "removeEventListener failed: %08lx\n", hres);
816 IEventTarget_Release(event_target);
819 #define elem_detach_event(a,b,c) _elem_detach_event(__LINE__,a,b,c)
820 static void _elem_detach_event(unsigned line, IUnknown *unk, const WCHAR *namew, IDispatch *disp)
822 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
823 BSTR name;
824 HRESULT hres;
826 name = SysAllocString(namew);
827 hres = IHTMLElement2_detachEvent(elem, name, disp);
828 IHTMLElement2_Release(elem);
829 SysFreeString(name);
830 ok_(__FILE__,line)(hres == S_OK, "detachEvent failed: %08lx\n", hres);
833 #define doc_attach_event(a,b,c) _doc_attach_event(__LINE__,a,b,c)
834 static void _doc_attach_event(unsigned line, IHTMLDocument2 *doc, const WCHAR *namew, IDispatch *disp)
836 IHTMLDocument3 *doc3 = _get_doc3_iface(line, (IUnknown*)doc);
837 VARIANT_BOOL res;
838 BSTR name;
839 HRESULT hres;
841 name = SysAllocString(namew);
842 hres = IHTMLDocument3_attachEvent(doc3, name, disp, &res);
843 IHTMLDocument3_Release(doc3);
844 SysFreeString(name);
845 ok_(__FILE__,line)(hres == S_OK, "attachEvent failed: %08lx\n", hres);
846 ok_(__FILE__,line)(res == VARIANT_TRUE, "attachEvent returned %x\n", res);
849 #define doc_detach_event(a,b,c) _doc_detach_event(__LINE__,a,b,c)
850 static void _doc_detach_event(unsigned line, IHTMLDocument2 *doc, const WCHAR *namew, IDispatch *disp)
852 IHTMLDocument3 *doc3 = _get_doc3_iface(line, (IUnknown*)doc);
853 BSTR name;
854 HRESULT hres;
856 name = SysAllocString(namew);
857 hres = IHTMLDocument3_detachEvent(doc3, name, disp);
858 IHTMLDocument3_Release(doc3);
859 SysFreeString(name);
860 ok_(__FILE__,line)(hres == S_OK, "detachEvent failed: %08lx\n", hres);
863 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
865 if(IsEqualGUID(riid, &IID_IUnknown)
866 || IsEqualGUID(riid, &IID_IDispatch)
867 || IsEqualGUID(riid, &IID_IDispatchEx))
868 *ppv = iface;
869 else {
870 *ppv = NULL;
871 return E_NOINTERFACE;
874 return S_OK;
877 static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
879 if(IsEqualGUID(riid, &IID_IUnknown)
880 || IsEqualGUID(riid, &IID_IDispatch)) {
881 *ppv = iface;
882 }else {
883 *ppv = NULL;
884 return E_NOINTERFACE;
887 return S_OK;
890 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
892 return 2;
895 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
897 return 1;
900 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
902 ok(0, "unexpected call\n");
903 return E_NOTIMPL;
906 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
907 LCID lcid, ITypeInfo **ppTInfo)
909 ok(0, "unexpected call\n");
910 return E_NOTIMPL;
913 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
914 LPOLESTR *rgszNames, UINT cNames,
915 LCID lcid, DISPID *rgDispId)
917 ok(0, "unexpected call\n");
918 return E_NOTIMPL;
921 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
922 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
923 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
925 ok(0, "unexpected call\n");
926 return E_NOTIMPL;
929 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
931 ok(0, "unexpected call\n");
932 return E_NOTIMPL;
935 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
936 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
938 ok(0, "unexpected call\n");
939 return E_NOTIMPL;
942 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
944 ok(0, "unexpected call %s %lx\n", wine_dbgstr_w(bstrName), grfdex);
945 return E_NOTIMPL;
948 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
950 ok(0, "unexpected call\n");
951 return E_NOTIMPL;
954 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
956 ok(0, "unexpected call\n");
957 return E_NOTIMPL;
960 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
962 ok(0, "unexpected call\n");
963 return E_NOTIMPL;
966 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
968 ok(0, "unexpected call\n");
969 return E_NOTIMPL;
972 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
974 ok(0, "unexpected call\n");
975 return E_NOTIMPL;
978 #define EVENT_HANDLER_FUNC_OBJ(event) \
979 static IDispatchExVtbl event ## FuncVtbl = { \
980 DispatchEx_QueryInterface, \
981 DispatchEx_AddRef, \
982 DispatchEx_Release, \
983 DispatchEx_GetTypeInfoCount, \
984 DispatchEx_GetTypeInfo, \
985 DispatchEx_GetIDsOfNames, \
986 DispatchEx_Invoke, \
987 DispatchEx_GetDispID, \
988 event, \
989 DispatchEx_DeleteMemberByName, \
990 DispatchEx_DeleteMemberByDispID, \
991 DispatchEx_GetMemberProperties, \
992 DispatchEx_GetMemberName, \
993 DispatchEx_GetNextDispID, \
994 DispatchEx_GetNameSpaceParent \
995 }; \
996 static IDispatchEx event ## _obj = { &event ## FuncVtbl };
998 static HRESULT WINAPI docobj_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
999 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1001 CHECK_EXPECT(docobj_onclick);
1002 test_event_args(document_mode < 9 ? &DIID_DispHTMLDocument : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1003 return S_OK;
1006 EVENT_HANDLER_FUNC_OBJ(docobj_onclick);
1008 static HRESULT WINAPI document_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1009 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1011 IHTMLDocument3 *doc3;
1012 CHECK_EXPECT(document_onclick);
1013 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1014 doc3 = get_doc3_iface((IUnknown*)V_DISPATCH(pdp->rgvarg));
1015 IHTMLDocument3_Release(doc3);
1016 test_event_src(L"DIV");
1017 test_event_obj(L"click", &no_xy);
1018 return S_OK;
1021 EVENT_HANDLER_FUNC_OBJ(document_onclick);
1023 static HRESULT WINAPI div_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1024 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1026 CHECK_EXPECT(div_onclick);
1027 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1028 test_event_src(L"DIV");
1029 test_event_obj(L"click", &no_xy);
1030 return S_OK;
1033 EVENT_HANDLER_FUNC_OBJ(div_onclick);
1035 static HRESULT WINAPI div_onclick_attached(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1036 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1038 CHECK_EXPECT(div_onclick_attached);
1040 test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
1041 test_event_src(L"DIV");
1042 return S_OK;
1045 EVENT_HANDLER_FUNC_OBJ(div_onclick_attached);
1047 static HRESULT WINAPI doc_onclick_attached(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1048 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1050 CHECK_EXPECT(doc_onclick_attached);
1052 test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
1053 test_event_src(L"DIV");
1054 return S_OK;
1057 EVENT_HANDLER_FUNC_OBJ(doc_onclick_attached);
1059 static HRESULT WINAPI body_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1060 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1062 CHECK_EXPECT(body_onclick);
1063 /* Native IE returns undocumented DIID in IE9+ mode */
1064 test_event_args(document_mode < 9 ? &DIID_DispHTMLBody : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1065 test_event_src(L"DIV");
1066 return S_OK;
1069 EVENT_HANDLER_FUNC_OBJ(body_onclick);
1071 static HRESULT WINAPI div_onclick_capture(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1072 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1074 CHECK_EXPECT(div_onclick_capture);
1076 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1077 test_event_src(L"DIV");
1078 return S_OK;
1081 EVENT_HANDLER_FUNC_OBJ(div_onclick_capture);
1083 static HRESULT WINAPI div_onclick_bubble(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1084 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1086 CHECK_EXPECT(div_onclick_bubble);
1088 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1089 test_event_src(L"DIV");
1090 return S_OK;
1093 EVENT_HANDLER_FUNC_OBJ(div_onclick_bubble);
1095 static HRESULT WINAPI img_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1096 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1098 CHECK_EXPECT(img_onload);
1099 test_event_args(document_mode < 9 ? &DIID_DispHTMLImg : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1100 test_event_src(L"IMG");
1101 return S_OK;
1104 EVENT_HANDLER_FUNC_OBJ(img_onload);
1106 static HRESULT WINAPI input_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1107 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1109 CHECK_EXPECT(input_onload);
1110 test_event_args(document_mode < 9 ? &DIID_DispHTMLInputElement : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1111 test_event_src(L"INPUT");
1112 return S_OK;
1115 EVENT_HANDLER_FUNC_OBJ(input_onload);
1117 static HRESULT WINAPI link_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1118 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1120 CHECK_EXPECT(link_onload);
1121 test_event_args(&DIID_DispHTMLLinkElement, id, wFlags, pdp, pvarRes, pei, pspCaller);
1122 test_event_src(L"LINK");
1123 return S_OK;
1126 EVENT_HANDLER_FUNC_OBJ(link_onload);
1128 static HRESULT WINAPI unattached_img_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1129 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1131 IHTMLElement *event_src;
1133 CHECK_EXPECT(img_onload);
1135 test_event_args(document_mode < 9 ? &DIID_DispHTMLImg : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1136 event_src = get_event_src();
1137 todo_wine
1138 ok(!event_src, "event_src != NULL\n");
1139 if(event_src)
1140 IHTMLElement_Release(event_src);
1141 return S_OK;
1144 EVENT_HANDLER_FUNC_OBJ(unattached_img_onload);
1146 static HRESULT WINAPI img_onerror(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1147 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1149 CHECK_EXPECT(img_onerror);
1150 test_event_args(document_mode < 9 ? &DIID_DispHTMLImg : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1151 test_event_src(L"IMG");
1152 return S_OK;
1155 EVENT_HANDLER_FUNC_OBJ(img_onerror);
1157 static HRESULT WINAPI input_onfocus(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1158 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1160 CHECK_EXPECT(input_onfocus);
1161 test_event_args(&DIID_DispHTMLInputElement, id, wFlags, pdp, pvarRes, pei, pspCaller);
1162 test_event_src(L"INPUT");
1163 return S_OK;
1166 EVENT_HANDLER_FUNC_OBJ(input_onfocus);
1168 static HRESULT WINAPI div_onfocusin(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1169 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1171 CHECK_EXPECT(div_onfocusin);
1172 test_event_args(NULL /* FIXME: &DIID_DispHTMLDivElement */, id, wFlags, pdp, pvarRes, pei, pspCaller);
1173 test_event_src(L"INPUT");
1174 return S_OK;
1177 EVENT_HANDLER_FUNC_OBJ(div_onfocusin);
1179 static HRESULT WINAPI div_onfocusout(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1180 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1182 CHECK_EXPECT(div_onfocusout);
1183 test_event_args(NULL /* FIXME: &DIID_DispHTMLDivElement */, id, wFlags, pdp, pvarRes, pei, pspCaller);
1184 test_event_src(L"INPUT");
1185 return S_OK;
1188 EVENT_HANDLER_FUNC_OBJ(div_onfocusout);
1190 static HRESULT WINAPI input_onblur(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1191 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1193 CHECK_EXPECT(input_onblur);
1194 test_event_args(&DIID_DispHTMLInputElement, id, wFlags, pdp, pvarRes, pei, pspCaller);
1195 test_event_src(L"INPUT");
1196 return S_OK;
1199 EVENT_HANDLER_FUNC_OBJ(input_onblur);
1201 static HRESULT WINAPI form_onsubmit(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1202 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1204 CHECK_EXPECT(form_onsubmit);
1205 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1206 test_event_src(L"FORM");
1208 V_VT(pvarRes) = VT_BOOL;
1209 V_BOOL(pvarRes) = VARIANT_FALSE;
1210 return S_OK;
1213 EVENT_HANDLER_FUNC_OBJ(form_onsubmit);
1215 static HRESULT WINAPI form_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1216 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1218 CHECK_EXPECT(form_onclick);
1219 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1221 return S_OK;
1224 EVENT_HANDLER_FUNC_OBJ(form_onclick);
1226 static HRESULT WINAPI submit_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1227 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1229 CHECK_EXPECT(submit_onclick);
1230 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1231 test_event_src(L"INPUT");
1233 V_VT(pvarRes) = VT_BOOL;
1234 V_BOOL(pvarRes) = VARIANT_FALSE;
1235 return S_OK;
1238 EVENT_HANDLER_FUNC_OBJ(submit_onclick);
1240 static HRESULT WINAPI iframe_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1241 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1243 CHECK_EXPECT(iframe_onload);
1244 test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller);
1245 test_event_src(L"IFRAME");
1246 return S_OK;
1249 EVENT_HANDLER_FUNC_OBJ(iframe_onload);
1251 static HRESULT WINAPI submit_onclick_attached(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1252 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1254 CHECK_EXPECT(submit_onclick_attached);
1255 test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
1256 test_event_src(L"INPUT");
1258 V_VT(pvarRes) = VT_BOOL;
1259 V_BOOL(pvarRes) = VARIANT_FALSE;
1260 return S_OK;
1263 EVENT_HANDLER_FUNC_OBJ(submit_onclick_attached);
1265 static HRESULT WINAPI submit_onclick_attached_check_cancel(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1266 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1268 IHTMLEventObj *event;
1269 HRESULT hres;
1271 CHECK_EXPECT(submit_onclick_attached_check_cancel);
1272 test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
1273 test_event_src(L"INPUT");
1275 event = NULL;
1276 hres = IHTMLWindow2_get_event(window, &event);
1277 ok(hres == S_OK, "get_event failed: %08lx\n", hres);
1278 ok(event != NULL, "event == NULL\n");
1280 test_event_cancelbubble(event, VARIANT_TRUE);
1281 IHTMLEventObj_Release(event);
1282 return S_OK;
1285 EVENT_HANDLER_FUNC_OBJ(submit_onclick_attached_check_cancel);
1287 static VARIANT onclick_retval, onclick_event_retval;
1289 static HRESULT WINAPI submit_onclick_setret(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1290 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1292 IHTMLEventObj *event;
1293 VARIANT v;
1294 HRESULT hres;
1296 CHECK_EXPECT(submit_onclick_setret);
1297 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1298 test_event_src(L"INPUT");
1300 event = NULL;
1301 hres = IHTMLWindow2_get_event(window, &event);
1302 ok(hres == S_OK, "get_event failed: %08lx\n", hres);
1303 ok(event != NULL, "event == NULL\n");
1305 V_VT(&v) = VT_ERROR;
1306 hres = IHTMLEventObj_get_returnValue(event, &v);
1307 ok(hres == S_OK, "get_returnValue failed: %08lx\n", hres);
1308 if(document_mode < 9) {
1309 ok(V_VT(&v) == VT_EMPTY, "V_VT(returnValue) = %d\n", V_VT(&v));
1310 }else todo_wine {
1311 ok(V_VT(&v) == VT_BOOL, "V_VT(returnValue) = %d\n", V_VT(&v));
1312 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(returnValue) = %x\n", V_BOOL(&v));
1315 hres = IHTMLEventObj_put_returnValue(event, onclick_event_retval);
1316 ok(hres == S_OK, "put_returnValue failed: %08lx\n", hres);
1318 V_VT(&v) = VT_ERROR;
1319 hres = IHTMLEventObj_get_returnValue(event, &v);
1320 ok(hres == S_OK, "get_returnValue failed: %08lx\n", hres);
1321 ok(VarCmp(&v, &onclick_event_retval, 0, 0) == VARCMP_EQ, "unexpected returnValue\n");
1323 IHTMLEventObj_Release(event);
1324 *pvarRes = onclick_retval;
1325 return S_OK;
1328 EVENT_HANDLER_FUNC_OBJ(submit_onclick_setret);
1330 static HRESULT WINAPI submit_onclick_cancel(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1331 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1333 IHTMLEventObj *event;
1334 HRESULT hres;
1336 CHECK_EXPECT(submit_onclick_cancel);
1337 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1338 test_event_src(L"INPUT");
1340 event = NULL;
1341 hres = IHTMLWindow2_get_event(window, &event);
1342 ok(hres == S_OK, "get_event failed: %08lx\n", hres);
1343 ok(event != NULL, "event == NULL\n");
1345 test_event_cancelbubble(event, VARIANT_FALSE);
1347 hres = IHTMLEventObj_put_cancelBubble(event, VARIANT_TRUE);
1348 ok(hres == S_OK, "put_returnValue failed: %08lx\n", hres);
1350 test_event_cancelbubble(event, VARIANT_TRUE);
1351 IHTMLEventObj_Release(event);
1352 return S_OK;
1355 EVENT_HANDLER_FUNC_OBJ(submit_onclick_cancel);
1357 static HRESULT WINAPI iframedoc_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1358 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1360 IHTMLEventObj *event = NULL;
1361 HRESULT hres;
1363 CHECK_EXPECT2(iframedoc_onreadystatechange);
1364 test_event_args(document_mode < 9 ? &DIID_DispHTMLDocument : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1366 event = (void*)0xdeadbeef;
1367 hres = IHTMLWindow2_get_event(window, &event);
1368 ok(hres == S_OK, "get_event failed: %08lx\n", hres);
1369 ok(!event, "event = %p\n", event);
1371 return S_OK;
1374 EVENT_HANDLER_FUNC_OBJ(iframedoc_onreadystatechange);
1376 static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1377 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1379 IHTMLWindow2 *iframe_window;
1380 IHTMLDocument2 *iframe_doc;
1381 IHTMLFrameBase2 *iframe;
1382 IHTMLElement2 *elem2;
1383 IHTMLElement *elem;
1384 VARIANT v;
1385 BSTR str, str2;
1386 HRESULT hres;
1388 test_event_args(document_mode < 9 ? &DIID_DispHTMLIFrame : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1389 test_event_src(L"IFRAME");
1391 elem = get_event_src();
1392 elem2 = get_elem2_iface((IUnknown*)elem);
1393 IHTMLElement_Release(elem);
1395 V_VT(&v) = VT_EMPTY;
1396 hres = IHTMLElement2_get_readyState(elem2, &v);
1397 ok(hres == S_OK, "get_readyState failed: %08lx\n", hres);
1398 ok(V_VT(&v) == VT_BSTR, "V_VT(readyState) = %d\n", V_VT(&v));
1400 hres = IHTMLElement2_QueryInterface(elem2, &IID_IHTMLFrameBase2, (void**)&iframe);
1401 IHTMLElement2_Release(elem2);
1402 ok(hres == S_OK, "Could not get IHTMLFrameBase2 iface: %08lx\n", hres);
1404 str = NULL;
1405 hres = IHTMLFrameBase2_get_readyState(iframe, &str);
1406 ok(hres == S_OK, "get_readyState failed: %08lx\n", hres);
1407 ok(str != NULL, "readyState == NULL\n");
1408 ok(!lstrcmpW(str, V_BSTR(&v)), "ready states differ\n");
1409 VariantClear(&v);
1411 hres = IHTMLFrameBase2_get_contentWindow(iframe, &iframe_window);
1412 ok(hres == S_OK, "get_contentDocument failed: %08lx\n", hres);
1414 hres = IHTMLWindow2_get_document(iframe_window, &iframe_doc);
1415 IHTMLWindow2_Release(iframe_window);
1416 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
1418 hres = IHTMLDocument2_get_readyState(iframe_doc, &str2);
1419 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
1420 ok(!lstrcmpW(str, str2), "unexpected document readyState %s\n", wine_dbgstr_w(str2));
1421 SysFreeString(str2);
1423 if(!lstrcmpW(str, L"loading")) {
1424 CHECK_EXPECT(iframe_onreadystatechange_loading);
1426 V_VT(&v) = VT_DISPATCH;
1427 V_DISPATCH(&v) = (IDispatch*)&iframedoc_onreadystatechange_obj;
1428 hres = IHTMLDocument2_put_onreadystatechange(iframe_doc, v);
1429 ok(hres == S_OK, "put_onreadystatechange: %08lx\n", hres);
1430 }else if(!lstrcmpW(str, L"interactive"))
1431 CHECK_EXPECT(iframe_onreadystatechange_interactive);
1432 else if(!lstrcmpW(str, L"complete"))
1433 CHECK_EXPECT(iframe_onreadystatechange_complete);
1434 else
1435 ok(0, "unexpected state %s\n", wine_dbgstr_w(str));
1437 SysFreeString(str);
1438 IHTMLDocument2_Release(iframe_doc);
1439 IHTMLFrameBase2_Release(iframe);
1440 return S_OK;
1443 EVENT_HANDLER_FUNC_OBJ(iframe_onreadystatechange);
1445 static HRESULT WINAPI onvisibilitychange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1446 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1448 IDispatchEx *dispex;
1449 HRESULT hres;
1450 BSTR bstr;
1452 CHECK_EXPECT(visibilitychange);
1453 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1455 hres = IDispatch_QueryInterface(V_DISPATCH(&pdp->rgvarg[1]), &IID_IDispatchEx, (void**)&dispex);
1456 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
1458 bstr = SysAllocString(L"toString");
1459 hres = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1460 todo_wine
1461 ok(hres == S_OK, "GetDispID(\"toString\") failed: %08lx\n", hres);
1462 SysFreeString(bstr);
1464 return S_OK;
1467 EVENT_HANDLER_FUNC_OBJ(onvisibilitychange);
1469 static HRESULT WINAPI onbeforeunload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1470 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1472 IEventTarget *event_target;
1473 IHTMLWindow2 *window2;
1474 IDOMEvent *event;
1475 HRESULT hres;
1477 CHECK_EXPECT(onbeforeunload);
1478 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1480 hres = IDispatch_QueryInterface(V_DISPATCH(&pdp->rgvarg[1]), &IID_IDOMEvent, (void**)&event);
1481 ok(hres == S_OK, "Could not get IDOMEvent iface: %08lx\n", hres);
1482 hres = IDOMEvent_get_target(event, &event_target);
1483 ok(hres == S_OK, "get_target failed: %08lx\n", hres);
1484 IDOMEvent_Release(event);
1486 hres = IEventTarget_QueryInterface(event_target, &IID_IHTMLWindow2, (void**)&window2);
1487 ok(hres == S_OK, "Could not get IHTMLWindow2 iface: %08lx\n", hres);
1488 ok(window2 == window, "event_target's window iface != window\n");
1489 IHTMLWindow2_Release(window2);
1491 IEventTarget_Release(event_target);
1492 return S_OK;
1495 EVENT_HANDLER_FUNC_OBJ(onbeforeunload);
1497 static HRESULT WINAPI iframe_onbeforeunload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1498 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1500 CHECK_EXPECT(iframe_onbeforeunload);
1501 ok(called_onbeforeunload, "beforeunload not fired on parent window before iframe\n");
1502 ok(!called_onunload, "unload fired on parent window before beforeunload on iframe\n");
1503 ok(!called_iframe_onunload, "unload fired before beforeunload on iframe\n");
1504 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1505 return S_OK;
1508 EVENT_HANDLER_FUNC_OBJ(iframe_onbeforeunload);
1510 static HRESULT WINAPI pagehide(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1511 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1513 CHECK_EXPECT(pagehide);
1514 ok(!called_onunload, "unload fired before pagehide\n");
1515 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1516 return S_OK;
1519 EVENT_HANDLER_FUNC_OBJ(pagehide);
1521 static HRESULT WINAPI onunload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1522 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1524 CHECK_EXPECT(onunload);
1525 if(expect_iframe_onunload) {
1526 ok(called_onbeforeunload, "beforeunload not fired before unload\n");
1527 ok(called_iframe_onbeforeunload, "beforeunload not fired on iframe before unload\n");
1528 ok(called_pagehide, "pagehide not fired before unload\n");
1529 }else
1530 ok(!called_pagehide, "pagehide fired before unload in quirks mode\n");
1531 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1532 return S_OK;
1535 EVENT_HANDLER_FUNC_OBJ(onunload);
1537 static HRESULT WINAPI iframe_pagehide(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1538 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1540 CHECK_EXPECT(iframe_pagehide);
1541 ok(called_pagehide, "pagehide not fired on parent window before iframe\n");
1542 ok(called_onunload, "unload not fired on parent window before pagehide on iframe\n");
1543 ok(!called_iframe_onunload, "unload fired before pagehide on iframe\n");
1544 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1545 return S_OK;
1548 EVENT_HANDLER_FUNC_OBJ(iframe_pagehide);
1550 static HRESULT WINAPI iframe_onunload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1551 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1553 CHECK_EXPECT(iframe_onunload);
1554 ok(called_onunload, "unload not fired on parent window before iframe\n");
1555 ok(called_iframe_pagehide, "pagehide not fired before unload on iframe\n");
1556 test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller);
1557 return S_OK;
1560 EVENT_HANDLER_FUNC_OBJ(iframe_onunload);
1562 static HRESULT WINAPI nocall(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1563 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1565 ok(0, "unexpected call\n");
1566 return S_OK;
1569 EVENT_HANDLER_FUNC_OBJ(nocall);
1571 #define CONNECTION_POINT_OBJ(cpname, diid) \
1572 static HRESULT WINAPI cpname ## _QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) \
1574 *ppv = NULL; \
1575 if(IsEqualGUID(riid, &IID_IUnknown) \
1576 || IsEqualGUID(riid, &IID_IDispatch) \
1577 || IsEqualGUID(riid, &diid)) \
1578 *ppv = iface; \
1579 else { \
1580 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); \
1581 return E_NOINTERFACE; \
1583 return S_OK; \
1585 static IDispatchExVtbl cpname ## Vtbl = { \
1586 cpname ## _QueryInterface, \
1587 DispatchEx_AddRef, \
1588 DispatchEx_Release, \
1589 DispatchEx_GetTypeInfoCount, \
1590 DispatchEx_GetTypeInfo, \
1591 DispatchEx_GetIDsOfNames, \
1592 cpname, \
1593 DispatchEx_GetDispID, \
1594 DispatchEx_InvokeEx, \
1595 DispatchEx_DeleteMemberByName, \
1596 DispatchEx_DeleteMemberByDispID, \
1597 DispatchEx_GetMemberProperties, \
1598 DispatchEx_GetMemberName, \
1599 DispatchEx_GetNextDispID, \
1600 DispatchEx_GetNameSpaceParent \
1601 }; \
1602 static IDispatchEx cpname ## _obj = { &cpname ## Vtbl }
1604 #define test_cp_args(a,b,c,d,e,f,g) _test_cp_args(__LINE__,a,b,c,d,e,f,g)
1605 static void _test_cp_args(unsigned line, REFIID riid, WORD flags, DISPPARAMS *dp, VARIANT *vres, EXCEPINFO *ei, UINT *argerr, BOOL use_events2)
1607 ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
1608 ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags);
1609 ok_(__FILE__,line)(dp != NULL, "dp == NULL\n");
1610 if (use_events2)
1612 IHTMLEventObj *event;
1613 HRESULT hr;
1614 ok_(__FILE__,line)(dp->cArgs == 1, "dp->cArgs = %d\n", dp->cArgs);
1615 ok_(__FILE__,line)(dp->rgvarg != NULL, "dp->rgvarg = %p\n", dp->rgvarg);
1616 ok_(__FILE__,line)(V_VT(&dp->rgvarg[0]) == VT_DISPATCH, "vt = %d\n", V_VT(&dp->rgvarg[0]));
1617 hr = IDispatch_QueryInterface(V_DISPATCH(&dp->rgvarg[0]), &IID_IHTMLEventObj, (void **)&event);
1618 ok_(__FILE__,line)(hr == S_OK, "Could not get IHTMLEventObj iface: %08lx\n", hr);
1619 IHTMLEventObj_Release(event);
1621 else
1623 ok_(__FILE__,line)(!dp->cArgs, "dp->cArgs = %d\n", dp->cArgs);
1624 ok_(__FILE__,line)(!dp->rgvarg, "dp->rgvarg = %p\n", dp->rgvarg);
1626 ok_(__FILE__,line)(!dp->cNamedArgs, "dp->cNamedArgs = %d\n", dp->cNamedArgs);
1627 ok_(__FILE__,line)(!dp->rgdispidNamedArgs, "dp->rgdispidNamedArgs = %p\n", dp->rgdispidNamedArgs);
1628 ok_(__FILE__,line)(vres != NULL, "vres == NULL\n");
1629 ok_(__FILE__,line)(V_VT(vres) == VT_EMPTY, "V_VT(vres) = %d\n", V_VT(vres));
1630 ok_(__FILE__,line)(ei != NULL, "ei == NULL\n");
1631 ok_(__FILE__,line)(argerr != NULL, "argerr == NULL\n");
1634 #define test_cp_eventarg(a,b,c,d,e,f) _test_cp_eventarg(__LINE__,a,b,c,d,e,f)
1635 static void _test_cp_eventarg(unsigned line, REFIID riid, WORD flags, DISPPARAMS *dp, VARIANT *vres, EXCEPINFO *ei, UINT *argerr)
1637 IHTMLEventObj *event;
1639 ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
1640 ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags);
1641 ok_(__FILE__,line)(dp != NULL, "dp == NULL\n");
1642 ok_(__FILE__,line)(dp->cArgs == 1, "dp->cArgs = %d\n", dp->cArgs);
1643 ok_(__FILE__,line)(dp->rgvarg != NULL, "dp->rgvarg = %p\n", dp->rgvarg);
1644 ok_(__FILE__,line)(!dp->cNamedArgs, "dp->cNamedArgs = %d\n", dp->cNamedArgs);
1645 ok_(__FILE__,line)(!dp->rgdispidNamedArgs, "dp->rgdispidNamedArgs = %p\n", dp->rgdispidNamedArgs);
1646 ok_(__FILE__,line)(vres != NULL, "vres == NULL\n");
1647 ok_(__FILE__,line)(V_VT(vres) == VT_EMPTY, "V_VT(vres) = %d\n", V_VT(vres));
1648 ok_(__FILE__,line)(ei != NULL, "ei == NULL\n");
1649 ok_(__FILE__,line)(argerr != NULL, "argerr == NULL\n");
1651 ok(V_VT(dp->rgvarg) == VT_DISPATCH, "V_VT(dp->rgvarg) = %d\n", V_VT(dp->rgvarg));
1652 ok(V_DISPATCH(dp->rgvarg) != NULL, "V_DISPATCH(dp->rgvarg) = %p\n", V_DISPATCH(dp->rgvarg));
1654 event = _get_event_obj(line);
1655 todo_wine
1656 ok(!iface_cmp((IUnknown*)event, (IUnknown*)V_DISPATCH(dp->rgvarg)), "event != arg0\n");
1657 IHTMLEventObj_Release(event);
1660 static HRESULT WINAPI doccp(IDispatchEx *iface, DISPID dispIdMember,
1661 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1662 VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
1664 switch(dispIdMember) {
1665 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
1666 CHECK_EXPECT(doccp_onclick);
1667 test_cp_args(riid, wFlags, pdp, pVarResult, pei, puArgErr, FALSE);
1668 break;
1669 default:
1670 ok(0, "unexpected call %ld\n", dispIdMember);
1671 return E_NOTIMPL;
1674 return S_OK;
1677 CONNECTION_POINT_OBJ(doccp, DIID_HTMLDocumentEvents);
1679 static HRESULT WINAPI doccp2(IDispatchEx *iface, DISPID dispIdMember,
1680 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1681 VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
1683 switch(dispIdMember) {
1684 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
1685 CHECK_EXPECT(doccp2_onclick);
1686 test_cp_args(riid, wFlags, pdp, pVarResult, pei, puArgErr, TRUE);
1687 break;
1688 default:
1689 ok(0, "unexpected call %ld\n", dispIdMember);
1690 return E_NOTIMPL;
1693 return S_OK;
1696 CONNECTION_POINT_OBJ(doccp2, DIID_HTMLDocumentEvents2);
1698 static HRESULT WINAPI doccp_onclick_cancel(IDispatchEx *iface, DISPID dispIdMember,
1699 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
1701 switch(dispIdMember) {
1702 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
1703 CHECK_EXPECT(doccp_onclick_cancel);
1704 test_cp_args(riid, wFlags, pdp, pVarResult, pei, puArgErr, FALSE);
1705 V_VT(pVarResult) = VT_BOOL;
1706 V_BOOL(pVarResult) = VARIANT_FALSE;
1707 break;
1708 default:
1709 ok(0, "unexpected call %ld\n", dispIdMember);
1710 return E_NOTIMPL;
1713 return S_OK;
1716 CONNECTION_POINT_OBJ(doccp_onclick_cancel, DIID_HTMLDocumentEvents);
1718 static HRESULT WINAPI elem2_cp(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid,
1719 WORD wFlags, DISPPARAMS *pdp, VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
1721 switch(dispIdMember) {
1722 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
1723 CHECK_EXPECT(elem2_cp_onclick);
1724 test_cp_eventarg(riid, wFlags, pdp, pVarResult, pei, puArgErr);
1725 break;
1726 default:
1727 ok(0, "unexpected call %ld\n", dispIdMember);
1728 return E_NOTIMPL;
1731 return S_OK;
1734 CONNECTION_POINT_OBJ(elem2_cp, DIID_HTMLElementEvents2);
1736 static HRESULT WINAPI timeoutFunc_Invoke(IDispatchEx *iface, DISPID dispIdMember,
1737 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1738 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1740 CHECK_EXPECT(timeout);
1742 ok(dispIdMember == DISPID_VALUE, "dispIdMember = %ld\n", dispIdMember);
1743 ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
1744 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
1745 ok(!lcid, "lcid = %lx\n", lcid);
1746 ok(pDispParams != NULL, "pDispParams == NULL\n");
1747 ok(!pDispParams->cArgs, "pdp->cArgs = %d\n", pDispParams->cArgs);
1748 ok(!pDispParams->cNamedArgs, "pdp->cNamedArgs = %d\n", pDispParams->cNamedArgs);
1749 ok(!pDispParams->rgdispidNamedArgs, "pdp->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
1750 ok(!pDispParams->rgvarg, "rgvarg = %p\n", pDispParams->rgvarg);
1751 ok(pVarResult != NULL, "pVarResult = NULL\n");
1752 ok(pExcepInfo != NULL, "pExcepInfo = NULL\n");
1753 ok(!puArgErr, "puArgErr = %p\n", puArgErr);
1754 ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult) = %d\n", V_VT(pVarResult));
1756 return S_OK;
1759 static const IDispatchExVtbl timeoutFuncVtbl = {
1760 DispatchEx_QueryInterface,
1761 DispatchEx_AddRef,
1762 DispatchEx_Release,
1763 DispatchEx_GetTypeInfoCount,
1764 DispatchEx_GetTypeInfo,
1765 DispatchEx_GetIDsOfNames,
1766 timeoutFunc_Invoke,
1767 DispatchEx_GetDispID,
1768 DispatchEx_InvokeEx,
1769 DispatchEx_DeleteMemberByName,
1770 DispatchEx_DeleteMemberByDispID,
1771 DispatchEx_GetMemberProperties,
1772 DispatchEx_GetMemberName,
1773 DispatchEx_GetNextDispID,
1774 DispatchEx_GetNameSpaceParent
1777 static IDispatchEx timeoutFunc = { &timeoutFuncVtbl };
1779 static HRESULT WINAPI timeoutFunc2_Invoke(IDispatchEx *iface, DISPID dispIdMember,
1780 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1781 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1783 ok(0, "unexpected call\n");
1784 return E_FAIL;
1787 static const IDispatchExVtbl timeoutFunc2Vtbl = {
1788 DispatchEx_QueryInterface,
1789 DispatchEx_AddRef,
1790 DispatchEx_Release,
1791 DispatchEx_GetTypeInfoCount,
1792 DispatchEx_GetTypeInfo,
1793 DispatchEx_GetIDsOfNames,
1794 timeoutFunc2_Invoke,
1795 DispatchEx_GetDispID,
1796 DispatchEx_InvokeEx,
1797 DispatchEx_DeleteMemberByName,
1798 DispatchEx_DeleteMemberByDispID,
1799 DispatchEx_GetMemberProperties,
1800 DispatchEx_GetMemberName,
1801 DispatchEx_GetNextDispID,
1802 DispatchEx_GetNameSpaceParent
1805 static IDispatchEx timeoutFunc2 = { &timeoutFunc2Vtbl };
1807 static HRESULT WINAPI div_onclick_disp_Invoke(IDispatchEx *iface, DISPID id,
1808 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1809 VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
1811 CHECK_EXPECT(div_onclick_disp);
1813 test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
1815 ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
1816 ok(!puArgErr, "puArgErr = %p\n", puArgErr);
1818 return S_OK;
1821 static const IDispatchExVtbl div_onclick_dispVtbl = {
1822 Dispatch_QueryInterface,
1823 DispatchEx_AddRef,
1824 DispatchEx_Release,
1825 DispatchEx_GetTypeInfoCount,
1826 DispatchEx_GetTypeInfo,
1827 DispatchEx_GetIDsOfNames,
1828 div_onclick_disp_Invoke,
1831 static IDispatchEx div_onclick_disp = { &div_onclick_dispVtbl };
1833 static void pump_msgs(BOOL *b)
1835 MSG msg;
1837 if(b) {
1838 while(!*b && GetMessageW(&msg, NULL, 0, 0)) {
1839 TranslateMessage(&msg);
1840 DispatchMessageW(&msg);
1842 }else {
1843 while(PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
1844 TranslateMessage(&msg);
1845 DispatchMessageW(&msg);
1850 static IConnectionPoint *get_cp(IUnknown *unk, REFIID riid)
1852 IConnectionPointContainer *cp_container;
1853 IConnectionPoint *cp;
1854 HRESULT hres;
1856 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&cp_container);
1857 ok(hres == S_OK, "Could not get IConnectionPointContainer: %08lx\n", hres);
1859 hres = IConnectionPointContainer_FindConnectionPoint(cp_container, riid, &cp);
1860 IConnectionPointContainer_Release(cp_container);
1861 ok(hres == S_OK, "FindConnectionPoint failed: %08lx\n", hres);
1863 return cp;
1866 static DWORD register_cp(IUnknown *unk, REFIID riid, IUnknown *sink)
1868 IConnectionPoint *cp;
1869 DWORD cookie;
1870 HRESULT hres;
1872 cp = get_cp(unk, riid);
1873 hres = IConnectionPoint_Advise(cp, sink, &cookie);
1874 IConnectionPoint_Release(cp);
1875 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
1877 return cookie;
1880 static void unregister_cp(IUnknown *unk, REFIID riid, DWORD cookie)
1882 IConnectionPoint *cp;
1883 HRESULT hres;
1885 cp = get_cp(unk, riid);
1886 hres = IConnectionPoint_Unadvise(cp, cookie);
1887 IConnectionPoint_Release(cp);
1888 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
1891 static HRESULT WINAPI EventDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
1893 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
1894 *ppv = iface;
1895 return S_OK;
1898 ok(0, "Unexpected call\n");
1899 return E_NOINTERFACE;
1902 static DWORD WINAPI EventDispatch_AddRef(IDispatch *iface)
1904 return 2;
1907 static DWORD WINAPI EventDispatch_Release(IDispatch *iface)
1909 return 1;
1912 static HRESULT WINAPI EventDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
1914 ok(0, "Unexpected call\n");
1915 return E_NOTIMPL;
1918 static HRESULT WINAPI EventDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
1920 ok(0, "Unexpected call\n");
1921 return E_NOTIMPL;
1924 static HRESULT WINAPI EventDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
1925 UINT cNames, LCID lcid, DISPID *rgDispId)
1927 ok(0, "Unexpected call\n");
1928 return E_NOTIMPL;
1931 static HRESULT WINAPI EventDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
1932 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
1933 EXCEPINFO *pExcepInfo, UINT *puArgErr)
1935 ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
1936 ok(pDispParams != NULL, "pDispParams == NULL\n");
1937 ok(pExcepInfo != NULL, "pExcepInfo == NULL\n");
1938 ok(puArgErr != NULL, "puArgErr == NULL\n");
1939 ok(V_VT(pVarResult) == 0, "V_VT(pVarResult) = %d\n", V_VT(pVarResult));
1940 ok(wFlags == DISPATCH_METHOD, "wFlags = %d\n", wFlags);
1942 switch(dispIdMember) {
1943 case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
1944 CHECK_EXPECT2(invoke_onclick);
1945 break;
1946 case DISPID_HTMLDOCUMENTEVENTS2_ONPROPERTYCHANGE:
1947 case DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE:
1948 case 1027:
1949 case 1034:
1950 case 1037:
1951 case 1044:
1952 case 1045:
1953 case 1047:
1954 case 1048:
1955 case 1049:
1956 break; /* TODO */
1957 default:
1958 ok(0, "Unexpected call: %ld\n", dispIdMember);
1961 return S_OK;
1964 static const IDispatchVtbl EventDispatchVtbl = {
1965 EventDispatch_QueryInterface,
1966 EventDispatch_AddRef,
1967 EventDispatch_Release,
1968 EventDispatch_GetTypeInfoCount,
1969 EventDispatch_GetTypeInfo,
1970 EventDispatch_GetIDsOfNames,
1971 EventDispatch_Invoke
1974 static IDispatch EventDispatch = { &EventDispatchVtbl };
1976 static void set_body_html(IHTMLDocument2 *doc, const WCHAR *html)
1978 IHTMLElement *body = doc_get_body(doc);
1979 set_elem_innerhtml(body, html);
1980 IHTMLElement_Release(body);
1983 static void test_onclick(IHTMLDocument2 *doc)
1985 DWORD events_cp_cookie, events2_cp_cookie, elem2_cp_cookie;
1986 IHTMLElement *div, *body;
1987 VARIANT v;
1988 HRESULT hres;
1990 trace("onclick tests in document mode %d\n", document_mode);
1992 set_body_html(doc, L"<div id=\"clickdiv\""
1993 " style=\"text-align: center; background: red; font-size: 32\">"
1994 "click here"
1995 "</div>");
1997 register_cp((IUnknown*)doc, &IID_IDispatch, (IUnknown*)&EventDispatch);
1999 div = get_elem_id(doc, L"clickdiv");
2001 elem_attach_event((IUnknown*)div, L"abcde", (IDispatch*)&nocall_obj);
2002 elem_attach_event((IUnknown*)div, L"onclick", (IDispatch*)&div_onclick_attached_obj);
2004 V_VT(&v) = VT_EMPTY;
2005 hres = IHTMLElement_get_onclick(div, &v);
2006 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2007 ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v));
2009 V_VT(&v) = VT_EMPTY;
2010 hres = IHTMLElement_put_onclick(div, v);
2011 ok(hres == (document_mode < 9 ? E_NOTIMPL : S_OK), "put_onclick failed: %08lx\n", hres);
2013 V_VT(&v) = VT_EMPTY;
2014 hres = IHTMLElement_get_onclick(div, &v);
2015 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2016 ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v));
2018 V_VT(&v) = VT_BSTR;
2019 V_BSTR(&v) = SysAllocString(L"function();");
2020 hres = IHTMLElement_put_onclick(div, v);
2021 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2022 SysFreeString(V_BSTR(&v));
2024 V_VT(&v) = VT_EMPTY;
2025 hres = IHTMLElement_get_onclick(div, &v);
2026 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2027 if(document_mode < 9) {
2028 ok(V_VT(&v) == VT_BSTR, "V_VT(onclick) = %d\n", V_VT(&v));
2029 ok(!lstrcmpW(V_BSTR(&v), L"function();"), "V_BSTR(onclick) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2030 }else {
2031 todo_wine
2032 ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v));
2034 VariantClear(&v);
2036 V_VT(&v) = VT_DISPATCH;
2037 V_DISPATCH(&v) = (IDispatch*)&div_onclick_obj;
2038 hres = IHTMLElement_put_onclick(div, v);
2039 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2041 V_VT(&v) = VT_NULL;
2042 hres = IHTMLElement_put_ondblclick(div, v);
2043 ok(hres == S_OK, "put_ondblclick failed: %08lx\n", hres);
2045 V_VT(&v) = VT_EMPTY;
2046 hres = IHTMLElement_get_onclick(div, &v);
2047 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2048 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onclick) = %d\n", V_VT(&v));
2049 ok(V_DISPATCH(&v) == (IDispatch*)&div_onclick_obj, "V_DISPATCH(onclick) != onclickFunc\n");
2050 VariantClear(&v);
2052 V_VT(&v) = VT_EMPTY;
2053 hres = IHTMLDocument2_get_onclick(doc, &v);
2054 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2055 ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v));
2057 V_VT(&v) = VT_DISPATCH;
2058 V_DISPATCH(&v) = (IDispatch*)&document_onclick_obj;
2059 hres = IHTMLDocument2_put_onclick(doc, v);
2060 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2062 V_VT(&v) = VT_EMPTY;
2063 hres = IHTMLDocument2_get_onclick(doc, &v);
2064 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2065 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onclick) = %d\n", V_VT(&v));
2066 ok(V_DISPATCH(&v) == (IDispatch*)&document_onclick_obj, "V_DISPATCH(onclick) != onclickFunc\n");
2067 VariantClear(&v);
2069 if(document_mode >= 9) {
2070 add_event_listener((IUnknown*)div, L"click", NULL, VARIANT_FALSE);
2071 add_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_capture_obj, VARIANT_TRUE);
2072 add_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_bubble_obj, VARIANT_FALSE);
2075 body = doc_get_body(doc);
2077 V_VT(&v) = VT_DISPATCH;
2078 V_DISPATCH(&v) = (IDispatch*)&body_onclick_obj;
2079 hres = IHTMLElement_put_onclick(body, v);
2080 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2082 if(winetest_interactive && document_mode < 9) {
2083 SET_EXPECT(div_onclick);
2084 SET_EXPECT(div_onclick_attached);
2085 SET_EXPECT(body_onclick);
2086 SET_EXPECT(document_onclick);
2087 SET_EXPECT(invoke_onclick);
2088 pump_msgs(&called_document_onclick);
2089 CHECK_CALLED(div_onclick);
2090 CHECK_CALLED(div_onclick_attached);
2091 CHECK_CALLED(body_onclick);
2092 CHECK_CALLED(document_onclick);
2093 CHECK_CALLED(invoke_onclick);
2096 SET_EXPECT(div_onclick);
2097 SET_EXPECT(div_onclick_attached);
2098 if(document_mode >= 9) {
2099 SET_EXPECT(div_onclick_capture);
2100 SET_EXPECT(div_onclick_bubble);
2102 SET_EXPECT(body_onclick);
2103 SET_EXPECT(document_onclick);
2104 SET_EXPECT(invoke_onclick);
2106 hres = IHTMLElement_click(div);
2107 ok(hres == S_OK, "click failed: %08lx\n", hres);
2109 CHECK_CALLED(div_onclick);
2110 CHECK_CALLED(div_onclick_attached);
2111 if(document_mode >= 9) {
2112 CHECK_CALLED(div_onclick_capture);
2113 CHECK_CALLED(div_onclick_bubble);
2115 CHECK_CALLED(body_onclick);
2116 CHECK_CALLED(document_onclick);
2117 CHECK_CALLED(invoke_onclick);
2119 SET_EXPECT(div_onclick);
2120 SET_EXPECT(div_onclick_attached);
2121 SET_EXPECT(body_onclick);
2122 SET_EXPECT(document_onclick);
2123 SET_EXPECT(invoke_onclick);
2125 V_VT(&v) = VT_EMPTY;
2126 elem_fire_event((IUnknown*)div, L"onclick", &v);
2128 CHECK_CALLED(div_onclick);
2129 CHECK_CALLED(div_onclick_attached);
2130 CHECK_CALLED(body_onclick);
2131 CHECK_CALLED(document_onclick);
2132 CHECK_CALLED(invoke_onclick);
2134 events_cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj);
2135 events2_cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents2, (IUnknown*)&doccp2_obj);
2136 elem_attach_event((IUnknown*)div, L"onclick", (IDispatch*)&div_onclick_disp);
2137 doc_attach_event(doc, L"onclick", (IDispatch*)&doc_onclick_attached_obj);
2139 SET_EXPECT(div_onclick);
2140 SET_EXPECT(div_onclick_disp);
2141 SET_EXPECT(div_onclick_attached);
2142 if(document_mode >= 9) {
2143 SET_EXPECT(div_onclick_capture);
2144 SET_EXPECT(div_onclick_bubble);
2146 SET_EXPECT(body_onclick);
2147 SET_EXPECT(document_onclick);
2148 SET_EXPECT(doc_onclick_attached);
2149 SET_EXPECT(doccp_onclick);
2150 SET_EXPECT(doccp2_onclick);
2151 SET_EXPECT(invoke_onclick);
2153 hres = IHTMLElement_click(div);
2154 ok(hres == S_OK, "click failed: %08lx\n", hres);
2156 CHECK_CALLED(div_onclick);
2157 CHECK_CALLED(div_onclick_disp);
2158 CHECK_CALLED(div_onclick_attached);
2159 if(document_mode >= 9) {
2160 CHECK_CALLED(div_onclick_capture);
2161 CHECK_CALLED(div_onclick_bubble);
2163 CHECK_CALLED(body_onclick);
2164 CHECK_CALLED(document_onclick);
2165 CHECK_CALLED(doc_onclick_attached);
2166 CHECK_CALLED(doccp_onclick);
2167 CHECK_CALLED(doccp2_onclick);
2168 CHECK_CALLED(invoke_onclick);
2170 elem2_cp_cookie = register_cp((IUnknown*)div, &DIID_HTMLElementEvents2, (IUnknown*)&elem2_cp_obj);
2172 SET_EXPECT(div_onclick);
2173 SET_EXPECT(div_onclick_disp);
2174 SET_EXPECT(div_onclick_attached);
2175 if(document_mode >= 9) {
2176 SET_EXPECT(div_onclick_capture);
2177 SET_EXPECT(div_onclick_bubble);
2179 SET_EXPECT(elem2_cp_onclick);
2180 SET_EXPECT(body_onclick);
2181 SET_EXPECT(document_onclick);
2182 SET_EXPECT(doc_onclick_attached);
2183 SET_EXPECT(doccp_onclick);
2184 SET_EXPECT(doccp2_onclick);
2185 SET_EXPECT(invoke_onclick);
2187 trace("click >>>\n");
2188 hres = IHTMLElement_click(div);
2189 ok(hres == S_OK, "click failed: %08lx\n", hres);
2190 trace("click <<<\n");
2192 CHECK_CALLED(div_onclick);
2193 CHECK_CALLED(div_onclick_disp);
2194 CHECK_CALLED(div_onclick_attached);
2195 if(document_mode >= 9) {
2196 CHECK_CALLED(div_onclick_capture);
2197 CHECK_CALLED(div_onclick_bubble);
2199 CHECK_CALLED(elem2_cp_onclick);
2200 CHECK_CALLED(body_onclick);
2201 CHECK_CALLED(document_onclick);
2202 CHECK_CALLED(doc_onclick_attached);
2203 CHECK_CALLED(doccp_onclick);
2204 CHECK_CALLED(doccp2_onclick);
2205 CHECK_CALLED(invoke_onclick);
2207 unregister_cp((IUnknown*)div, &DIID_HTMLElementEvents2, elem2_cp_cookie);
2208 unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, events_cp_cookie);
2209 unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents2, events2_cp_cookie);
2211 V_VT(&v) = VT_NULL;
2212 hres = IHTMLElement_put_onclick(div, v);
2213 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2215 hres = IHTMLElement_get_onclick(div, &v);
2216 ok(hres == S_OK, "get_onclick failed: %08lx\n", hres);
2217 ok(V_VT(&v) == VT_NULL, "get_onclick returned vt %d\n", V_VT(&v));
2219 elem_detach_event((IUnknown*)div, L"onclick", (IDispatch*)&div_onclick_disp);
2220 elem_detach_event((IUnknown*)div, L"onclick", (IDispatch*)&div_onclick_disp);
2221 elem_detach_event((IUnknown*)div, L"test", (IDispatch*)&div_onclick_disp);
2222 doc_detach_event(doc, L"onclick", (IDispatch*)&doc_onclick_attached_obj);
2224 if(document_mode >= 9) {
2225 remove_event_listener((IUnknown*)div, L"click", NULL, VARIANT_FALSE);
2226 remove_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_capture_obj, VARIANT_TRUE);
2227 remove_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_bubble_obj, VARIANT_FALSE);
2230 SET_EXPECT(div_onclick_attached);
2231 SET_EXPECT(body_onclick);
2232 SET_EXPECT(document_onclick);
2233 SET_EXPECT(invoke_onclick);
2235 hres = IHTMLElement_click(div);
2236 ok(hres == S_OK, "click failed: %08lx\n", hres);
2238 CHECK_CALLED(div_onclick_attached);
2239 CHECK_CALLED(body_onclick);
2240 CHECK_CALLED(document_onclick);
2241 CHECK_CALLED(invoke_onclick);
2243 IHTMLElement_Release(div);
2244 IHTMLElement_Release(body);
2247 static void test_onreadystatechange(IHTMLDocument2 *doc)
2249 IHTMLFrameBase *iframe;
2250 IHTMLElement2 *elem2;
2251 IHTMLElement *elem;
2252 VARIANT v;
2253 BSTR str;
2254 HRESULT hres;
2256 elem = get_elem_id(doc, L"iframe");
2257 elem2 = get_elem2_iface((IUnknown*)elem);
2258 IHTMLElement_Release(elem);
2260 V_VT(&v) = VT_EMPTY;
2261 hres = IHTMLElement2_get_onreadystatechange(elem2, &v);
2262 ok(hres == S_OK, "get_onreadystatechange failed: %08lx\n", hres);
2263 ok(V_VT(&v) == VT_NULL, "V_VT(onreadystatechange) = %d\n", V_VT(&v));
2265 V_VT(&v) = VT_DISPATCH;
2266 V_DISPATCH(&v) = (IDispatch*)&iframe_onreadystatechange_obj;
2267 hres = IHTMLElement2_put_onreadystatechange(elem2, v);
2268 ok(hres == S_OK, "put_onreadystatechange failed: %08lx\n", hres);
2270 V_VT(&v) = VT_EMPTY;
2271 hres = IHTMLElement2_get_onreadystatechange(elem2, &v);
2272 ok(hres == S_OK, "get_onreadystatechange failed: %08lx\n", hres);
2273 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onreadystatechange) = %d\n", V_VT(&v));
2274 ok(V_DISPATCH(&v) == (IDispatch*)&iframe_onreadystatechange_obj, "unexpected onreadystatechange value\n");
2276 hres = IHTMLElement2_QueryInterface(elem2, &IID_IHTMLFrameBase, (void**)&iframe);
2277 IHTMLElement2_Release(elem2);
2278 ok(hres == S_OK, "Could not get IHTMLFrameBase iface: %08lx\n", hres);
2280 hres = IHTMLFrameBase_put_src(iframe, (str = SysAllocString(L"about:blank")));
2281 SysFreeString(str);
2282 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2284 SET_EXPECT(iframe_onreadystatechange_loading);
2285 SET_EXPECT(iframedoc_onreadystatechange);
2286 SET_EXPECT(iframe_onreadystatechange_interactive);
2287 SET_EXPECT(iframe_onreadystatechange_complete);
2288 pump_msgs(&called_iframe_onreadystatechange_complete);
2289 CHECK_CALLED(iframe_onreadystatechange_loading);
2290 CHECK_CALLED(iframedoc_onreadystatechange);
2291 CHECK_CALLED(iframe_onreadystatechange_interactive);
2292 CHECK_CALLED(iframe_onreadystatechange_complete);
2294 IHTMLFrameBase_Release(iframe);
2297 static void test_imgload(IHTMLDocument2 *doc)
2299 IHTMLImgElement *img;
2300 IHTMLElement *elem;
2301 VARIANT_BOOL b;
2302 VARIANT v;
2303 BSTR str;
2304 HRESULT hres;
2306 elem = get_elem_id(doc, L"imgid");
2307 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLImgElement, (void**)&img);
2308 ok(hres == S_OK, "Could not get IHTMLImgElement iface: %08lx\n", hres);
2310 V_VT(&v) = VT_EMPTY;
2311 hres = IHTMLImgElement_get_onload(img, &v);
2312 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2313 ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v));
2315 V_VT(&v) = VT_DISPATCH;
2316 V_DISPATCH(&v) = (IDispatch*)&img_onload_obj;
2317 hres = IHTMLImgElement_put_onload(img, v);
2318 ok(hres == S_OK, "put_onload failed: %08lx\n", hres);
2320 V_VT(&v) = VT_EMPTY;
2321 hres = IHTMLImgElement_get_onload(img, &v);
2322 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2323 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v));
2324 ok(V_DISPATCH(&v) == (IDispatch*)&img_onload_obj, "V_DISPATCH(onload) != onloadkFunc\n");
2325 VariantClear(&v);
2327 V_VT(&v) = VT_DISPATCH;
2328 V_DISPATCH(&v) = (IDispatch*)&img_onerror_obj;
2329 hres = IHTMLImgElement_put_onerror(img, v);
2330 ok(hres == S_OK, "put_onerror failed: %08lx\n", hres);
2332 V_VT(&v) = VT_EMPTY;
2333 hres = IHTMLImgElement_get_onerror(img, &v);
2334 ok(hres == S_OK, "get_onerror failed: %08lx\n", hres);
2335 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onerror) = %d\n", V_VT(&v));
2336 ok(V_DISPATCH(&v) == (IDispatch*)&img_onerror_obj, "V_DISPATCH(onerror) != onerrorFunc\n");
2337 VariantClear(&v);
2339 str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.png");
2340 hres = IHTMLImgElement_put_src(img, str);
2341 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2343 SET_EXPECT(img_onload);
2344 pump_msgs(&called_img_onload);
2345 CHECK_CALLED(img_onload);
2347 hres = IHTMLImgElement_get_complete(img, &b);
2348 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2349 ok(b == VARIANT_TRUE, "complete = %x\n", b);
2351 /* cached images send synchronous load event in legacy modes */
2352 if(document_mode < 9)
2353 SET_EXPECT(img_onload);
2354 hres = IHTMLImgElement_put_src(img, str);
2355 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2356 if(document_mode < 9) {
2357 CHECK_CALLED(img_onload);
2358 pump_msgs(NULL);
2359 }else {
2360 SET_EXPECT(img_onload);
2361 pump_msgs(&called_img_onload);
2362 CHECK_CALLED(img_onload);
2365 if(document_mode < 9)
2366 SET_EXPECT(img_onload);
2367 V_VT(&v) = VT_BSTR;
2368 V_BSTR(&v) = str;
2369 str = SysAllocString(L"src");
2370 hres = IHTMLElement_setAttribute(elem, str, v, 0);
2371 ok(hres == S_OK, "setAttribute failed: %08lx\n", hres);
2372 SysFreeString(str);
2373 VariantClear(&v);
2374 if(document_mode < 9) {
2375 CHECK_CALLED(img_onload);
2376 pump_msgs(NULL);
2377 }else {
2378 SET_EXPECT(img_onload);
2379 pump_msgs(&called_img_onload);
2380 CHECK_CALLED(img_onload);
2383 SET_EXPECT(img_onerror);
2385 str = SysAllocString(L"about:blank");
2386 hres = IHTMLImgElement_put_src(img, str);
2387 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2388 SysFreeString(str);
2390 pump_msgs(&called_img_onerror); /* FIXME: should not be needed */
2392 CHECK_CALLED(img_onerror);
2394 IHTMLImgElement_Release(img);
2395 IHTMLElement_Release(elem);
2397 /* test onload on unattached image */
2398 hres = IHTMLDocument2_createElement(doc, (str = SysAllocString(L"img")), &elem);
2399 SysFreeString(str);
2400 ok(hres == S_OK, "createElement(img) failed: %08lx\n", hres);
2402 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLImgElement, (void**)&img);
2403 IHTMLElement_Release(elem);
2404 ok(hres == S_OK, "Could not get IHTMLImgElement iface: %08lx\n", hres);
2406 V_VT(&v) = VT_EMPTY;
2407 hres = IHTMLImgElement_get_onload(img, &v);
2408 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2409 ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v));
2411 V_VT(&v) = VT_DISPATCH;
2412 V_DISPATCH(&v) = (IDispatch*)&unattached_img_onload_obj;
2413 hres = IHTMLImgElement_put_onload(img, v);
2414 ok(hres == S_OK, "put_onload failed: %08lx\n", hres);
2416 V_VT(&v) = VT_EMPTY;
2417 hres = IHTMLImgElement_get_onload(img, &v);
2418 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2419 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v));
2420 ok(V_DISPATCH(&v) == (IDispatch*)&unattached_img_onload_obj, "incorrect V_DISPATCH(onload)\n");
2421 VariantClear(&v);
2423 str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.png?v=1");
2424 hres = IHTMLImgElement_put_src(img, str);
2425 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2426 SysFreeString(str);
2428 SET_EXPECT(img_onload);
2429 pump_msgs(&called_img_onload);
2430 CHECK_CALLED(img_onload);
2432 IHTMLImgElement_Release(img);
2435 static void test_inputload(IHTMLDocument2 *doc)
2437 IHTMLInputElement *input;
2438 IHTMLElement *elem;
2439 VARIANT_BOOL b;
2440 VARIANT v;
2441 BSTR str;
2442 HRESULT hres;
2444 elem = get_elem_id(doc, L"inputid");
2445 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLInputElement, (void**)&input);
2446 ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres);
2448 V_VT(&v) = VT_EMPTY;
2449 hres = IHTMLInputElement_get_onload(input, &v);
2450 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2451 ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v));
2453 V_VT(&v) = VT_DISPATCH;
2454 V_DISPATCH(&v) = (IDispatch*)&input_onload_obj;
2455 hres = IHTMLInputElement_put_onload(input, v);
2456 ok(hres == S_OK, "put_onload failed: %08lx\n", hres);
2458 V_VT(&v) = VT_EMPTY;
2459 hres = IHTMLInputElement_get_onload(input, &v);
2460 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2461 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v));
2462 ok(V_DISPATCH(&v) == (IDispatch*)&input_onload_obj, "V_DISPATCH(onload) != input_onload_obj\n");
2463 VariantClear(&v);
2465 hres = IHTMLInputElement_get_complete(input, &b);
2466 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2467 ok(b == VARIANT_FALSE, "complete = %x\n", b);
2469 str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.png?v=2");
2470 hres = IHTMLInputElement_put_src(input, str);
2471 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2473 hres = IHTMLInputElement_get_complete(input, &b);
2474 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2475 ok(b == VARIANT_FALSE, "complete = %x\n", b);
2477 SET_EXPECT(input_onload);
2478 pump_msgs(&called_input_onload);
2479 CHECK_CALLED(input_onload);
2481 hres = IHTMLInputElement_get_complete(input, &b);
2482 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2483 ok(b == VARIANT_TRUE, "complete = %x\n", b);
2485 /* cached images send synchronous load event in legacy modes */
2486 if(document_mode < 9)
2487 SET_EXPECT(input_onload);
2488 hres = IHTMLInputElement_put_src(input, str);
2489 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2490 if(document_mode < 9) {
2491 CHECK_CALLED(input_onload);
2492 pump_msgs(NULL);
2493 }else {
2494 SET_EXPECT(input_onload);
2495 pump_msgs(&called_input_onload);
2496 CHECK_CALLED(input_onload);
2499 if(document_mode < 9)
2500 SET_EXPECT(input_onload);
2501 V_VT(&v) = VT_BSTR;
2502 V_BSTR(&v) = str;
2503 str = SysAllocString(L"src");
2504 hres = IHTMLElement_setAttribute(elem, str, v, 0);
2505 ok(hres == S_OK, "setAttribute failed: %08lx\n", hres);
2506 SysFreeString(str);
2507 VariantClear(&v);
2508 if(document_mode < 9) {
2509 CHECK_CALLED(input_onload);
2510 pump_msgs(NULL);
2511 }else {
2512 SET_EXPECT(input_onload);
2513 pump_msgs(&called_input_onload);
2514 CHECK_CALLED(input_onload);
2517 IHTMLInputElement_Release(input);
2518 IHTMLElement_Release(elem);
2521 static void test_link_load(IHTMLDocument2 *doc)
2523 IHTMLLinkElement *link;
2524 IHTMLElement *elem;
2525 VARIANT v;
2526 BSTR str;
2527 HRESULT hres;
2529 elem = get_elem_id(doc, L"linkid");
2530 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLLinkElement, (void**)&link);
2531 IHTMLElement_Release(elem);
2532 ok(hres == S_OK, "Could not get IHTMLLinkElement iface: %08lx\n", hres);
2534 V_VT(&v) = VT_EMPTY;
2535 hres = IHTMLLinkElement_get_onload(link, &v);
2536 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2537 ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v));
2539 V_VT(&v) = VT_DISPATCH;
2540 V_DISPATCH(&v) = (IDispatch*)&link_onload_obj;
2541 hres = IHTMLLinkElement_put_onload(link, v);
2542 ok(hres == S_OK, "put_onload failed: %08lx\n", hres);
2544 V_VT(&v) = VT_EMPTY;
2545 hres = IHTMLLinkElement_get_onload(link, &v);
2546 ok(hres == S_OK, "get_onload failed: %08lx\n", hres);
2547 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v));
2548 ok(V_DISPATCH(&v) == (IDispatch*)&link_onload_obj, "V_DISPATCH(onload) != onloadkFunc\n");
2549 VariantClear(&v);
2551 str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/styles.css");
2552 hres = IHTMLLinkElement_put_href(link, str);
2553 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2554 SysFreeString(str);
2556 SET_EXPECT(link_onload);
2557 pump_msgs(&called_link_onload);
2558 CHECK_CALLED(link_onload);
2560 IHTMLLinkElement_Release(link);
2563 static void test_focus(IHTMLDocument2 *doc)
2565 IHTMLInputElement *input;
2566 IHTMLElement2 *elem2;
2567 IHTMLElement4 *div;
2568 IHTMLElement *elem;
2569 VARIANT_BOOL b;
2570 VARIANT v;
2571 BSTR str;
2572 HRESULT hres;
2574 elem = get_elem_id(doc, L"inputid");
2575 elem2 = get_elem2_iface((IUnknown*)elem);
2577 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLInputElement, (void**)&input);
2578 IHTMLElement_Release(elem);
2579 ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres);
2581 hres = IHTMLInputElement_get_complete(input, &b);
2582 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2583 ok(b == VARIANT_FALSE, "complete = %x\n", b);
2585 str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.png?v=3");
2586 hres = IHTMLInputElement_put_src(input, str);
2587 ok(hres == S_OK, "put_src failed: %08lx\n", hres);
2588 SysFreeString(str);
2590 pump_msgs(NULL);
2592 hres = IHTMLInputElement_get_complete(input, &b);
2593 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2594 ok(b == VARIANT_FALSE, "complete = %x\n", b);
2595 IHTMLInputElement_Release(input);
2597 elem = get_elem_id(doc, L"divid");
2598 div = get_elem4_iface((IUnknown*)elem);
2599 IHTMLElement_Release(elem);
2601 V_VT(&v) = VT_EMPTY;
2602 hres = IHTMLElement2_get_onfocus(elem2, &v);
2603 ok(hres == S_OK, "get_onfocus failed: %08lx\n", hres);
2604 ok(V_VT(&v) == VT_NULL, "V_VT(onfocus) = %d\n", V_VT(&v));
2606 V_VT(&v) = VT_DISPATCH;
2607 V_DISPATCH(&v) = (IDispatch*)&input_onfocus_obj;
2608 hres = IHTMLElement2_put_onfocus(elem2, v);
2609 ok(hres == S_OK, "put_onfocus failed: %08lx\n", hres);
2611 V_VT(&v) = VT_EMPTY;
2612 hres = IHTMLElement2_get_onfocus(elem2, &v);
2613 ok(hres == S_OK, "get_onfocus failed: %08lx\n", hres);
2614 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onfocus) = %d\n", V_VT(&v));
2615 ok(V_DISPATCH(&v) == (IDispatch*)&input_onfocus_obj, "V_DISPATCH(onfocus) != onfocusFunc\n");
2616 VariantClear(&v);
2618 V_VT(&v) = VT_DISPATCH;
2619 V_DISPATCH(&v) = (IDispatch*)&div_onfocusin_obj;
2620 hres = IHTMLElement4_put_onfocusin(div, v);
2621 ok(hres == S_OK, "put_onfocusin failed: %08lx\n", hres);
2623 V_VT(&v) = VT_EMPTY;
2624 hres = IHTMLElement4_get_onfocusin(div, &v);
2625 ok(hres == S_OK, "get_onfocusin failed: %08lx\n", hres);
2626 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onfocusin) = %d\n", V_VT(&v));
2627 ok(V_DISPATCH(&v) == (IDispatch*)&div_onfocusin_obj, "V_DISPATCH(onfocus) != onfocusFunc\n");
2628 VariantClear(&v);
2630 V_VT(&v) = VT_EMPTY;
2631 hres = IHTMLElement2_get_onfocus(elem2, &v);
2632 ok(hres == S_OK, "get_onfocus failed: %08lx\n", hres);
2633 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onfocus) = %d\n", V_VT(&v));
2634 ok(V_DISPATCH(&v) == (IDispatch*)&input_onfocus_obj, "V_DISPATCH(onfocus) != onfocusFunc\n");
2635 VariantClear(&v);
2637 if(!winetest_interactive)
2638 ShowWindow(container_hwnd, SW_SHOW);
2640 SetFocus(NULL);
2641 ok(!IsChild(container_hwnd, GetFocus()), "focus belongs to document window\n");
2643 hres = IHTMLWindow2_focus(window);
2644 ok(hres == S_OK, "focus failed: %08lx\n", hres);
2646 ok(IsChild(container_hwnd, GetFocus()), "focus does not belong to document window\n");
2647 pump_msgs(NULL);
2649 SET_EXPECT(div_onfocusin);
2650 SET_EXPECT(input_onfocus);
2651 hres = IHTMLElement2_focus(elem2);
2652 ok(hres == S_OK, "focus failed: %08lx\n", hres);
2653 pump_msgs(NULL);
2654 CHECK_CALLED(div_onfocusin);
2655 CHECK_CALLED(input_onfocus);
2657 SET_EXPECT(div_onfocusin);
2658 V_VT(&v) = VT_EMPTY;
2659 elem_fire_event((IUnknown*)elem2, L"onfocusin", &v);
2660 CHECK_CALLED(div_onfocusin);
2662 V_VT(&v) = VT_DISPATCH;
2663 V_DISPATCH(&v) = (IDispatch*)&input_onblur_obj;
2664 hres = IHTMLElement2_put_onblur(elem2, v);
2665 ok(hres == S_OK, "put_onblur failed: %08lx\n", hres);
2667 V_VT(&v) = VT_DISPATCH;
2668 V_DISPATCH(&v) = (IDispatch*)&div_onfocusout_obj;
2669 hres = IHTMLElement4_put_onfocusout(div, v);
2670 ok(hres == S_OK, "put_onfocusout failed: %08lx\n", hres);
2672 SET_EXPECT(div_onfocusout);
2673 SET_EXPECT(input_onblur);
2674 hres = IHTMLElement2_blur(elem2);
2675 pump_msgs(NULL);
2676 CHECK_CALLED(input_onblur);
2677 CHECK_CALLED(div_onfocusout);
2678 ok(hres == S_OK, "blur failed: %08lx\n", hres);
2680 if(!winetest_interactive)
2681 ShowWindow(container_hwnd, SW_HIDE);
2683 IHTMLElement2_Release(elem2);
2684 IHTMLElement4_Release(div);
2687 static void test_visibilitychange(IHTMLDocument2 *doc)
2689 if(!winetest_interactive) {
2690 ShowWindow(container_hwnd, SW_SHOW);
2691 pump_msgs(NULL);
2693 add_event_listener((IUnknown*)doc, L"visibilitychange", (IDispatch*)&onvisibilitychange_obj, VARIANT_TRUE);
2695 ShowWindow(container_hwnd, SW_HIDE);
2696 pump_msgs(NULL);
2698 ShowWindow(container_hwnd, SW_SHOW);
2699 pump_msgs(NULL);
2701 if(document_mode < 10) {
2702 ShowWindow(container_hwnd, SW_MINIMIZE);
2703 pump_msgs(NULL);
2705 ShowWindow(container_hwnd, SW_RESTORE);
2706 pump_msgs(NULL);
2707 }else {
2708 /* FIXME: currently not implemented in Wine, so we can't wait for it */
2709 BOOL *expect = broken(1) ? &called_visibilitychange : NULL;
2711 SET_EXPECT(visibilitychange);
2712 ShowWindow(container_hwnd, SW_MINIMIZE);
2713 pump_msgs(expect);
2714 todo_wine
2715 CHECK_CALLED(visibilitychange);
2717 SET_EXPECT(visibilitychange);
2718 ShowWindow(container_hwnd, SW_RESTORE);
2719 pump_msgs(expect);
2720 todo_wine
2721 CHECK_CALLED(visibilitychange);
2724 navigate(doc, document_mode < 10 ? L"blank_ie10.html" : L"blank.html");
2726 if(document_mode >= 9)
2727 add_event_listener((IUnknown*)doc, L"visibilitychange", (IDispatch*)&onvisibilitychange_obj, VARIANT_TRUE);
2729 if(!winetest_interactive) {
2730 ShowWindow(container_hwnd, SW_HIDE);
2731 pump_msgs(NULL);
2735 static void test_unload_event(IHTMLDocument2 *doc)
2737 IHTMLDocument2 *child_doc;
2738 IHTMLFrameBase2 *iframe;
2739 IHTMLDocument6 *doc6;
2740 IHTMLElement2 *elem;
2741 IHTMLWindow2 *child;
2742 HRESULT hres;
2743 VARIANT v;
2744 BSTR bstr;
2746 V_VT(&v) = VT_DISPATCH;
2747 V_DISPATCH(&v) = (IDispatch*)&onunload_obj;
2748 hres = IHTMLWindow2_put_onunload(window, v);
2749 ok(hres == S_OK, "put_onunload failed: %08lx\n", hres);
2751 V_VT(&v) = VT_EMPTY;
2752 hres = IHTMLWindow2_get_onunload(window, &v);
2753 ok(hres == S_OK, "get_onunload failed: %08lx\n", hres);
2754 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onunload) = %d\n", V_VT(&v));
2755 ok(V_DISPATCH(&v) == (IDispatch*)&onunload_obj, "V_DISPATCH(onunload) = %p\n", V_DISPATCH(&v));
2757 V_VT(&v) = VT_DISPATCH;
2758 V_DISPATCH(&v) = (IDispatch*)&onbeforeunload_obj;
2759 hres = IHTMLWindow2_put_onbeforeunload(window, v);
2760 ok(hres == S_OK, "put_onbeforeunload failed: %08lx\n", hres);
2762 V_VT(&v) = VT_EMPTY;
2763 hres = IHTMLWindow2_get_onbeforeunload(window, &v);
2764 ok(hres == S_OK, "get_onbeforeunload failed: %08lx\n", hres);
2765 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onbeforeunload) = %d\n", V_VT(&v));
2766 ok(V_DISPATCH(&v) == (IDispatch*)&onbeforeunload_obj, "V_DISPATCH(onbeforeunload) = %p\n", V_DISPATCH(&v));
2768 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument6, (void**)&doc6);
2769 ok(hres == S_OK, "Could not get IHTMLDocument6 iface: %08lx\n", hres);
2770 bstr = SysAllocString(L"ifr");
2771 hres = IHTMLDocument6_getElementById(doc6, bstr, &elem);
2772 ok(hres == S_OK, "getElementById failed: %08lx\n", hres);
2773 IHTMLDocument6_Release(doc6);
2774 SysFreeString(bstr);
2776 hres = IHTMLElement2_QueryInterface(elem, &IID_IHTMLFrameBase2, (void**)&iframe);
2777 ok(hres == S_OK, "Could not get IHTMLFrameBase2 iface: %08lx\n", hres);
2778 IHTMLElement2_Release(elem);
2779 hres = IHTMLFrameBase2_get_contentWindow(iframe, &child);
2780 ok(hres == S_OK, "get_contentWindow failed: %08lx\n", hres);
2781 IHTMLFrameBase2_Release(iframe);
2783 hres = IHTMLWindow2_get_document(child, &child_doc);
2784 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
2786 V_VT(&v) = VT_DISPATCH;
2787 V_DISPATCH(&v) = (IDispatch*)&iframe_onunload_obj;
2788 hres = IHTMLWindow2_put_onunload(child, v);
2789 ok(hres == S_OK, "put_onunload failed: %08lx\n", hres);
2791 V_VT(&v) = VT_EMPTY;
2792 hres = IHTMLWindow2_get_onunload(child, &v);
2793 ok(hres == S_OK, "get_onunload failed: %08lx\n", hres);
2794 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onunload) = %d\n", V_VT(&v));
2795 ok(V_DISPATCH(&v) == (IDispatch*)&iframe_onunload_obj, "V_DISPATCH(onunload) = %p\n", V_DISPATCH(&v));
2797 V_VT(&v) = VT_DISPATCH;
2798 V_DISPATCH(&v) = (IDispatch*)&iframe_onbeforeunload_obj;
2799 hres = IHTMLWindow2_put_onbeforeunload(child, v);
2800 ok(hres == S_OK, "put_onbeforeunload failed: %08lx\n", hres);
2802 V_VT(&v) = VT_EMPTY;
2803 hres = IHTMLWindow2_get_onbeforeunload(child, &v);
2804 ok(hres == S_OK, "get_onbeforeunload failed: %08lx\n", hres);
2805 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onbeforeunload) = %d\n", V_VT(&v));
2806 ok(V_DISPATCH(&v) == (IDispatch*)&iframe_onbeforeunload_obj, "V_DISPATCH(onbeforeunload) = %p\n", V_DISPATCH(&v));
2808 add_event_listener((IUnknown*)window, L"pagehide", (IDispatch*)&pagehide_obj, VARIANT_TRUE);
2809 add_event_listener((IUnknown*)child, L"pagehide", (IDispatch*)&iframe_pagehide_obj, VARIANT_TRUE);
2810 add_event_listener((IUnknown*)doc, L"beforeunload", (IDispatch*)&nocall_obj, VARIANT_TRUE);
2811 add_event_listener((IUnknown*)child_doc, L"beforeunload", (IDispatch*)&nocall_obj, VARIANT_TRUE);
2812 add_event_listener((IUnknown*)doc, L"unload", (IDispatch*)&nocall_obj, VARIANT_TRUE);
2813 add_event_listener((IUnknown*)child_doc, L"unload", (IDispatch*)&nocall_obj, VARIANT_TRUE);
2814 IHTMLDocument2_Release(child_doc);
2815 IHTMLWindow2_Release(child);
2817 SET_EXPECT(onbeforeunload);
2818 SET_EXPECT(iframe_onbeforeunload);
2819 SET_EXPECT(onunload);
2820 SET_EXPECT(pagehide);
2821 SET_EXPECT(iframe_onunload);
2822 SET_EXPECT(iframe_pagehide);
2823 navigate(doc, L"blank.html");
2824 CHECK_CALLED(iframe_pagehide);
2825 CHECK_CALLED(iframe_onunload);
2826 CHECK_CALLED(pagehide);
2827 CHECK_CALLED(onunload);
2828 CHECK_CALLED(iframe_onbeforeunload);
2829 CHECK_CALLED(onbeforeunload);
2831 V_VT(&v) = VT_EMPTY;
2832 hres = IHTMLWindow2_get_onbeforeunload(window, &v);
2833 ok(hres == S_OK, "get_onbeforeunload failed: %08lx\n", hres);
2834 ok(V_VT(&v) == VT_NULL, "V_VT(onbeforeunload) = %d\n", V_VT(&v));
2836 V_VT(&v) = VT_DISPATCH;
2837 V_DISPATCH(&v) = (IDispatch*)&onunload_obj;
2838 hres = IHTMLWindow2_put_onunload(window, v);
2839 ok(hres == S_OK, "put_onunload failed: %08lx\n", hres);
2841 V_VT(&v) = VT_EMPTY;
2842 hres = IHTMLWindow2_get_onunload(window, &v);
2843 ok(hres == S_OK, "get_onunload failed: %08lx\n", hres);
2844 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onunload) = %d\n", V_VT(&v));
2845 ok(V_DISPATCH(&v) == (IDispatch*)&onunload_obj, "V_DISPATCH(onunload) = %p\n", V_DISPATCH(&v));
2847 V_VT(&v) = VT_DISPATCH;
2848 V_DISPATCH(&v) = (IDispatch*)&onbeforeunload_obj;
2849 hres = IHTMLWindow2_put_onbeforeunload(window, v);
2850 ok(hres == S_OK, "put_onbeforeunload failed: %08lx\n", hres);
2852 V_VT(&v) = VT_EMPTY;
2853 hres = IHTMLWindow2_get_onbeforeunload(window, &v);
2854 ok(hres == S_OK, "get_onbeforeunload failed: %08lx\n", hres);
2855 ok(V_VT(&v) == VT_DISPATCH, "V_VT(onbeforeunload) = %d\n", V_VT(&v));
2856 ok(V_DISPATCH(&v) == (IDispatch*)&onbeforeunload_obj, "V_DISPATCH(onbeforeunload) = %p\n", V_DISPATCH(&v));
2858 IOleDocumentView_Show(view, FALSE);
2860 SET_EXPECT(onunload);
2861 IOleDocumentView_CloseView(view, 0);
2862 CHECK_CALLED(onunload);
2864 IOleDocumentView_SetInPlaceSite(view, NULL);
2865 IOleDocumentView_Release(view);
2866 view = NULL;
2869 static void test_submit(IHTMLDocument2 *doc)
2871 IHTMLElement *elem, *submit;
2872 IHTMLInputElement *input;
2873 IHTMLFormElement *form;
2874 VARIANT_BOOL b;
2875 VARIANT v;
2876 DWORD cp_cookie;
2877 HRESULT hres;
2879 set_body_html(doc,
2880 L"<form id=\"formid\" method=\"post\" action=\"about:blank\">"
2881 "<input type=\"text\" value=\"test\" name=\"i\"/>"
2882 "<input type=\"submit\" id=\"submitid\" />"
2883 "</form>");
2885 elem = get_elem_id(doc, L"formid");
2887 V_VT(&v) = VT_DISPATCH;
2888 V_DISPATCH(&v) = (IDispatch*)&form_onclick_obj;
2889 hres = IHTMLElement_put_onclick(elem, v);
2890 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2892 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFormElement, (void**)&form);
2893 IHTMLElement_Release(elem);
2894 ok(hres == S_OK, "Could not get IHTMLFormElement iface: %08lx\n", hres);
2896 V_VT(&v) = VT_DISPATCH;
2897 V_DISPATCH(&v) = (IDispatch*)&form_onsubmit_obj;
2898 hres = IHTMLFormElement_put_onsubmit(form, v);
2899 ok(hres == S_OK, "put_onsubmit failed: %08lx\n", hres);
2901 IHTMLFormElement_Release(form);
2903 submit = get_elem_id(doc, L"submitid");
2905 hres = IHTMLElement_QueryInterface(submit, &IID_IHTMLInputElement, (void**)&input);
2906 ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres);
2908 hres = IHTMLInputElement_get_complete(input, &b);
2909 ok(hres == S_OK, "get_complete failed: %08lx\n", hres);
2910 ok(b == VARIANT_FALSE, "complete = %x\n", b);
2911 IHTMLInputElement_Release(input);
2913 SET_EXPECT(form_onclick);
2914 SET_EXPECT(form_onsubmit);
2915 hres = IHTMLElement_click(submit);
2916 ok(hres == S_OK, "click failed: %08lx\n", hres);
2917 CHECK_CALLED(form_onclick);
2918 CHECK_CALLED(form_onsubmit);
2920 V_VT(&v) = VT_DISPATCH;
2921 V_DISPATCH(&v) = (IDispatch*)&submit_onclick_obj;
2922 hres = IHTMLElement_put_onclick(submit, v);
2923 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2925 SET_EXPECT(form_onclick);
2926 SET_EXPECT(submit_onclick);
2927 hres = IHTMLElement_click(submit);
2928 ok(hres == S_OK, "click failed: %08lx\n", hres);
2929 CHECK_CALLED(form_onclick);
2930 CHECK_CALLED(submit_onclick);
2932 elem_attach_event((IUnknown*)submit, L"onclick", (IDispatch*)&submit_onclick_attached_obj);
2934 SET_EXPECT(form_onclick);
2935 SET_EXPECT(submit_onclick);
2936 SET_EXPECT(submit_onclick_attached);
2937 hres = IHTMLElement_click(submit);
2938 ok(hres == S_OK, "click failed: %08lx\n", hres);
2939 CHECK_CALLED(form_onclick);
2940 CHECK_CALLED(submit_onclick);
2941 CHECK_CALLED(submit_onclick_attached);
2943 V_VT(&v) = VT_NULL;
2944 hres = IHTMLElement_put_onclick(submit, v);
2945 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2947 SET_EXPECT(form_onclick);
2948 SET_EXPECT(submit_onclick_attached);
2949 hres = IHTMLElement_click(submit);
2950 ok(hres == S_OK, "click failed: %08lx\n", hres);
2951 CHECK_CALLED(form_onclick);
2952 CHECK_CALLED(submit_onclick_attached);
2954 elem_detach_event((IUnknown*)submit, L"onclick", (IDispatch*)&submit_onclick_attached_obj);
2956 cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_onclick_cancel_obj);
2958 SET_EXPECT(form_onclick);
2959 SET_EXPECT(doccp_onclick_cancel);
2960 hres = IHTMLElement_click(submit);
2961 ok(hres == S_OK, "click failed: %08lx\n", hres);
2962 CHECK_CALLED(form_onclick);
2963 CHECK_CALLED(doccp_onclick_cancel);
2965 unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, cp_cookie);
2967 V_VT(&v) = VT_DISPATCH;
2968 V_DISPATCH(&v) = (IDispatch*)&submit_onclick_setret_obj;
2969 hres = IHTMLElement_put_onclick(submit, v);
2970 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
2972 V_VT(&onclick_retval) = VT_BOOL;
2973 V_BOOL(&onclick_retval) = VARIANT_TRUE;
2974 V_VT(&onclick_event_retval) = VT_BOOL;
2975 V_BOOL(&onclick_event_retval) = VARIANT_TRUE;
2977 SET_EXPECT(submit_onclick_setret);
2978 SET_EXPECT(form_onclick);
2979 SET_EXPECT(form_onsubmit);
2980 hres = IHTMLElement_click(submit);
2981 ok(hres == S_OK, "click failed: %08lx\n", hres);
2982 CHECK_CALLED(submit_onclick_setret);
2983 CHECK_CALLED(form_onclick);
2984 CHECK_CALLED(form_onsubmit);
2986 V_VT(&onclick_event_retval) = VT_BOOL;
2987 V_BOOL(&onclick_event_retval) = VARIANT_FALSE;
2989 SET_EXPECT(submit_onclick_setret);
2990 SET_EXPECT(form_onclick);
2991 hres = IHTMLElement_click(submit);
2992 ok(hres == S_OK, "click failed: %08lx\n", hres);
2993 CHECK_CALLED(submit_onclick_setret);
2994 CHECK_CALLED(form_onclick);
2996 V_VT(&onclick_retval) = VT_BOOL;
2997 V_BOOL(&onclick_retval) = VARIANT_FALSE;
2998 V_VT(&onclick_event_retval) = VT_BOOL;
2999 V_BOOL(&onclick_event_retval) = VARIANT_TRUE;
3001 SET_EXPECT(submit_onclick_setret);
3002 SET_EXPECT(form_onclick);
3003 hres = IHTMLElement_click(submit);
3004 ok(hres == S_OK, "click failed: %08lx\n", hres);
3005 CHECK_CALLED(submit_onclick_setret);
3006 CHECK_CALLED(form_onclick);
3008 V_VT(&onclick_event_retval) = VT_BOOL;
3009 V_BOOL(&onclick_event_retval) = VARIANT_FALSE;
3011 SET_EXPECT(submit_onclick_setret);
3012 SET_EXPECT(form_onclick);
3013 hres = IHTMLElement_click(submit);
3014 ok(hres == S_OK, "click failed: %08lx\n", hres);
3015 CHECK_CALLED(submit_onclick_setret);
3016 CHECK_CALLED(form_onclick);
3018 elem_attach_event((IUnknown*)submit, L"onclick", (IDispatch*)&submit_onclick_attached_obj);
3019 elem_attach_event((IUnknown*)submit, L"onclick", (IDispatch*)&submit_onclick_attached_check_cancel_obj);
3021 V_VT(&v) = VT_DISPATCH;
3022 V_DISPATCH(&v) = (IDispatch*)&submit_onclick_cancel_obj;
3023 hres = IHTMLElement_put_onclick(submit, v);
3024 ok(hres == S_OK, "put_onclick failed: %08lx\n", hres);
3026 SET_EXPECT(submit_onclick_cancel);
3027 SET_EXPECT(submit_onclick_attached_check_cancel);
3028 SET_EXPECT(submit_onclick_attached);
3029 hres = IHTMLElement_click(submit);
3030 ok(hres == S_OK, "click failed: %08lx\n", hres);
3031 CHECK_CALLED(submit_onclick_cancel);
3032 CHECK_CALLED(submit_onclick_attached_check_cancel);
3033 CHECK_CALLED(submit_onclick_attached);
3035 if(1)pump_msgs(NULL);
3037 IHTMLElement_Release(submit);
3040 static void test_timeout(IHTMLDocument2 *doc)
3042 VARIANT expr, var, args[2];
3043 DISPPARAMS dp = { args, NULL, 2, 0 };
3044 IHTMLWindow3 *win3;
3045 IDispatch *disp;
3046 UINT argerr;
3047 LONG id;
3048 HRESULT hres;
3050 /* First try the IHTMLWindow2 DISPIDs via IDispatch, since they're not exposed */
3051 hres = IHTMLWindow2_QueryInterface(window, &IID_IDispatch, (void**)&disp);
3052 ok(hres == S_OK, "Could not get IDispatch iface: %08lx\n", hres);
3054 V_VT(&args[1]) = VT_BSTR;
3055 V_BSTR(&args[1]) = SysAllocString(L"");
3056 V_VT(&args[0]) = VT_I4;
3057 V_I4(&args[0]) = 1;
3058 V_VT(&var) = VT_EMPTY;
3059 hres = IDispatch_Invoke(disp, DISPID_IHTMLWINDOW2_SETINTERVAL, &IID_NULL, LOCALE_USER_DEFAULT,
3060 DISPATCH_METHOD, &dp, &var, NULL, &argerr);
3061 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke(DISPID_IHTMLWINDOW2_SETINTERVAL) returned: %08lx\n", hres);
3063 hres = IDispatch_Invoke(disp, DISPID_IHTMLWINDOW2_SETTIMEOUT, &IID_NULL, LOCALE_USER_DEFAULT,
3064 DISPATCH_METHOD, &dp, &var, NULL, &argerr);
3065 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke(DISPID_IHTMLWINDOW2_SETTIMEOUT) returned: %08lx\n", hres);
3066 SysFreeString(V_BSTR(&args[1]));
3067 IDispatch_Release(disp);
3069 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow3, (void**)&win3);
3070 ok(hres == S_OK, "Could not get IHTMLWindow3 iface: %08lx\n", hres);
3072 V_VT(&expr) = VT_DISPATCH;
3073 V_DISPATCH(&expr) = (IDispatch*)&timeoutFunc2;
3074 V_VT(&var) = VT_EMPTY;
3075 id = 0;
3076 hres = IHTMLWindow3_setInterval(win3, &expr, 1, &var, &id);
3077 ok(hres == S_OK, "setInterval failed: %08lx\n", hres);
3078 ok(id, "id = 0\n");
3080 hres = IHTMLWindow2_clearTimeout(window, id);
3081 ok(hres == S_OK, "clearTimeout failer: %08lx\n", hres);
3083 V_VT(&expr) = VT_DISPATCH;
3084 V_DISPATCH(&expr) = (IDispatch*)&timeoutFunc;
3085 V_VT(&var) = VT_EMPTY;
3086 id = 0;
3087 hres = IHTMLWindow3_setTimeout(win3, &expr, 0, &var, &id);
3088 ok(hres == S_OK, "setTimeout failed: %08lx\n", hres);
3089 ok(id, "id = 0\n");
3091 hres = IHTMLWindow2_clearTimeout(window, 0);
3092 ok(hres == S_OK, "clearTimeout failed: %08lx\n", hres);
3094 SET_EXPECT(timeout);
3095 pump_msgs(&called_timeout);
3096 CHECK_CALLED(timeout);
3098 V_VT(&expr) = VT_DISPATCH;
3099 V_DISPATCH(&expr) = (IDispatch*)&timeoutFunc;
3100 V_VT(&var) = VT_EMPTY;
3101 id = 0;
3102 hres = IHTMLWindow3_setTimeout(win3, &expr, 0, &var, &id);
3103 ok(hres == S_OK, "setTimeout failed: %08lx\n", hres);
3104 ok(id, "id = 0\n");
3106 hres = IHTMLWindow2_clearTimeout(window, id);
3107 ok(hres == S_OK, "clearTimeout failed: %08lx\n", hres);
3109 V_VT(&expr) = VT_DISPATCH;
3110 V_DISPATCH(&expr) = (IDispatch*)&timeoutFunc;
3111 V_VT(&var) = VT_EMPTY;
3112 id = 0;
3113 hres = IHTMLWindow3_setInterval(win3, &expr, 1, &var, &id);
3114 ok(hres == S_OK, "setInterval failed: %08lx\n", hres);
3115 ok(id, "id = 0\n");
3117 SET_EXPECT(timeout);
3118 pump_msgs(&called_timeout);
3119 CHECK_CALLED(timeout);
3121 SET_EXPECT(timeout);
3122 pump_msgs(&called_timeout);
3123 CHECK_CALLED(timeout);
3125 hres = IHTMLWindow2_clearInterval(window, 0);
3126 ok(hres == S_OK, "clearInterval failed: %08lx\n", hres);
3128 SET_EXPECT(timeout);
3129 pump_msgs(&called_timeout);
3130 CHECK_CALLED(timeout);
3132 hres = IHTMLWindow2_clearInterval(window, id);
3133 ok(hres == S_OK, "clearTimeout failer: %08lx\n", hres);
3135 IHTMLWindow3_Release(win3);
3138 static IHTMLWindow2 *get_iframe_window(IHTMLIFrameElement *iframe)
3140 IHTMLWindow2 *window;
3141 IHTMLFrameBase2 *base;
3142 HRESULT hres;
3144 hres = IHTMLIFrameElement_QueryInterface(iframe, &IID_IHTMLFrameBase2, (void**)&base);
3145 ok(hres == S_OK, "QueryInterface(IID_IHTMLFrameBase2) failed: %08lx\n", hres);
3147 hres = IHTMLFrameBase2_get_contentWindow(base, &window);
3148 ok(hres == S_OK, "get_contentWindow failed: %08lx\n", hres);
3149 ok(window != NULL, "window == NULL\n");
3151 IHTMLFrameBase2_Release(base);
3152 return window;
3155 static IHTMLDocument2 *get_iframe_doc(IHTMLIFrameElement *iframe)
3157 IHTMLDocument2 *result = NULL;
3158 IHTMLWindow2 *window;
3159 HRESULT hres;
3161 window = get_iframe_window(iframe);
3163 hres = IHTMLWindow2_get_document(window, &result);
3164 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
3165 ok(result != NULL, "result == NULL\n");
3167 IHTMLWindow2_Release(window);
3168 return result;
3171 static void test_iframe_connections(IHTMLDocument2 *doc)
3173 IHTMLIFrameElement *iframe;
3174 IHTMLDocument2 *iframes_doc;
3175 DWORD cookie;
3176 IConnectionPoint *cp;
3177 IHTMLElement *element;
3178 BSTR str;
3179 HRESULT hres;
3181 trace("iframe tests...\n");
3183 element = get_elem_id(doc, L"ifr");
3184 iframe = get_iframe_iface((IUnknown*)element);
3185 IHTMLElement_Release(element);
3187 iframes_doc = get_iframe_doc(iframe);
3188 IHTMLIFrameElement_Release(iframe);
3190 cookie = register_cp((IUnknown*)iframes_doc, &IID_IDispatch, (IUnknown*)&div_onclick_disp);
3192 cp = get_cp((IUnknown*)doc, &IID_IDispatch);
3193 hres = IConnectionPoint_Unadvise(cp, cookie);
3194 IConnectionPoint_Release(cp);
3195 ok(hres == CONNECT_E_NOCONNECTION, "Unadvise returned %08lx, expected CONNECT_E_NOCONNECTION\n", hres);
3197 unregister_cp((IUnknown*)iframes_doc, &IID_IDispatch, cookie);
3199 if(is_ie9plus) {
3200 IHTMLFrameBase2 *frame_base2;
3201 VARIANT v;
3203 hres = IHTMLIFrameElement_QueryInterface(iframe, &IID_IHTMLFrameBase2, (void**)&frame_base2);
3204 ok(hres == S_OK, "Could not get IHTMLFrameBase2 iface: %08lx\n", hres);
3206 V_VT(&v) = VT_DISPATCH;
3207 V_DISPATCH(&v) = (IDispatch*)&iframe_onload_obj;
3208 hres = IHTMLFrameBase2_put_onload(frame_base2, v);
3209 ok(hres == S_OK, "put_onload failed: %08lx\n", hres);
3211 IHTMLFrameBase2_Release(frame_base2);
3213 str = SysAllocString(L"about:blank");
3214 hres = IHTMLDocument2_put_URL(iframes_doc, str);
3215 ok(hres == S_OK, "put_URL failed: %08lx\n", hres);
3216 SysFreeString(str);
3218 SET_EXPECT(iframe_onload);
3219 pump_msgs(&called_iframe_onload);
3220 CHECK_CALLED(iframe_onload);
3222 str = SysAllocString(L"about:test");
3223 hres = IHTMLDocument2_put_URL(iframes_doc, str);
3224 ok(hres == S_OK, "put_URL failed: %08lx\n", hres);
3225 SysFreeString(str);
3227 SET_EXPECT(iframe_onload);
3228 pump_msgs(&called_iframe_onload);
3229 CHECK_CALLED(iframe_onload);
3230 }else {
3231 win_skip("Skipping iframe onload tests on IE older than 9.\n");
3234 IHTMLDocument2_Release(iframes_doc);
3237 static void test_doc_obj(IHTMLDocument2 *doc)
3239 static DISPID propput_dispid = DISPID_PROPERTYPUT;
3240 DISPID dispid, import_node_id, has_own_prop_id;
3241 IHTMLOptionElementFactory *option, *option2;
3242 IHTMLImageElementFactory *image, *image2;
3243 IHTMLXMLHttpRequestFactory *xhr, *xhr2;
3244 IHTMLDocument2 *doc_node, *doc_node2;
3245 IOmNavigator *navigator, *navigator2;
3246 IHTMLLocation *location, *location2;
3247 int orig_doc_mode = document_mode;
3248 IHTMLStorage *storage, *storage2;
3249 IHTMLPerformance *perf, *perf2;
3250 IOmHistory *history, *history2;
3251 IHTMLScreen *screen, *screen2;
3252 IEventTarget *event_target;
3253 DISPPARAMS dp = { 0 };
3254 IHTMLWindow7 *window7;
3255 IHTMLWindow6 *window6;
3256 IHTMLWindow5 *window5;
3257 IDispatchEx *dispex;
3258 IHTMLElement *body;
3259 VARIANT res, arg;
3260 HRESULT hres;
3261 BSTR bstr;
3263 event_target = (void*)0xdeadbeef;
3264 hres = IHTMLDocument2_QueryInterface(doc, &IID_IEventTarget, (void**)&event_target);
3265 if(document_mode < 9) {
3266 ok(hres == E_NOINTERFACE, "hres = %08lx, expected E_NOINTERFACE\n", hres);
3267 ok(!event_target, "event_target != NULL\n");
3268 }else {
3269 IHTMLDocument2 *tmp;
3271 ok(hres == S_OK, "hres = %08lx, expected S_OK\n", hres);
3272 ok(!!event_target, "event_target = NULL\n");
3274 bstr = SysAllocString(L"click");
3275 hres = IEventTarget_addEventListener(event_target, bstr, (IDispatch*)&docobj_onclick_obj, TRUE);
3276 ok(hres == S_OK, "addEventListener failed: %08lx\n", hres);
3277 SysFreeString(bstr);
3279 hres = IEventTarget_QueryInterface(event_target, &IID_IHTMLDocument2, (void**)&tmp);
3280 ok(hres == S_OK, "Could not get IHTMLDocument2: %08lx\n", hres);
3281 IEventTarget_Release(event_target);
3283 ok(doc == tmp, "IHTMLDocument2 from IEventTarget not same as original\n");
3284 IHTMLDocument2_Release(tmp);
3286 body = doc_get_body(doc);
3287 SET_EXPECT(docobj_onclick);
3288 hres = IHTMLElement_click(body);
3289 ok(hres == S_OK, "click failed: %08lx\n", hres);
3290 IHTMLElement_Release(body);
3292 pump_msgs(&called_docobj_onclick);
3293 CHECK_CALLED(docobj_onclick);
3296 bstr = NULL;
3297 hres = IHTMLDocument2_toString(doc, &bstr);
3298 ok(hres == S_OK, "toString failed: %08lx\n", hres);
3299 todo_wine_if(document_mode >= 9)
3300 ok(!wcscmp(bstr, (document_mode < 9 ? L"[object]" : L"[object Document]")), "toString returned %s\n", wine_dbgstr_w(bstr));
3301 SysFreeString(bstr);
3303 /* IHTMLDocument6 prop */
3304 bstr = SysAllocString(L"onstoragecommit");
3305 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &bstr, 1, 0, &dispid);
3306 ok(hres == S_OK, "GetIDsOfNames(onstoragecommit) returned: %08lx\n", hres);
3307 SysFreeString(bstr);
3309 /* IHTMLDocument7 method */
3310 bstr = SysAllocString(L"importNode");
3311 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &bstr, 1, 0, &dispid);
3312 ok(hres == (document_mode < 9 ? DISP_E_UNKNOWNNAME : S_OK), "GetIDsOfNames(importNode) returned: %08lx\n", hres);
3314 hres = IHTMLDocument2_QueryInterface(doc, &IID_IDispatchEx, (void**)&dispex);
3315 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
3317 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameEnsure, &import_node_id);
3318 ok(hres == S_OK, "GetDispID(importNode) returned: %08lx\n", hres);
3319 if(document_mode >= 9)
3320 ok(import_node_id == dispid, "GetDispID(importNode) != GetIDsOfNames(importNode)\n");
3321 IDispatchEx_Release(dispex);
3322 SysFreeString(bstr);
3324 /* prop set via script on node */
3325 bstr = SysAllocString(L"prop");
3326 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &bstr, 1, 0, &dispid);
3327 ok(hres == S_OK, "GetIDsOfNames(prop) returned: %08lx\n", hres);
3328 SysFreeString(bstr);
3330 hres = IHTMLDocument2_Invoke(doc, dispid, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &res, NULL, NULL);
3331 ok(hres == S_OK, "Invoke(prop) failed: %08lx\n", hres);
3332 ok(V_VT(&res) == VT_I4, "VT(prop) = %d\n", V_VT(&res));
3333 ok(V_I4(&res) == 137, "prop = %ld\n", V_I4(&res));
3335 /* jscript prop on prototype chain */
3336 bstr = SysAllocString(L"hasOwnProperty");
3337 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &bstr, 1, 0, &has_own_prop_id);
3338 todo_wine_if(document_mode >= 9)
3339 ok(hres == (document_mode < 9 ? DISP_E_UNKNOWNNAME : S_OK), "GetIDsOfNames(hasOwnProperty) returned: %08lx\n", hres);
3340 SysFreeString(bstr);
3342 if(hres == S_OK) {
3343 dp.cArgs = 1;
3344 dp.rgvarg = &arg;
3345 V_VT(&arg) = VT_BSTR;
3346 V_BSTR(&arg) = SysAllocString(L"createElement");
3347 hres = IHTMLDocument2_Invoke(doc, has_own_prop_id, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, NULL, NULL);
3348 ok(hres == S_OK, "Invoke(hasOwnProperty(\"createElement\")) failed: %08lx\n", hres);
3349 ok(V_VT(&res) == VT_BOOL, "VT = %d\n", V_VT(&res));
3350 todo_wine
3351 ok(V_BOOL(&res) == VARIANT_FALSE, "hasOwnProperty(\"createElement\") = %d\n", V_BOOL(&res));
3353 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &V_BSTR(&arg), 1, 0, &dispid);
3354 ok(hres == S_OK, "GetIDsOfNames(createElement) returned: %08lx\n", hres);
3355 SysFreeString(V_BSTR(&arg));
3357 V_BSTR(&arg) = SysAllocString(L"prop");
3358 hres = IHTMLDocument2_Invoke(doc, has_own_prop_id, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, NULL, NULL);
3359 ok(hres == S_OK, "Invoke(hasOwnProperty(\"prop\")) failed: %08lx\n", hres);
3360 ok(V_VT(&res) == VT_BOOL, "VT = %d\n", V_VT(&res));
3361 ok(V_BOOL(&res) == VARIANT_TRUE, "hasOwnProperty(\"prop\") = %d\n", V_BOOL(&res));
3362 SysFreeString(V_BSTR(&arg));
3365 /* test window props during navigation */
3366 hres = IHTMLWindow2_get_document(window, &doc_node);
3367 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
3369 hres = IHTMLWindow2_get_location(window, &location);
3370 ok(hres == S_OK, "get_location failed: %08lx\n", hres);
3372 hres = IHTMLWindow2_get_navigator(window, &navigator);
3373 ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
3375 hres = IHTMLWindow2_get_history(window, &history);
3376 ok(hres == S_OK, "get_history failed: %08lx\n", hres);
3378 hres = IHTMLWindow2_get_screen(window, &screen);
3379 ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
3381 hres = IHTMLWindow2_get_Image(window, &image);
3382 ok(hres == S_OK, "get_image failed: %08lx\n", hres);
3384 hres = IHTMLWindow2_get_Option(window, &option);
3385 ok(hres == S_OK, "get_option failed: %08lx\n", hres);
3387 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
3388 ok(hres == S_OK, "Could not get IHTMLWindow5: %08lx\n", hres);
3389 hres = IHTMLWindow5_get_XMLHttpRequest(window5, &res);
3390 ok(hres == S_OK, "get_XMLHttpRequest failed: %08lx\n", hres);
3391 ok(V_VT(&res) == VT_DISPATCH, "V_VT(XMLHttpRequest) = %d\n", V_VT(&res));
3392 hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLXMLHttpRequestFactory, (void**)&xhr);
3393 ok(hres == S_OK, "Could not get IHTMLXMLHttpRequestFactory: %08lx\n", hres);
3394 IHTMLWindow5_Release(window5);
3395 VariantClear(&res);
3397 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
3398 ok(hres == S_OK, "Could not get IHTMLWindow6: %08lx\n", hres);
3399 hres = IHTMLWindow6_get_sessionStorage(window6, &storage);
3400 ok(hres == S_OK, "get_sessionStorage failed: %08lx\n", hres);
3401 IHTMLWindow6_Release(window6);
3403 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
3404 ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
3405 hres = IHTMLWindow7_get_performance(window7, &res);
3406 ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
3407 ok(V_VT(&res) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&res));
3408 hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLPerformance, (void**)&perf);
3409 ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
3410 IHTMLWindow7_Release(window7);
3411 VariantClear(&res);
3413 /* Add props to location, since it gets lost on navigation, despite being same object */
3414 bstr = SysAllocString(L"wineTestProp");
3415 hres = IHTMLLocation_QueryInterface(location, &IID_IDispatchEx, (void**)&dispex);
3416 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
3417 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameEnsure, &dispid);
3418 ok(hres == S_OK, "GetDispID(wineTestProp) returned: %08lx\n", hres);
3419 SysFreeString(bstr);
3421 dp.cArgs = dp.cNamedArgs = 1;
3422 dp.rgdispidNamedArgs = &propput_dispid;
3423 dp.rgvarg = &arg;
3424 V_VT(&arg) = VT_I4;
3425 V_I4(&arg) = 42;
3426 bstr = SysAllocString(L"reload");
3427 hres = IDispatchEx_GetDispID(dispex, bstr, 0, &dispid);
3428 ok(hres == S_OK, "GetDispID(reload) returned: %08lx\n", hres);
3429 hres = IDispatchEx_InvokeEx(dispex, dispid, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3430 todo_wine_if(document_mode < 9)
3431 ok(hres == (document_mode < 9 ? E_NOTIMPL : S_OK), "InvokeEx returned: %08lx\n", hres);
3432 IDispatchEx_Release(dispex);
3433 SysFreeString(bstr);
3435 /* Navigate to a different document mode page, checking using the same doc obj.
3436 Test that it breaks COM rules, since IEventTarget is conditionally exposed.
3437 All the events registered on the old doc node are also removed.
3439 DISPIDs are forwarded to the node, and thus it also breaks Dispatch rules,
3440 where the same name will potentially receive a different DISPID. */
3441 navigate(doc, document_mode < 9 ? L"doc_with_prop_ie9.html" : L"doc_with_prop.html");
3442 ok(document_mode == (orig_doc_mode < 9 ? 9 : 5), "new document_mode = %d\n", document_mode);
3444 event_target = (void*)0xdeadbeef;
3445 hres = IHTMLDocument2_QueryInterface(doc, &IID_IEventTarget, (void**)&event_target);
3446 if(document_mode < 9) {
3447 ok(hres == E_NOINTERFACE, "hres = %08lx, expected E_NOINTERFACE\n", hres);
3448 ok(!event_target, "event_target != NULL\n");
3450 body = doc_get_body(doc);
3451 hres = IHTMLElement_click(body);
3452 ok(hres == S_OK, "click failed: %08lx\n", hres);
3453 IHTMLElement_Release(body);
3454 pump_msgs(NULL);
3456 hres = IHTMLDocument2_QueryInterface(doc, &IID_IDispatchEx, (void**)&dispex);
3457 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
3459 bstr = SysAllocString(L"importNode");
3460 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameEnsure, &dispid);
3461 ok(hres == S_OK, "GetDispID(importNode) returned: %08lx\n", hres);
3462 ok(dispid != import_node_id, "importNode on new doc node == old importNode\n");
3463 IDispatchEx_Release(dispex);
3464 SysFreeString(bstr);
3465 }else {
3466 ok(hres == S_OK, "hres = %08lx, expected S_OK\n", hres);
3467 ok(!!event_target, "event_target = NULL\n");
3468 IEventTarget_Release(event_target);
3470 bstr = SysAllocString(L"importNode");
3471 hres = IHTMLDocument2_GetIDsOfNames(doc, &IID_NULL, &bstr, 1, 0, &dispid);
3472 ok(hres == S_OK, "GetIDsOfNames(importNode) returned: %08lx\n", hres);
3473 ok(dispid != import_node_id, "importNode on new doc node == old created importNode\n");
3476 hres = IHTMLWindow2_get_document(window, &doc_node2);
3477 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
3478 ok(doc_node != doc_node2, "doc_node == doc_node2\n");
3479 IHTMLDocument2_Release(doc_node2);
3480 IHTMLDocument2_Release(doc_node);
3482 hres = IHTMLWindow2_get_location(window, &location2);
3483 ok(hres == S_OK, "get_location failed: %08lx\n", hres);
3484 ok(location == location2, "location != location2\n");
3486 bstr = SysAllocString(L"wineTestProp");
3487 hres = IHTMLLocation_GetIDsOfNames(location2, &IID_NULL, &bstr, 1, 0, &dispid);
3488 ok(hres == DISP_E_UNKNOWNNAME, "GetIDsOfNames(wineTestProp) returned: %08lx\n", hres);
3489 SysFreeString(bstr);
3491 memset(&dp, 0, sizeof(dp));
3492 bstr = SysAllocString(L"reload");
3493 hres = IHTMLLocation_GetIDsOfNames(location2, &IID_NULL, &bstr, 1, 0, &dispid);
3494 ok(hres == S_OK, "GetIDsOfNames(reload) returned: %08lx\n", hres);
3495 hres = IHTMLLocation_Invoke(location2, dispid, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &res, NULL, NULL);
3496 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3497 ok(V_VT(&res) == VT_DISPATCH, "VT = %d\n", V_VT(&res));
3498 IHTMLLocation_Release(location2);
3499 IHTMLLocation_Release(location);
3500 SysFreeString(bstr);
3501 VariantClear(&res);
3503 hres = IHTMLWindow2_get_navigator(window, &navigator2);
3504 ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
3505 ok(navigator != navigator2, "navigator == navigator2\n");
3506 IOmNavigator_Release(navigator2);
3507 IOmNavigator_Release(navigator);
3509 hres = IHTMLWindow2_get_history(window, &history2);
3510 ok(hres == S_OK, "get_history failed: %08lx\n", hres);
3511 ok(history != history2, "history == history2\n");
3512 IOmHistory_Release(history2);
3513 IOmHistory_Release(history);
3515 hres = IHTMLWindow2_get_screen(window, &screen2);
3516 ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
3517 ok(screen != screen2, "screen == screen2\n");
3518 IHTMLScreen_Release(screen2);
3519 IHTMLScreen_Release(screen);
3521 hres = IHTMLWindow2_get_Image(window, &image2);
3522 ok(hres == S_OK, "get_image failed: %08lx\n", hres);
3523 ok(image != image2, "image == image2\n");
3524 IHTMLImageElementFactory_Release(image2);
3525 IHTMLImageElementFactory_Release(image);
3527 hres = IHTMLWindow2_get_Option(window, &option2);
3528 ok(hres == S_OK, "get_option failed: %08lx\n", hres);
3529 ok(option != option2, "option == option2\n");
3530 IHTMLOptionElementFactory_Release(option2);
3531 IHTMLOptionElementFactory_Release(option);
3533 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
3534 ok(hres == S_OK, "Could not get IHTMLWindow5: %08lx\n", hres);
3535 hres = IHTMLWindow5_get_XMLHttpRequest(window5, &res);
3536 ok(hres == S_OK, "get_XMLHttpRequest failed: %08lx\n", hres);
3537 ok(V_VT(&res) == VT_DISPATCH, "V_VT(XMLHttpRequest) = %d\n", V_VT(&res));
3538 hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLXMLHttpRequestFactory, (void**)&xhr2);
3539 ok(hres == S_OK, "Could not get IHTMLXMLHttpRequestFactory: %08lx\n", hres);
3540 ok(xhr != xhr2, "xhr == xhr2\n");
3541 IHTMLXMLHttpRequestFactory_Release(xhr2);
3542 IHTMLXMLHttpRequestFactory_Release(xhr);
3543 IHTMLWindow5_Release(window5);
3544 VariantClear(&res);
3546 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
3547 ok(hres == S_OK, "Could not get IHTMLWindow6: %08lx\n", hres);
3548 hres = IHTMLWindow6_get_sessionStorage(window6, &storage2);
3549 ok(hres == S_OK, "get_sessionStorage failed: %08lx\n", hres);
3550 ok(storage != storage2, "storage == storage2\n");
3551 IHTMLStorage_Release(storage2);
3552 IHTMLStorage_Release(storage);
3553 IHTMLWindow6_Release(window6);
3555 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
3556 ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
3557 hres = IHTMLWindow7_get_performance(window7, &res);
3558 ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
3559 ok(V_VT(&res) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&res));
3560 hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLPerformance, (void**)&perf2);
3561 ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
3562 ok(perf != perf2, "perf == perf2\n");
3563 IHTMLPerformance_Release(perf2);
3564 IHTMLPerformance_Release(perf);
3565 IHTMLWindow7_Release(window7);
3566 VariantClear(&res);
3569 static void test_create_event(IHTMLDocument2 *doc)
3571 IDOMKeyboardEvent *keyboard_event;
3572 IDOMCustomEvent *custom_event;
3573 IDOMMouseEvent *mouse_event;
3574 IDocumentEvent *doc_event;
3575 IEventTarget *event_target;
3576 IDOMUIEvent *ui_event;
3577 IHTMLElement *elem;
3578 IDOMEvent *event;
3579 VARIANT_BOOL b;
3580 USHORT phase;
3581 BSTR str;
3582 HRESULT hres;
3584 trace("createEvent tests...\n");
3586 hres = IHTMLDocument2_QueryInterface(doc, &IID_IDocumentEvent, (void**)&doc_event);
3587 ok(hres == S_OK, "Could not get IDocumentEvent iface: %08lx\n", hres);
3589 str = SysAllocString(L"Event");
3590 hres = IDocumentEvent_createEvent(doc_event, str, &event);
3591 SysFreeString(str);
3592 ok(hres == S_OK, "createEvent failed: %08lx\n", hres);
3594 phase = 0xdead;
3595 hres = IDOMEvent_get_eventPhase(event, &phase);
3596 ok(hres == S_OK, "get_eventPhase failed: %08lx\n", hres);
3597 ok(!phase, "phase = %u\n", phase);
3599 hres = IDOMEvent_preventDefault(event);
3600 ok(hres == S_OK, "preventDefault failed: %08lx\n", hres);
3602 hres = IDOMEvent_stopPropagation(event);
3603 ok(hres == S_OK, "stopPropagation failed: %08lx\n", hres);
3605 str = (void*)0xdeadbeef;
3606 hres = IDOMEvent_get_type(event, &str);
3607 ok(hres == S_OK, "get_type failed: %08lx\n", hres);
3608 ok(!str, "type = %s\n", wine_dbgstr_w(str));
3610 b = 0xdead;
3611 hres = IDOMEvent_get_bubbles(event, &b);
3612 ok(hres == S_OK, "get_bubbles failed: %08lx\n", hres);
3613 ok(!b, "bubbles = %x\n", b);
3615 b = 0xdead;
3616 hres = IDOMEvent_get_cancelable(event, &b);
3617 ok(hres == S_OK, "get_cancelable failed: %08lx\n", hres);
3618 ok(!b, "cancelable = %x\n", b);
3620 elem = doc_get_body(doc);
3621 hres = IHTMLElement_QueryInterface(elem, &IID_IEventTarget, (void**)&event_target);
3622 IHTMLElement_Release(elem);
3624 hres = IEventTarget_dispatchEvent(event_target, NULL, &b);
3625 ok(hres == E_INVALIDARG, "dispatchEvent failed: %08lx\n", hres);
3627 IEventTarget_Release(event_target);
3629 hres = IDOMEvent_QueryInterface(event, &IID_IDOMUIEvent, (void**)&ui_event);
3630 ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDOMUIEvent returned %08lx\n", hres);
3631 hres = IDOMEvent_QueryInterface(event, &IID_IDOMMouseEvent, (void**)&mouse_event);
3632 ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDOMMouseEvent returned %08lx\n", hres);
3634 IDOMEvent_Release(event);
3636 str = SysAllocString(L"MouseEvent");
3637 hres = IDocumentEvent_createEvent(doc_event, str, &event);
3638 SysFreeString(str);
3639 ok(hres == S_OK, "createEvent failed: %08lx\n", hres);
3641 hres = IDOMEvent_QueryInterface(event, &IID_IDOMUIEvent, (void**)&ui_event);
3642 ok(hres == S_OK, "QueryInterface(IID_IDOMUIEvent returned %08lx\n", hres);
3643 IDOMUIEvent_Release(ui_event);
3644 hres = IDOMEvent_QueryInterface(event, &IID_IDOMMouseEvent, (void**)&mouse_event);
3645 ok(hres == S_OK, "QueryInterface(IID_IDOMMouseEvent returned %08lx\n", hres);
3646 IDOMMouseEvent_Release(mouse_event);
3648 IDOMEvent_Release(event);
3650 str = SysAllocString(L"UIEvent");
3651 hres = IDocumentEvent_createEvent(doc_event, str, &event);
3652 SysFreeString(str);
3653 ok(hres == S_OK, "createEvent failed: %08lx\n", hres);
3655 hres = IDOMEvent_QueryInterface(event, &IID_IDOMUIEvent, (void**)&ui_event);
3656 ok(hres == S_OK, "QueryInterface(IID_IDOMUIEvent returned %08lx\n", hres);
3657 IDOMUIEvent_Release(ui_event);
3658 hres = IDOMEvent_QueryInterface(event, &IID_IDOMMouseEvent, (void**)&mouse_event);
3659 ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDOMMouseEvent returned %08lx\n", hres);
3661 IDOMEvent_Release(event);
3663 str = SysAllocString(L"KeyboardEvent");
3664 hres = IDocumentEvent_createEvent(doc_event, str, &event);
3665 SysFreeString(str);
3666 ok(hres == S_OK, "createEvent failed: %08lx\n", hres);
3668 hres = IDOMEvent_QueryInterface(event, &IID_IDOMUIEvent, (void**)&ui_event);
3669 ok(hres == S_OK, "QueryInterface(IID_IDOMUIEvent returned %08lx\n", hres);
3670 IDOMUIEvent_Release(ui_event);
3671 hres = IDOMEvent_QueryInterface(event, &IID_IDOMKeyboardEvent, (void**)&keyboard_event);
3672 ok(hres == S_OK, "QueryInterface(IID_IDOMKeyboardEvent returned %08lx\n", hres);
3673 IDOMKeyboardEvent_Release(keyboard_event);
3675 IDOMEvent_Release(event);
3677 str = SysAllocString(L"CustomEvent");
3678 hres = IDocumentEvent_createEvent(doc_event, str, &event);
3679 SysFreeString(str);
3680 ok(hres == S_OK, "createEvent failed: %08lx\n", hres);
3682 hres = IDOMEvent_QueryInterface(event, &IID_IDOMCustomEvent, (void**)&custom_event);
3683 ok(hres == S_OK, "QueryInterface(IID_IDOMCustomEvent returned %08lx\n", hres);
3684 IDOMCustomEvent_Release(custom_event);
3686 IDOMEvent_Release(event);
3688 IDocumentEvent_Release(doc_event);
3691 static unsigned onstorage_expect_line;
3692 static const WCHAR *onstorage_expect_key, *onstorage_expect_old_value, *onstorage_expect_new_value;
3694 #define set_onstorage_expect(a,b,c) _set_onstorage_expect(__LINE__,a,b,c)
3695 static void _set_onstorage_expect(unsigned line, const WCHAR *key, const WCHAR *old_value, const WCHAR *new_value)
3697 onstorage_expect_line = line;
3698 onstorage_expect_key = key;
3699 onstorage_expect_old_value = old_value;
3700 onstorage_expect_new_value = new_value;
3703 static void test_storage_event(DISPPARAMS *params, BOOL doc_onstorage)
3705 const WCHAR *expect_key = onstorage_expect_key, *expect_old_value = onstorage_expect_old_value, *expect_new_value = onstorage_expect_new_value;
3706 unsigned line = onstorage_expect_line;
3707 IHTMLEventObj *event_obj;
3708 IDOMStorageEvent *event;
3709 IDispatchEx *dispex;
3710 HRESULT hres;
3711 unsigned i;
3712 DISPID id;
3713 BSTR bstr;
3715 if(document_mode < 9) {
3716 ok_(__FILE__,line)(params->cArgs == 1, "cArgs = %u\n", params->cArgs);
3717 ok_(__FILE__,line)(V_VT(&params->rgvarg[0]) == VT_DISPATCH, "V_VT(this) = %d\n", V_VT(&params->rgvarg[0]));
3718 return;
3721 ok_(__FILE__,line)(params->cArgs == 2, "cArgs = %u\n", params->cArgs);
3722 ok_(__FILE__,line)(V_VT(&params->rgvarg[1]) == VT_DISPATCH, "V_VT(event) = %d\n", V_VT(&params->rgvarg[1]));
3723 hres = IDispatch_QueryInterface(V_DISPATCH(&params->rgvarg[1]), &IID_IDispatchEx, (void**)&dispex);
3724 ok_(__FILE__,line)(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
3726 hres = IDispatchEx_QueryInterface(dispex, &IID_IDOMStorageEvent, (void**)&event);
3727 if(doc_onstorage) {
3728 static const WCHAR *props[] = { L"key", L"oldValue", L"newValue", L"storageArea" };
3729 ok_(__FILE__,line)(hres != S_OK, "Got IDOMStorageEvent in document.onstorage handler\n");
3731 hres = IDispatchEx_QueryInterface(dispex, &IID_IHTMLEventObj, (void**)&event_obj);
3732 ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLEventObj: %08lx\n", hres);
3733 IHTMLEventObj_Release(event_obj);
3735 for(i = 0; i < ARRAY_SIZE(props); i++) {
3736 bstr = SysAllocString(props[i]);
3737 hres = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
3738 ok_(__FILE__,line)(hres == DISP_E_UNKNOWNNAME, "GetDispID(%s) failed: %08lx\n", wine_dbgstr_w(bstr), hres);
3739 SysFreeString(bstr);
3742 IDispatchEx_Release(dispex);
3743 return;
3746 ok_(__FILE__,line)(hres == S_OK, "Could not get IDOMStorageEvent: %08lx\n", hres);
3747 IDispatchEx_Release(dispex);
3749 hres = IDOMStorageEvent_get_key(event, &bstr);
3750 ok_(__FILE__,line)(hres == S_OK, "get_key failed: %08lx\n", hres);
3751 ok_(__FILE__,line)((!bstr || !expect_key) ? (bstr == expect_key) : !wcscmp(bstr, expect_key),
3752 "key = %s\n", wine_dbgstr_w(bstr));
3753 SysFreeString(bstr);
3755 hres = IDOMStorageEvent_get_oldValue(event, &bstr);
3756 ok_(__FILE__,line)(hres == S_OK, "get_oldValue failed: %08lx\n", hres);
3757 ok_(__FILE__,line)((!bstr || !expect_old_value) ? (bstr == expect_old_value) : !wcscmp(bstr, expect_old_value),
3758 "oldValue = %s\n", wine_dbgstr_w(bstr));
3759 SysFreeString(bstr);
3761 hres = IDOMStorageEvent_get_newValue(event, &bstr);
3762 ok_(__FILE__,line)(hres == S_OK, "get_newValue failed: %08lx\n", hres);
3763 ok_(__FILE__,line)((!bstr || !expect_new_value) ? (bstr == expect_new_value) : !wcscmp(bstr, expect_new_value),
3764 "newValue = %s\n", wine_dbgstr_w(bstr));
3765 SysFreeString(bstr);
3767 hres = IDOMStorageEvent_get_url(event, &bstr);
3768 ok_(__FILE__,line)(hres == S_OK, "get_url failed: %08lx\n", hres);
3769 ok_(__FILE__,line)(!wcscmp(bstr, L"http://winetest.example.org/"), "url = %s\n", wine_dbgstr_w(bstr));
3770 SysFreeString(bstr);
3772 IDOMStorageEvent_Release(event);
3775 static HRESULT WINAPI doc1_onstorage(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3776 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3778 CHECK_EXPECT(doc1_onstorage);
3779 test_storage_event(pdp, TRUE);
3780 return S_OK;
3783 EVENT_HANDLER_FUNC_OBJ(doc1_onstorage);
3785 static HRESULT WINAPI doc1_onstoragecommit(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3786 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3788 CHECK_EXPECT(doc1_onstoragecommit);
3789 test_storage_event(pdp, FALSE);
3790 return S_OK;
3793 EVENT_HANDLER_FUNC_OBJ(doc1_onstoragecommit);
3795 static HRESULT WINAPI window1_onstorage(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3796 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3798 CHECK_EXPECT(window1_onstorage);
3799 test_storage_event(pdp, FALSE);
3800 return S_OK;
3803 EVENT_HANDLER_FUNC_OBJ(window1_onstorage);
3805 static HRESULT WINAPI doc2_onstorage(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3806 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3808 CHECK_EXPECT(doc2_onstorage);
3809 test_storage_event(pdp, TRUE);
3810 return S_OK;
3813 EVENT_HANDLER_FUNC_OBJ(doc2_onstorage);
3815 static HRESULT WINAPI doc2_onstoragecommit(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3816 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3818 CHECK_EXPECT(doc2_onstoragecommit);
3819 test_storage_event(pdp, FALSE);
3820 return S_OK;
3823 EVENT_HANDLER_FUNC_OBJ(doc2_onstoragecommit);
3825 static HRESULT WINAPI window2_onstorage(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3826 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3828 CHECK_EXPECT(window2_onstorage);
3829 test_storage_event(pdp, FALSE);
3830 return S_OK;
3833 EVENT_HANDLER_FUNC_OBJ(window2_onstorage);
3835 static HRESULT WINAPI async_xhr(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3836 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3838 IHTMLXMLHttpRequest *xhr;
3839 LONG ready_state;
3840 HRESULT hres;
3842 ok(pdp != NULL, "pdp == NULL\n");
3843 ok(pdp->cArgs == (document_mode < 9 ? 1 : 2), "pdp->cArgs = %d\n", pdp->cArgs);
3844 ok(pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
3845 ok(pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
3846 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(this) = %d\n", V_VT(pdp->rgvarg));
3847 ok(V_DISPATCH(pdp->rgvarg) != NULL, "V_DISPATCH(this) == NULL\n");
3849 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IHTMLXMLHttpRequest, (void**)&xhr);
3850 ok(hres == S_OK, "Could not get IHTMLXMLHttpRequest: %08lx\n", hres);
3852 hres = IHTMLXMLHttpRequest_get_readyState(xhr, &ready_state);
3853 if(SUCCEEDED(hres) && ready_state == 4)
3854 CHECK_EXPECT(async_xhr_done);
3856 IHTMLXMLHttpRequest_Release(xhr);
3857 return S_OK;
3860 EVENT_HANDLER_FUNC_OBJ(async_xhr);
3862 static HRESULT WINAPI sync_xhr(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
3863 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
3865 IHTMLXMLHttpRequest *xhr;
3866 LONG ready_state;
3867 HRESULT hres;
3869 ok(pdp != NULL, "pdp == NULL\n");
3870 ok(pdp->cArgs == (document_mode < 9 ? 1 : 2), "pdp->cArgs = %d\n", pdp->cArgs);
3871 ok(pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
3872 ok(pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
3873 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(this) = %d\n", V_VT(pdp->rgvarg));
3874 ok(V_DISPATCH(pdp->rgvarg) != NULL, "V_DISPATCH(this) == NULL\n");
3876 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IHTMLXMLHttpRequest, (void**)&xhr);
3877 ok(hres == S_OK, "Could not get IHTMLXMLHttpRequest: %08lx\n", hres);
3879 hres = IHTMLXMLHttpRequest_get_readyState(xhr, &ready_state);
3880 if(SUCCEEDED(hres) && ready_state == 4)
3881 CHECK_EXPECT(sync_xhr_done);
3883 IHTMLXMLHttpRequest_Release(xhr);
3884 return S_OK;
3887 EVENT_HANDLER_FUNC_OBJ(sync_xhr);
3889 static HRESULT QueryInterface(REFIID,void**);
3890 static HRESULT browserservice_qi(REFIID,void**);
3891 static HRESULT wb_qi(REFIID,void**);
3893 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
3895 return E_NOINTERFACE;
3898 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
3900 return 2;
3903 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
3905 return 1;
3908 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
3910 return E_NOTIMPL;
3913 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
3915 return E_NOTIMPL;
3918 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
3920 return E_NOTIMPL;
3923 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
3924 LPCBORDERWIDTHS pborderwidths)
3926 return E_NOTIMPL;
3929 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
3930 LPCBORDERWIDTHS pborderwidths)
3932 return S_OK;
3935 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
3936 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
3938 return S_OK;
3941 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
3942 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
3944 return S_OK;
3947 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
3948 LPOLEMENUGROUPWIDTHS lpMenuWidths)
3950 return E_NOTIMPL;
3953 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
3954 HOLEMENU holemenu, HWND hwndActiveObject)
3956 ok(0, "unexpected call\n");
3957 return E_NOTIMPL;
3960 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
3962 ok(0, "unexpected call\n");
3963 return E_NOTIMPL;
3966 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
3968 return S_OK;
3971 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
3973 return E_NOTIMPL;
3976 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
3978 ok(0, "unexpected call\n");
3979 return E_NOTIMPL;
3982 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
3983 InPlaceFrame_QueryInterface,
3984 InPlaceFrame_AddRef,
3985 InPlaceFrame_Release,
3986 InPlaceFrame_GetWindow,
3987 InPlaceFrame_ContextSensitiveHelp,
3988 InPlaceFrame_GetBorder,
3989 InPlaceFrame_RequestBorderSpace,
3990 InPlaceFrame_SetBorderSpace,
3991 InPlaceFrame_SetActiveObject,
3992 InPlaceFrame_InsertMenus,
3993 InPlaceFrame_SetMenu,
3994 InPlaceFrame_RemoveMenus,
3995 InPlaceFrame_SetStatusText,
3996 InPlaceFrame_EnableModeless,
3997 InPlaceFrame_TranslateAccelerator
4000 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
4002 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
4003 InPlaceFrame_QueryInterface,
4004 InPlaceFrame_AddRef,
4005 InPlaceFrame_Release,
4006 InPlaceFrame_GetWindow,
4007 InPlaceFrame_ContextSensitiveHelp,
4008 InPlaceFrame_GetBorder,
4009 InPlaceFrame_RequestBorderSpace,
4010 InPlaceFrame_SetBorderSpace,
4011 InPlaceUIWindow_SetActiveObject,
4014 static IOleInPlaceFrame InPlaceUIWindow = { &InPlaceUIWindowVtbl };
4016 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
4018 return QueryInterface(riid, ppv);
4021 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
4023 return 2;
4026 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
4028 return 1;
4031 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
4033 *phwnd = container_hwnd;
4034 return S_OK;
4037 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
4039 ok(0, "unexpected call\n");
4040 return E_NOTIMPL;
4043 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
4045 return S_OK;
4048 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
4050 return S_OK;
4053 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
4055 return S_OK;
4058 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
4059 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
4060 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
4062 static const RECT rect = {0,0,300,300};
4064 *ppFrame = &InPlaceFrame;
4065 *ppDoc = (IOleInPlaceUIWindow*)&InPlaceUIWindow;
4066 *lprcPosRect = rect;
4067 *lprcClipRect = rect;
4069 ok(lpFrameInfo->cb == sizeof(*lpFrameInfo), "lpFrameInfo->cb = %u, expected %u\n", lpFrameInfo->cb, (unsigned)sizeof(*lpFrameInfo));
4070 lpFrameInfo->fMDIApp = FALSE;
4071 lpFrameInfo->hwndFrame = container_hwnd;
4072 lpFrameInfo->haccel = NULL;
4073 lpFrameInfo->cAccelEntries = 0;
4075 return S_OK;
4078 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtant)
4080 return E_NOTIMPL;
4083 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
4085 return S_OK;
4088 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
4090 return S_OK;
4093 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
4095 return E_NOTIMPL;
4098 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
4100 return E_NOTIMPL;
4103 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
4105 return E_NOTIMPL;
4108 static const IOleInPlaceSiteVtbl InPlaceSiteVtbl = {
4109 InPlaceSite_QueryInterface,
4110 InPlaceSite_AddRef,
4111 InPlaceSite_Release,
4112 InPlaceSite_GetWindow,
4113 InPlaceSite_ContextSensitiveHelp,
4114 InPlaceSite_CanInPlaceActivate,
4115 InPlaceSite_OnInPlaceActivate,
4116 InPlaceSite_OnUIActivate,
4117 InPlaceSite_GetWindowContext,
4118 InPlaceSite_Scroll,
4119 InPlaceSite_OnUIDeactivate,
4120 InPlaceSite_OnInPlaceDeactivate,
4121 InPlaceSite_DiscardUndoState,
4122 InPlaceSite_DeactivateAndUndo,
4123 InPlaceSite_OnPosRectChange,
4126 static IOleInPlaceSite InPlaceSite = { &InPlaceSiteVtbl };
4128 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
4130 return QueryInterface(riid, ppv);
4133 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
4135 return 2;
4138 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
4140 return 1;
4143 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
4145 ok(0, "unexpected call\n");
4146 return E_NOTIMPL;
4149 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
4150 IMoniker **ppmon)
4152 ok(0, "unexpected call\n");
4153 return E_NOTIMPL;
4156 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
4158 return E_NOTIMPL;
4161 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
4163 ok(0, "unexpected call\n");
4164 return E_NOTIMPL;
4167 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
4169 ok(0, "unexpected call\n");
4170 return E_NOTIMPL;
4173 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
4175 ok(0, "unexpected call\n");
4176 return E_NOTIMPL;
4179 static const IOleClientSiteVtbl ClientSiteVtbl = {
4180 ClientSite_QueryInterface,
4181 ClientSite_AddRef,
4182 ClientSite_Release,
4183 ClientSite_SaveObject,
4184 ClientSite_GetMoniker,
4185 ClientSite_GetContainer,
4186 ClientSite_ShowObject,
4187 ClientSite_OnShowWindow,
4188 ClientSite_RequestNewObjectLayout
4191 static IOleClientSite ClientSite = { &ClientSiteVtbl };
4193 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
4195 return QueryInterface(riid, ppv);
4198 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
4200 return 2;
4203 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
4205 return 1;
4208 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
4210 RECT rect = {0,0,300,300};
4211 IOleDocument *document;
4212 HRESULT hres;
4214 hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
4215 ok(hres == S_OK, "could not get IOleDocument: %08lx\n", hres);
4217 if(!view) {
4218 hres = IOleDocument_CreateView(document, &InPlaceSite, NULL, 0, &view);
4219 ok(hres == S_OK, "CreateView failed: %08lx\n", hres);
4221 IOleDocument_Release(document);
4223 hres = IOleDocumentView_SetInPlaceSite(view, &InPlaceSite);
4224 ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
4226 hres = IOleDocumentView_UIActivate(view, TRUE);
4227 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
4229 hres = IOleDocumentView_SetRect(view, &rect);
4230 ok(hres == S_OK, "SetRect failed: %08lx\n", hres);
4232 hres = IOleDocumentView_Show(view, TRUE);
4233 ok(hres == S_OK, "Show failed: %08lx\n", hres);
4235 return S_OK;
4238 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
4239 DocumentSite_QueryInterface,
4240 DocumentSite_AddRef,
4241 DocumentSite_Release,
4242 DocumentSite_ActivateMe
4245 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
4247 static HRESULT WINAPI TravelLog_QueryInterface(ITravelLog *iface, REFIID riid, void **ppv)
4249 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITravelLog, riid))
4250 *ppv = iface;
4251 else {
4252 *ppv = NULL;
4253 return E_NOINTERFACE;
4255 return S_OK;
4258 static ULONG WINAPI TravelLog_AddRef(ITravelLog *iface)
4260 return 2;
4263 static ULONG WINAPI TravelLog_Release(ITravelLog *iface)
4265 return 1;
4268 static HRESULT WINAPI TravelLog_AddEntry(ITravelLog *iface, IUnknown *punk, BOOL fIsLocalAnchor)
4270 return E_NOTIMPL;
4273 static HRESULT WINAPI TravelLog_UpdateEntry(ITravelLog *iface, IUnknown *punk, BOOL fIsLocalAnchor)
4275 return E_NOTIMPL;
4278 static HRESULT WINAPI TravelLog_UpdateExternal(ITravelLog *iface, IUnknown *punk, IUnknown *punkHLBrowseContext)
4280 return E_NOTIMPL;
4283 static HRESULT WINAPI TravelLog_Travel(ITravelLog *iface, IUnknown *punk, int iOffset)
4285 return E_NOTIMPL;
4288 static HRESULT WINAPI TravelLog_GetTravelEntry(ITravelLog *iface, IUnknown *punk, int iOffset, ITravelEntry **ppte)
4290 return E_NOTIMPL;
4293 static HRESULT WINAPI TravelLog_FindTravelEntry(ITravelLog *iface, IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte)
4295 return E_NOTIMPL;
4298 static HRESULT WINAPI TravelLog_GetTooltipText(ITravelLog *iface, IUnknown *punk, int iOffset, int idsTemplate, LPWSTR pwzText, DWORD cchText)
4300 return E_NOTIMPL;
4303 static HRESULT WINAPI TravelLog_InsertMenuEntries(ITravelLog *iface, IUnknown *punk, HMENU hmenu, int nPos, int idFirst, int idLast, DWORD dwFlags)
4305 return E_NOTIMPL;
4308 static HRESULT WINAPI TravelLog_Clone(ITravelLog *iface, ITravelLog **pptl)
4310 return E_NOTIMPL;
4313 static DWORD WINAPI TravelLog_CountEntries(ITravelLog *iface, IUnknown *punk)
4315 return 0;
4318 static HRESULT WINAPI TravelLog_Revert(ITravelLog *iface)
4320 return E_NOTIMPL;
4323 static const ITravelLogVtbl TravelLogVtbl = {
4324 TravelLog_QueryInterface,
4325 TravelLog_AddRef,
4326 TravelLog_Release,
4327 TravelLog_AddEntry,
4328 TravelLog_UpdateEntry,
4329 TravelLog_UpdateExternal,
4330 TravelLog_Travel,
4331 TravelLog_GetTravelEntry,
4332 TravelLog_FindTravelEntry,
4333 TravelLog_GetTooltipText,
4334 TravelLog_InsertMenuEntries,
4335 TravelLog_Clone,
4336 TravelLog_CountEntries,
4337 TravelLog_Revert
4340 static ITravelLog TravelLog = { &TravelLogVtbl };
4342 static HRESULT WINAPI BrowserService_QueryInterface(IBrowserService *iface, REFIID riid, void **ppv)
4344 return browserservice_qi(riid, ppv);
4347 static ULONG WINAPI BrowserService_AddRef(IBrowserService* This)
4349 return 2;
4352 static ULONG WINAPI BrowserService_Release(IBrowserService* This)
4354 return 1;
4357 static HRESULT WINAPI BrowserService_GetParentSite(IBrowserService* This, IOleInPlaceSite **ppipsite)
4359 return E_NOTIMPL;
4362 static HRESULT WINAPI BrowserService_SetTitle(IBrowserService* This, IShellView *psv, LPCWSTR pszName)
4364 return E_NOTIMPL;
4367 static HRESULT WINAPI BrowserService_GetTitle(IBrowserService* This, IShellView *psv, LPWSTR pszName, DWORD cchName)
4369 return E_NOTIMPL;
4372 static HRESULT WINAPI BrowserService_GetOleObject(IBrowserService* This, IOleObject **ppobjv)
4374 return E_NOTIMPL;
4377 static HRESULT WINAPI BrowserService_GetTravelLog(IBrowserService* This, ITravelLog **pptl)
4379 *pptl = &TravelLog;
4380 return S_OK;
4383 static HRESULT WINAPI BrowserService_ShowControlWindow(IBrowserService* This, UINT id, BOOL fShow)
4385 return E_NOTIMPL;
4388 static HRESULT WINAPI BrowserService_IsControlWindowShown(IBrowserService* This, UINT id, BOOL *pfShown)
4390 return E_NOTIMPL;
4393 static HRESULT WINAPI BrowserService_IEGetDisplayName(IBrowserService* This, PCIDLIST_ABSOLUTE pidl, LPWSTR pwszName, UINT uFlags)
4395 return E_NOTIMPL;
4398 static HRESULT WINAPI BrowserService_IEParseDisplayName(IBrowserService* This, UINT uiCP, LPCWSTR pwszPath, PIDLIST_ABSOLUTE *ppidlOut)
4400 return E_NOTIMPL;
4403 static HRESULT WINAPI BrowserService_DisplayParseError(IBrowserService* This, HRESULT hres, LPCWSTR pwszPath)
4405 return E_NOTIMPL;
4408 static HRESULT WINAPI BrowserService_NavigateToPidl(IBrowserService* This, PCIDLIST_ABSOLUTE pidl, DWORD grfHLNF)
4410 return E_NOTIMPL;
4413 static HRESULT WINAPI BrowserService_SetNavigateState(IBrowserService* This, BNSTATE bnstate)
4415 return E_NOTIMPL;
4418 static HRESULT WINAPI BrowserService_GetNavigateState(IBrowserService* This, BNSTATE *pbnstate)
4420 return E_NOTIMPL;
4423 static HRESULT WINAPI BrowserService_NotifyRedirect(IBrowserService* This, IShellView *psv, PCIDLIST_ABSOLUTE pidl, BOOL *pfDidBrowse)
4425 return E_NOTIMPL;
4428 static HRESULT WINAPI BrowserService_UpdateWindowList(IBrowserService* This)
4430 return E_NOTIMPL;
4433 static HRESULT WINAPI BrowserService_UpdateBackForwardState(IBrowserService* This)
4435 return S_OK;
4438 static HRESULT WINAPI BrowserService_SetFlags(IBrowserService* This, DWORD dwFlags, DWORD dwFlagMask)
4440 return E_NOTIMPL;
4443 static HRESULT WINAPI BrowserService_GetFlags(IBrowserService* This, DWORD *pdwFlags)
4445 return E_NOTIMPL;
4448 static HRESULT WINAPI BrowserService_CanNavigateNow(IBrowserService* This)
4450 return E_NOTIMPL;
4453 static HRESULT WINAPI BrowserService_GetPidl(IBrowserService* This, PIDLIST_ABSOLUTE *ppidl)
4455 return E_NOTIMPL;
4458 static HRESULT WINAPI BrowserService_SetReferrer(IBrowserService* This, PCIDLIST_ABSOLUTE pidl)
4460 return E_NOTIMPL;
4463 static DWORD WINAPI BrowserService_GetBrowserIndex(IBrowserService* This)
4465 return E_NOTIMPL;
4468 static HRESULT WINAPI BrowserService_GetBrowserByIndex(IBrowserService* This, DWORD dwID, IUnknown **ppunk)
4470 return E_NOTIMPL;
4473 static HRESULT WINAPI BrowserService_GetHistoryObject(IBrowserService* This, IOleObject **ppole, IStream **pstm, IBindCtx **ppbc)
4475 return E_NOTIMPL;
4478 static HRESULT WINAPI BrowserService_SetHistoryObject(IBrowserService* This, IOleObject *pole, BOOL fIsLocalAnchor)
4480 return E_NOTIMPL;
4483 static HRESULT WINAPI BrowserService_CacheOLEServer(IBrowserService* This, IOleObject *pole)
4485 return E_NOTIMPL;
4488 static HRESULT WINAPI BrowserService_GetSetCodePage(IBrowserService* This, VARIANT *pvarIn, VARIANT *pvarOut)
4490 return E_NOTIMPL;
4493 static HRESULT WINAPI BrowserService_OnHttpEquiv(IBrowserService* This, IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut)
4495 return E_NOTIMPL;
4498 static HRESULT WINAPI BrowserService_GetPalette(IBrowserService* This, HPALETTE *hpal)
4500 return E_NOTIMPL;
4503 static HRESULT WINAPI BrowserService_RegisterWindow(IBrowserService* This, BOOL fForceRegister, int swc)
4505 return E_NOTIMPL;
4508 static IBrowserServiceVtbl BrowserServiceVtbl = {
4509 BrowserService_QueryInterface,
4510 BrowserService_AddRef,
4511 BrowserService_Release,
4512 BrowserService_GetParentSite,
4513 BrowserService_SetTitle,
4514 BrowserService_GetTitle,
4515 BrowserService_GetOleObject,
4516 BrowserService_GetTravelLog,
4517 BrowserService_ShowControlWindow,
4518 BrowserService_IsControlWindowShown,
4519 BrowserService_IEGetDisplayName,
4520 BrowserService_IEParseDisplayName,
4521 BrowserService_DisplayParseError,
4522 BrowserService_NavigateToPidl,
4523 BrowserService_SetNavigateState,
4524 BrowserService_GetNavigateState,
4525 BrowserService_NotifyRedirect,
4526 BrowserService_UpdateWindowList,
4527 BrowserService_UpdateBackForwardState,
4528 BrowserService_SetFlags,
4529 BrowserService_GetFlags,
4530 BrowserService_CanNavigateNow,
4531 BrowserService_GetPidl,
4532 BrowserService_SetReferrer,
4533 BrowserService_GetBrowserIndex,
4534 BrowserService_GetBrowserByIndex,
4535 BrowserService_GetHistoryObject,
4536 BrowserService_SetHistoryObject,
4537 BrowserService_CacheOLEServer,
4538 BrowserService_GetSetCodePage,
4539 BrowserService_OnHttpEquiv,
4540 BrowserService_GetPalette,
4541 BrowserService_RegisterWindow
4544 static IBrowserService BrowserService = { &BrowserServiceVtbl };
4546 static HRESULT WINAPI ShellBrowser_QueryInterface(IShellBrowser *iface, REFIID riid, void **ppv)
4548 return browserservice_qi(riid, ppv);
4551 static ULONG WINAPI ShellBrowser_AddRef(IShellBrowser *iface)
4553 return 2;
4556 static ULONG WINAPI ShellBrowser_Release(IShellBrowser *iface)
4558 return 1;
4561 static HRESULT WINAPI ShellBrowser_GetWindow(IShellBrowser *iface, HWND *phwnd)
4563 return E_NOTIMPL;
4566 static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp(IShellBrowser *iface, BOOL fEnterMode)
4568 return E_NOTIMPL;
4571 static HRESULT WINAPI ShellBrowser_InsertMenusSB(IShellBrowser *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
4573 return E_NOTIMPL;
4576 static HRESULT WINAPI ShellBrowser_SetMenuSB(IShellBrowser *iface, HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwndActiveObject)
4578 return E_NOTIMPL;
4581 static HRESULT WINAPI ShellBrowser_RemoveMenusSB(IShellBrowser *iface, HMENU hmenuShared)
4583 return E_NOTIMPL;
4586 static HRESULT WINAPI ShellBrowser_SetStatusTextSB(IShellBrowser *iface, LPCOLESTR pszStatusText)
4588 return E_NOTIMPL;
4591 static HRESULT WINAPI ShellBrowser_EnableModelessSB(IShellBrowser *iface, BOOL fEnable)
4593 return E_NOTIMPL;
4596 static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB(IShellBrowser *iface, MSG *pmsg, WORD wID)
4598 return E_NOTIMPL;
4601 static HRESULT WINAPI ShellBrowser_BrowseObject(IShellBrowser *iface, LPCITEMIDLIST pidl, UINT wFlags)
4603 return E_NOTIMPL;
4606 static HRESULT WINAPI ShellBrowser_GetViewStateStream(IShellBrowser *iface, DWORD grfMode, IStream **ppStrm)
4608 return E_NOTIMPL;
4611 static HRESULT WINAPI ShellBrowser_GetControlWindow(IShellBrowser *iface, UINT id, HWND *phwnd)
4613 return E_NOTIMPL;
4616 static HRESULT WINAPI ShellBrowser_SendControlMsg(IShellBrowser *iface, UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
4618 return E_NOTIMPL;
4621 static HRESULT WINAPI ShellBrowser_QueryActiveShellView(IShellBrowser *iface, IShellView **ppshv)
4623 return E_NOTIMPL;
4626 static HRESULT WINAPI ShellBrowser_OnViewWindowActive(IShellBrowser* iface, IShellView *pshv)
4628 return E_NOTIMPL;
4631 static HRESULT WINAPI ShellBrowser_SetToolbarItems(IShellBrowser *iface, LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags)
4633 return E_NOTIMPL;
4636 static const IShellBrowserVtbl ShellBrowserVtbl = {
4637 ShellBrowser_QueryInterface,
4638 ShellBrowser_AddRef,
4639 ShellBrowser_Release,
4640 ShellBrowser_GetWindow,
4641 ShellBrowser_ContextSensitiveHelp,
4642 ShellBrowser_InsertMenusSB,
4643 ShellBrowser_SetMenuSB,
4644 ShellBrowser_RemoveMenusSB,
4645 ShellBrowser_SetStatusTextSB,
4646 ShellBrowser_EnableModelessSB,
4647 ShellBrowser_TranslateAcceleratorSB,
4648 ShellBrowser_BrowseObject,
4649 ShellBrowser_GetViewStateStream,
4650 ShellBrowser_GetControlWindow,
4651 ShellBrowser_SendControlMsg,
4652 ShellBrowser_QueryActiveShellView,
4653 ShellBrowser_OnViewWindowActive,
4654 ShellBrowser_SetToolbarItems
4657 static IShellBrowser ShellBrowser = { &ShellBrowserVtbl };
4659 static HRESULT browserservice_qi(REFIID riid, void **ppv)
4661 if(IsEqualGUID(&IID_IShellBrowser, riid))
4662 *ppv = &ShellBrowser;
4663 else if(IsEqualGUID(&IID_IBrowserService, riid))
4664 *ppv = &BrowserService;
4665 else {
4666 *ppv = NULL;
4667 return E_NOINTERFACE;
4669 return S_OK;
4672 static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, void **ppv)
4674 return wb_qi(riid, ppv);
4677 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface)
4679 return 2;
4682 static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface)
4684 return 1;
4687 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser2 *iface, UINT *pctinfo)
4689 return E_NOTIMPL;
4692 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser2 *iface, UINT iTInfo, LCID lcid, LPTYPEINFO *ppTInfo)
4694 return E_NOTIMPL;
4697 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser2 *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames,
4698 LCID lcid, DISPID *rgDispId)
4700 return E_NOTIMPL;
4703 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
4704 DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExepInfo, UINT *puArgErr)
4706 return E_NOTIMPL;
4709 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
4711 return E_NOTIMPL;
4714 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
4716 return E_NOTIMPL;
4719 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser2 *iface)
4721 return E_NOTIMPL;
4724 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser2 *iface)
4726 return E_NOTIMPL;
4729 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR szUrl, VARIANT *Flags, VARIANT *TargetFrameName,
4730 VARIANT *PostData, VARIANT *Headers)
4732 return E_NOTIMPL;
4735 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
4737 return E_NOTIMPL;
4740 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
4742 return E_NOTIMPL;
4745 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser2 *iface)
4747 return E_NOTIMPL;
4750 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser2 *iface, IDispatch **ppDisp)
4752 return E_NOTIMPL;
4755 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser2 *iface, IDispatch **ppDisp)
4757 return E_NOTIMPL;
4760 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser2 *iface, IDispatch **ppDisp)
4762 return E_NOTIMPL;
4765 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser2 *iface, IDispatch **ppDisp)
4767 return E_NOTIMPL;
4770 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
4772 return E_NOTIMPL;
4775 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser2 *iface, BSTR *Type)
4777 return E_NOTIMPL;
4780 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser2 *iface, LONG *pl)
4782 return E_NOTIMPL;
4785 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser2 *iface, LONG Left)
4787 return E_NOTIMPL;
4790 static HRESULT WINAPI WebBrowser_get_Top(IWebBrowser2 *iface, LONG *pl)
4792 return E_NOTIMPL;
4795 static HRESULT WINAPI WebBrowser_put_Top(IWebBrowser2 *iface, LONG Top)
4797 return E_NOTIMPL;
4800 static HRESULT WINAPI WebBrowser_get_Width(IWebBrowser2 *iface, LONG *pl)
4802 return E_NOTIMPL;
4805 static HRESULT WINAPI WebBrowser_put_Width(IWebBrowser2 *iface, LONG Width)
4807 return E_NOTIMPL;
4810 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser2 *iface, LONG *pl)
4812 return E_NOTIMPL;
4815 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser2 *iface, LONG Height)
4817 return E_NOTIMPL;
4820 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser2 *iface, BSTR *LocationName)
4822 return E_NOTIMPL;
4825 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser2 *iface, BSTR *LocationURL)
4827 return E_NOTIMPL;
4830 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
4832 return E_NOTIMPL;
4835 static HRESULT WINAPI WebBrowser_Quit(IWebBrowser2 *iface)
4837 return E_NOTIMPL;
4840 static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, int *pcy)
4842 return E_NOTIMPL;
4845 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
4847 return E_NOTIMPL;
4850 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
4852 return E_NOTIMPL;
4855 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
4857 return E_NOTIMPL;
4860 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, SHANDLE_PTR *pHWND)
4862 return E_NOTIMPL;
4865 static HRESULT WINAPI WebBrowser_get_FullName(IWebBrowser2 *iface, BSTR *FullName)
4867 return E_NOTIMPL;
4870 static HRESULT WINAPI WebBrowser_get_Path(IWebBrowser2 *iface, BSTR *Path)
4872 return E_NOTIMPL;
4875 static HRESULT WINAPI WebBrowser_get_Visible(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
4877 return E_NOTIMPL;
4880 static HRESULT WINAPI WebBrowser_put_Visible(IWebBrowser2 *iface, VARIANT_BOOL Value)
4882 return E_NOTIMPL;
4885 static HRESULT WINAPI WebBrowser_get_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
4887 return E_NOTIMPL;
4890 static HRESULT WINAPI WebBrowser_put_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
4892 return E_NOTIMPL;
4895 static HRESULT WINAPI WebBrowser_get_StatusText(IWebBrowser2 *iface, BSTR *StatusText)
4897 return E_NOTIMPL;
4900 static HRESULT WINAPI WebBrowser_put_StatusText(IWebBrowser2 *iface, BSTR StatusText)
4902 return E_NOTIMPL;
4905 static HRESULT WINAPI WebBrowser_get_ToolBar(IWebBrowser2 *iface, int *Value)
4907 return E_NOTIMPL;
4910 static HRESULT WINAPI WebBrowser_put_ToolBar(IWebBrowser2 *iface, int Value)
4912 return E_NOTIMPL;
4915 static HRESULT WINAPI WebBrowser_get_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
4917 return E_NOTIMPL;
4920 static HRESULT WINAPI WebBrowser_put_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
4922 return E_NOTIMPL;
4925 static HRESULT WINAPI WebBrowser_get_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL *pbFullScreen)
4927 return E_NOTIMPL;
4930 static HRESULT WINAPI WebBrowser_put_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL bFullScreen)
4932 return E_NOTIMPL;
4935 static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags,
4936 VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
4938 return E_NOTIMPL;
4941 static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
4943 return E_NOTIMPL;
4946 static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
4947 OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
4949 return E_NOTIMPL;
4952 static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pvaClsid,
4953 VARIANT *pvarShow, VARIANT *pvarSize)
4955 return E_NOTIMPL;
4958 static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
4960 return E_NOTIMPL;
4963 static HRESULT WINAPI WebBrowser_get_Offline(IWebBrowser2 *iface, VARIANT_BOOL *pbOffline)
4965 return E_NOTIMPL;
4968 static HRESULT WINAPI WebBrowser_put_Offline(IWebBrowser2 *iface, VARIANT_BOOL bOffline)
4970 return E_NOTIMPL;
4973 static HRESULT WINAPI WebBrowser_get_Silent(IWebBrowser2 *iface, VARIANT_BOOL *pbSilent)
4975 return E_NOTIMPL;
4978 static HRESULT WINAPI WebBrowser_put_Silent(IWebBrowser2 *iface, VARIANT_BOOL bSilent)
4980 return E_NOTIMPL;
4983 static HRESULT WINAPI WebBrowser_get_RegisterAsBrowser(IWebBrowser2 *iface,
4984 VARIANT_BOOL *pbRegister)
4986 return E_NOTIMPL;
4989 static HRESULT WINAPI WebBrowser_put_RegisterAsBrowser(IWebBrowser2 *iface,
4990 VARIANT_BOOL bRegister)
4992 return E_NOTIMPL;
4995 static HRESULT WINAPI WebBrowser_get_RegisterAsDropTarget(IWebBrowser2 *iface,
4996 VARIANT_BOOL *pbRegister)
4998 return E_NOTIMPL;
5001 static HRESULT WINAPI WebBrowser_put_RegisterAsDropTarget(IWebBrowser2 *iface,
5002 VARIANT_BOOL bRegister)
5004 return E_NOTIMPL;
5007 static HRESULT WINAPI WebBrowser_get_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL *pbRegister)
5009 return E_NOTIMPL;
5012 static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL bRegister)
5014 return E_NOTIMPL;
5017 static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
5019 return E_NOTIMPL;
5022 static HRESULT WINAPI WebBrowser_put_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
5024 return E_NOTIMPL;
5027 static HRESULT WINAPI WebBrowser_get_Resizable(IWebBrowser2 *iface, VARIANT_BOOL *Value)
5029 return E_NOTIMPL;
5032 static HRESULT WINAPI WebBrowser_put_Resizable(IWebBrowser2 *iface, VARIANT_BOOL Value)
5034 return E_NOTIMPL;
5037 static const IWebBrowser2Vtbl WebBrowser2Vtbl =
5039 WebBrowser_QueryInterface,
5040 WebBrowser_AddRef,
5041 WebBrowser_Release,
5042 WebBrowser_GetTypeInfoCount,
5043 WebBrowser_GetTypeInfo,
5044 WebBrowser_GetIDsOfNames,
5045 WebBrowser_Invoke,
5046 WebBrowser_GoBack,
5047 WebBrowser_GoForward,
5048 WebBrowser_GoHome,
5049 WebBrowser_GoSearch,
5050 WebBrowser_Navigate,
5051 WebBrowser_Refresh,
5052 WebBrowser_Refresh2,
5053 WebBrowser_Stop,
5054 WebBrowser_get_Application,
5055 WebBrowser_get_Parent,
5056 WebBrowser_get_Container,
5057 WebBrowser_get_Document,
5058 WebBrowser_get_TopLevelContainer,
5059 WebBrowser_get_Type,
5060 WebBrowser_get_Left,
5061 WebBrowser_put_Left,
5062 WebBrowser_get_Top,
5063 WebBrowser_put_Top,
5064 WebBrowser_get_Width,
5065 WebBrowser_put_Width,
5066 WebBrowser_get_Height,
5067 WebBrowser_put_Height,
5068 WebBrowser_get_LocationName,
5069 WebBrowser_get_LocationURL,
5070 WebBrowser_get_Busy,
5071 WebBrowser_Quit,
5072 WebBrowser_ClientToWindow,
5073 WebBrowser_PutProperty,
5074 WebBrowser_GetProperty,
5075 WebBrowser_get_Name,
5076 WebBrowser_get_HWND,
5077 WebBrowser_get_FullName,
5078 WebBrowser_get_Path,
5079 WebBrowser_get_Visible,
5080 WebBrowser_put_Visible,
5081 WebBrowser_get_StatusBar,
5082 WebBrowser_put_StatusBar,
5083 WebBrowser_get_StatusText,
5084 WebBrowser_put_StatusText,
5085 WebBrowser_get_ToolBar,
5086 WebBrowser_put_ToolBar,
5087 WebBrowser_get_MenuBar,
5088 WebBrowser_put_MenuBar,
5089 WebBrowser_get_FullScreen,
5090 WebBrowser_put_FullScreen,
5091 WebBrowser_Navigate2,
5092 WebBrowser_QueryStatusWB,
5093 WebBrowser_ExecWB,
5094 WebBrowser_ShowBrowserBar,
5095 WebBrowser_get_ReadyState,
5096 WebBrowser_get_Offline,
5097 WebBrowser_put_Offline,
5098 WebBrowser_get_Silent,
5099 WebBrowser_put_Silent,
5100 WebBrowser_get_RegisterAsBrowser,
5101 WebBrowser_put_RegisterAsBrowser,
5102 WebBrowser_get_RegisterAsDropTarget,
5103 WebBrowser_put_RegisterAsDropTarget,
5104 WebBrowser_get_TheaterMode,
5105 WebBrowser_put_TheaterMode,
5106 WebBrowser_get_AddressBar,
5107 WebBrowser_put_AddressBar,
5108 WebBrowser_get_Resizable,
5109 WebBrowser_put_Resizable
5112 static IWebBrowser2 WebBrowser2 = { &WebBrowser2Vtbl };
5114 static HRESULT WINAPI WebBrowserPriv_QueryInterface(IWebBrowserPriv *iface, REFIID riid, void **ppv)
5116 return wb_qi(riid, ppv);
5119 static ULONG WINAPI WebBrowserPriv_AddRef(IWebBrowserPriv *iface)
5121 return 2;
5124 static ULONG WINAPI WebBrowserPriv_Release(IWebBrowserPriv *iface)
5126 return 1;
5129 static HRESULT WINAPI WebBrowserPriv_NavigateWithBindCtx(IWebBrowserPriv *iface, VARIANT *uri, VARIANT *flags,
5130 VARIANT *target_frame, VARIANT *post_data, VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment)
5132 return S_OK;
5135 static HRESULT WINAPI WebBrowserPriv_OnClose(IWebBrowserPriv *iface)
5137 return E_NOTIMPL;
5140 static const IWebBrowserPrivVtbl WebBrowserPrivVtbl = {
5141 WebBrowserPriv_QueryInterface,
5142 WebBrowserPriv_AddRef,
5143 WebBrowserPriv_Release,
5144 WebBrowserPriv_NavigateWithBindCtx,
5145 WebBrowserPriv_OnClose
5148 static IWebBrowserPriv WebBrowserPriv = { &WebBrowserPrivVtbl };
5150 static HRESULT wb_qi(REFIID riid, void **ppv)
5152 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IWebBrowser, riid) ||
5153 IsEqualGUID(&IID_IWebBrowserApp, riid) || IsEqualGUID(&IID_IWebBrowser2, riid))
5154 *ppv = &WebBrowser2;
5155 else if(IsEqualGUID(riid, &IID_IWebBrowserPriv))
5156 *ppv = &WebBrowserPriv;
5157 else {
5158 *ppv = NULL;
5159 return E_NOINTERFACE;
5161 return S_OK;
5164 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
5166 return QueryInterface(riid, ppv);
5169 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
5171 return 2;
5174 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
5176 return 1;
5179 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
5181 if(IsEqualGUID(&IID_IShellBrowser, guidService)) {
5182 ok(IsEqualGUID(&IID_IBrowserService, riid), "unexpected riid\n");
5183 *ppv = &BrowserService;
5184 return S_OK;
5187 if(IsEqualGUID(&IID_IWebBrowserApp, guidService)) {
5188 ok(IsEqualGUID(&IID_IWebBrowser2, riid), "unexpected riid\n");
5189 *ppv = &WebBrowser2;
5190 return S_OK;
5193 return E_NOINTERFACE;
5196 static const IServiceProviderVtbl ServiceProviderVtbl = {
5197 ServiceProvider_QueryInterface,
5198 ServiceProvider_AddRef,
5199 ServiceProvider_Release,
5200 ServiceProvider_QueryService
5203 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
5205 static HRESULT QueryInterface(REFIID riid, void **ppv)
5207 *ppv = NULL;
5209 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
5210 *ppv = &ClientSite;
5211 else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
5212 *ppv = &DocumentSite;
5213 else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
5214 *ppv = &InPlaceSite;
5215 else if(IsEqualGUID(&IID_IServiceProvider, riid))
5216 *ppv = &ServiceProvider;
5218 return *ppv ? S_OK : E_NOINTERFACE;
5221 static IHTMLDocument2 *notif_doc;
5222 static BOOL doc_complete;
5224 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
5225 REFIID riid, void**ppv)
5227 if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
5228 *ppv = iface;
5229 return S_OK;
5232 ok(0, "unexpected call\n");
5233 return E_NOINTERFACE;
5236 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
5238 return 2;
5241 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
5243 return 1;
5246 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
5248 if(dispID == DISPID_READYSTATE){
5249 BSTR state;
5250 HRESULT hres;
5252 hres = IHTMLDocument2_get_readyState(notif_doc, &state);
5253 ok(hres == S_OK, "get_readyState failed: %08lx\n", hres);
5255 if(!lstrcmpW(state, L"complete"))
5256 doc_complete = TRUE;
5258 SysFreeString(state);
5261 return S_OK;
5264 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
5266 ok(0, "unexpected call\n");
5267 return E_NOTIMPL;
5270 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
5271 PropertyNotifySink_QueryInterface,
5272 PropertyNotifySink_AddRef,
5273 PropertyNotifySink_Release,
5274 PropertyNotifySink_OnChanged,
5275 PropertyNotifySink_OnRequestEdit
5278 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
5280 typedef struct {
5281 IInternetProtocolEx IInternetProtocolEx_iface;
5282 IWinInetHttpInfo IWinInetHttpInfo_iface;
5284 LONG ref;
5286 IInternetProtocolSink *sink;
5287 IUri *uri;
5289 BOOL replied;
5290 ULONG size;
5291 const char *data;
5292 const char *ptr;
5294 HANDLE delay_event;
5295 ULONG delay;
5296 } ProtocolHandler;
5298 static ProtocolHandler *delay_with_signal_handler;
5300 static DWORD WINAPI delay_proc(void *arg)
5302 PROTOCOLDATA protocol_data = {PI_FORCE_ASYNC};
5303 ProtocolHandler *protocol_handler = arg;
5305 if(protocol_handler->delay_event)
5306 WaitForSingleObject(protocol_handler->delay_event, INFINITE);
5307 else
5308 Sleep(protocol_handler->delay);
5309 protocol_handler->delay = 0;
5310 IInternetProtocolSink_Switch(protocol_handler->sink, &protocol_data);
5311 return 0;
5314 static DWORD WINAPI async_switch_proc(void *arg)
5316 PROTOCOLDATA protocol_data = { PI_FORCE_ASYNC };
5317 ProtocolHandler *protocol_handler = arg;
5318 IInternetProtocolSink_Switch(protocol_handler->sink, &protocol_data);
5319 return 0;
5322 static inline ProtocolHandler *impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
5324 return CONTAINING_RECORD(iface, ProtocolHandler, IInternetProtocolEx_iface);
5327 static HRESULT WINAPI Protocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
5329 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5331 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocol, riid) || IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
5332 *ppv = &This->IInternetProtocolEx_iface;
5333 }else if(IsEqualGUID(&IID_IWinInetInfo, riid) || IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
5334 *ppv = &This->IWinInetHttpInfo_iface;
5335 }else {
5336 *ppv = NULL;
5337 return E_NOINTERFACE;
5340 IUnknown_AddRef((IUnknown*)*ppv);
5341 return S_OK;
5344 static ULONG WINAPI Protocol_AddRef(IInternetProtocolEx *iface)
5346 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5347 return InterlockedIncrement(&This->ref);
5350 static ULONG WINAPI Protocol_Release(IInternetProtocolEx *iface)
5352 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5353 LONG ref = InterlockedDecrement(&This->ref);
5355 if(!ref) {
5356 if(This->delay_event)
5357 CloseHandle(This->delay_event);
5358 if(This->sink)
5359 IInternetProtocolSink_Release(This->sink);
5360 if(This->uri)
5361 IUri_Release(This->uri);
5362 free(This);
5365 return ref;
5368 static HRESULT WINAPI Protocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink,
5369 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
5371 ok(0, "unexpected call\n");
5372 return E_NOTIMPL;
5375 static HRESULT WINAPI Protocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
5377 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5378 IServiceProvider *service_provider;
5379 IHttpNegotiate *http_negotiate;
5380 WCHAR *addl_headers = NULL;
5381 HRESULT hres;
5382 BSTR bstr;
5384 if(!This->replied) {
5385 hres = IInternetProtocolSink_QueryInterface(This->sink, &IID_IServiceProvider, (void**)&service_provider);
5386 ok(hres == S_OK, "Could not get IServiceProvider iface: %08lx\n", hres);
5388 hres = IServiceProvider_QueryService(service_provider, &IID_IHttpNegotiate, &IID_IHttpNegotiate, (void**)&http_negotiate);
5389 IServiceProvider_Release(service_provider);
5390 ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08lx\n", hres);
5392 hres = IUri_GetDisplayUri(This->uri, &bstr);
5393 ok(hres == S_OK, "Failed to get display uri: %08lx\n", hres);
5394 hres = IHttpNegotiate_BeginningTransaction(http_negotiate, bstr, L"", 0, &addl_headers);
5395 ok(hres == S_OK, "BeginningTransaction failed: %08lx\n", hres);
5396 CoTaskMemFree(addl_headers);
5397 SysFreeString(bstr);
5399 bstr = SysAllocString(L"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
5400 hres = IHttpNegotiate_OnResponse(http_negotiate, 200, bstr, NULL, NULL);
5401 ok(hres == S_OK, "OnResponse failed: %08lx\n", hres);
5402 IHttpNegotiate_Release(http_negotiate);
5403 SysFreeString(bstr);
5405 This->replied = TRUE;
5407 if(This->delay || This->delay_event) {
5408 IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
5409 QueueUserWorkItem(delay_proc, This, 0);
5410 return S_OK;
5414 hres = IInternetProtocolSink_ReportData(This->sink, BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION,
5415 This->size, This->size);
5416 ok(hres == S_OK, "ReportData failed: %08lx\n", hres);
5418 hres = IInternetProtocolSink_ReportResult(This->sink, S_OK, 0, NULL);
5419 ok(hres == S_OK || broken(hres == 0x80ef0001), "ReportResult failed: %08lx\n", hres);
5421 IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
5422 return S_OK;
5425 static HRESULT WINAPI Protocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
5427 trace("Abort(%08lx %lx)\n", hrReason, dwOptions);
5428 return E_NOTIMPL;
5431 static HRESULT WINAPI Protocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
5433 return S_OK;
5436 static HRESULT WINAPI Protocol_Suspend(IInternetProtocolEx *iface)
5438 ok(0, "unexpected call\n");
5439 return E_NOTIMPL;
5442 static HRESULT WINAPI Protocol_Resume(IInternetProtocolEx *iface)
5444 ok(0, "unexpected call\n");
5445 return E_NOTIMPL;
5448 static HRESULT WINAPI Protocol_Read(IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
5450 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5451 ULONG read;
5453 read = This->size - (This->ptr - This->data);
5454 if(read > cb)
5455 read = cb;
5457 if(read) {
5458 memcpy(pv, This->ptr, read);
5459 This->ptr += read;
5462 *pcbRead = read;
5463 return (This->ptr != This->data + This->size) ? S_OK : S_FALSE;
5466 static HRESULT WINAPI Protocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin,
5467 ULARGE_INTEGER *plibNewPosition)
5469 ok(0, "unexpected call\n");
5470 return E_NOTIMPL;
5473 static HRESULT WINAPI Protocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
5475 return S_OK;
5478 static HRESULT WINAPI Protocol_UnlockRequest(IInternetProtocolEx *iface)
5480 return S_OK;
5483 static const char *protocol_doc_str;
5485 static HRESULT WINAPI ProtocolEx_StartEx(IInternetProtocolEx *iface, IUri *uri, IInternetProtocolSink *pOIProtSink,
5486 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
5488 ProtocolHandler *This = impl_from_IInternetProtocolEx(iface);
5489 HRESULT hres;
5490 BSTR query;
5492 This->data = protocol_doc_str;
5493 This->size = strlen(This->data);
5495 IInternetProtocolSink_AddRef(This->sink = pOIProtSink);
5496 IUri_AddRef(This->uri = uri);
5497 This->ptr = This->data;
5499 hres = IUri_GetQuery(uri, &query);
5500 if(hres == S_OK) {
5501 if(!wcscmp(query, L"?delay_with_signal")) {
5502 if(delay_with_signal_handler) {
5503 ProtocolHandler *delayed = delay_with_signal_handler;
5504 delay_with_signal_handler = NULL;
5505 SetEvent(delayed->delay_event);
5506 This->delay = 30;
5507 }else {
5508 delay_with_signal_handler = This;
5509 This->delay_event = CreateEventW(NULL, FALSE, FALSE, NULL);
5510 ok(This->delay_event != NULL, "CreateEvent failed: %08lx\n", GetLastError());
5513 SysFreeString(query);
5516 IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
5517 QueueUserWorkItem(async_switch_proc, This, 0);
5518 return E_PENDING;
5521 static const IInternetProtocolExVtbl ProtocolExVtbl = {
5522 Protocol_QueryInterface,
5523 Protocol_AddRef,
5524 Protocol_Release,
5525 Protocol_Start,
5526 Protocol_Continue,
5527 Protocol_Abort,
5528 Protocol_Terminate,
5529 Protocol_Suspend,
5530 Protocol_Resume,
5531 Protocol_Read,
5532 Protocol_Seek,
5533 Protocol_LockRequest,
5534 Protocol_UnlockRequest,
5535 ProtocolEx_StartEx
5538 static inline ProtocolHandler *impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
5540 return CONTAINING_RECORD(iface, ProtocolHandler, IWinInetHttpInfo_iface);
5543 static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
5545 ProtocolHandler *This = impl_from_IWinInetHttpInfo(iface);
5546 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
5549 static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
5551 ProtocolHandler *This = impl_from_IWinInetHttpInfo(iface);
5552 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
5555 static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
5557 ProtocolHandler *This = impl_from_IWinInetHttpInfo(iface);
5558 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
5561 static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
5563 return E_NOTIMPL;
5566 static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer,
5567 DWORD *pdwFlags, DWORD *pdwReserved)
5569 return E_NOTIMPL;
5572 static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
5573 HttpInfo_QueryInterface,
5574 HttpInfo_AddRef,
5575 HttpInfo_Release,
5576 HttpInfo_QueryOption,
5577 HttpInfo_QueryInfo
5580 static HRESULT WINAPI ProtocolCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
5582 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
5583 *ppv = iface;
5584 return S_OK;
5587 *ppv = NULL;
5588 return E_NOINTERFACE;
5591 static ULONG WINAPI ProtocolCF_AddRef(IClassFactory *iface)
5593 return 2;
5596 static ULONG WINAPI ProtocolCF_Release(IClassFactory *iface)
5598 return 1;
5601 static HRESULT WINAPI ProtocolCF_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
5603 ProtocolHandler *protocol;
5604 HRESULT hres;
5606 protocol = calloc(1, sizeof(*protocol));
5607 protocol->IInternetProtocolEx_iface.lpVtbl = &ProtocolExVtbl;
5608 protocol->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
5609 protocol->ref = 1;
5611 hres = IInternetProtocolEx_QueryInterface(&protocol->IInternetProtocolEx_iface, riid, ppv);
5612 IInternetProtocolEx_Release(&protocol->IInternetProtocolEx_iface);
5613 return hres;
5616 static HRESULT WINAPI ProtocolCF_LockServer(IClassFactory *iface, BOOL dolock)
5618 ok(0, "unexpected call\n");
5619 return S_OK;
5622 static const IClassFactoryVtbl ProtocolCFVtbl = {
5623 ProtocolCF_QueryInterface,
5624 ProtocolCF_AddRef,
5625 ProtocolCF_Release,
5626 ProtocolCF_CreateInstance,
5627 ProtocolCF_LockServer
5630 static IClassFactory protocol_cf = { &ProtocolCFVtbl };
5632 static void doc_load_string(IHTMLDocument2 *doc, const char *str)
5634 IPersistStreamInit *init;
5635 IStream *stream;
5636 HRESULT hres;
5637 HGLOBAL mem;
5638 SIZE_T len;
5640 notif_doc = doc;
5642 doc_complete = FALSE;
5643 len = strlen(str);
5644 mem = GlobalAlloc(0, len);
5645 memcpy(mem, str, len);
5646 hres = CreateStreamOnHGlobal(mem, TRUE, &stream);
5647 ok(hres == S_OK, "Failed to create a stream, hr %#lx.\n", hres);
5649 hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
5650 ok(hres == S_OK, "Failed to get IPersistStreamInit, hr %#lx.\n", hres);
5652 IPersistStreamInit_Load(init, stream);
5653 IPersistStreamInit_Release(init);
5654 IStream_Release(stream);
5657 static void doc_load_res(IHTMLDocument2 *doc, const WCHAR *file)
5659 static const WCHAR res[] = { 'r','e','s',':','/','/' };
5660 WCHAR url[INTERNET_MAX_URL_LENGTH];
5661 IPersistMoniker *persist;
5662 IHlinkTarget *hlink;
5663 IBindCtx *bind;
5664 IMoniker *mon;
5665 HRESULT hres;
5666 DWORD len;
5667 BSTR bstr;
5669 wcscpy(url, SZ_HTML_CLIENTSITE_OBJECTPARAM);
5670 CreateBindCtx(0, &bind);
5671 IBindCtx_RegisterObjectParam(bind, url, (IUnknown*)&ClientSite);
5673 notif_doc = doc;
5674 doc_complete = FALSE;
5676 memcpy(url, res, sizeof(res));
5677 len = 6 + GetModuleFileNameW(NULL, url + ARRAY_SIZE(res), ARRAY_SIZE(url) - ARRAY_SIZE(res) - 1);
5678 url[len++] = '/';
5679 lstrcpynW(url + len, file, ARRAY_SIZE(url) - len);
5681 bstr = SysAllocString(url);
5682 hres = CreateURLMoniker(NULL, bstr, &mon);
5683 SysFreeString(bstr);
5684 ok(hres == S_OK, "CreateUrlMoniker failed: %08lx\n", hres);
5686 hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist);
5687 ok(hres == S_OK, "Could not get IPersistMoniker iface: %08lx\n", hres);
5689 hres = IPersistMoniker_Load(persist, FALSE, mon, bind, 0x12);
5690 ok(hres == S_OK, "Load failed: %08lx\n", hres);
5691 IPersistMoniker_Release(persist);
5692 IBindCtx_Release(bind);
5693 IMoniker_Release(mon);
5695 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHlinkTarget, (void**)&hlink);
5696 ok(hres == S_OK, "Could not get IHlinkTarget iface: %08lx\n", hres);
5697 hres = IHlinkTarget_Navigate(hlink, 0, NULL);
5698 ok(hres == S_OK, "Navigate failed: %08lx\n", hres);
5699 IHlinkTarget_Release(hlink);
5702 static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise)
5704 IConnectionPointContainer *container;
5705 IConnectionPoint *cp;
5706 DWORD cookie;
5707 HRESULT hres;
5709 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
5710 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08lx\n", hres);
5712 hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
5713 IConnectionPointContainer_Release(container);
5714 ok(hres == S_OK, "FindConnectionPoint failed: %08lx\n", hres);
5716 hres = IConnectionPoint_Advise(cp, unk_advise, &cookie);
5717 IConnectionPoint_Release(cp);
5718 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
5721 static void set_client_site(IHTMLDocument2 *doc, BOOL set)
5723 IOleObject *oleobj;
5724 HRESULT hres;
5726 if(!set && view) {
5727 IOleDocumentView_Show(view, FALSE);
5728 IOleDocumentView_CloseView(view, 0);
5729 IOleDocumentView_SetInPlaceSite(view, NULL);
5730 IOleDocumentView_Release(view);
5731 view = NULL;
5734 hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
5735 ok(hres == S_OK, "Could not et IOleObject: %08lx\n", hres);
5737 hres = IOleObject_SetClientSite(oleobj, set ? &ClientSite : NULL);
5738 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
5740 if(set) {
5741 IHlinkTarget *hlink;
5743 hres = IOleObject_QueryInterface(oleobj, &IID_IHlinkTarget, (void**)&hlink);
5744 ok(hres == S_OK, "Could not get IHlinkTarget iface: %08lx\n", hres);
5746 hres = IHlinkTarget_Navigate(hlink, 0, NULL);
5747 ok(hres == S_OK, "Navgate failed: %08lx\n", hres);
5749 IHlinkTarget_Release(hlink);
5752 IOleObject_Release(oleobj);
5755 static void navigate(IHTMLDocument2 *doc, const WCHAR *url)
5757 IHTMLLocation *location;
5758 IHTMLDocument6 *doc6;
5759 HRESULT hres;
5760 VARIANT res;
5761 BSTR bstr;
5762 MSG msg;
5764 location = NULL;
5765 hres = IHTMLDocument2_get_location(doc, &location);
5766 ok(hres == S_OK, "get_location failed: %08lx\n", hres);
5767 ok(location != NULL, "location == NULL\n");
5769 doc_complete = FALSE;
5770 bstr = SysAllocString(url);
5771 hres = IHTMLLocation_replace(location, bstr);
5772 ok(hres == S_OK, "replace failed: %08lx\n", hres);
5773 IHTMLLocation_Release(location);
5774 SysFreeString(bstr);
5776 while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) {
5777 TranslateMessage(&msg);
5778 DispatchMessageW(&msg);
5781 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument6, (void**)&doc6);
5782 if(SUCCEEDED(hres)) {
5783 hres = IHTMLDocument6_get_documentMode(doc6, &res);
5784 ok(hres == S_OK, "get_documentMode failed: %08lx\n", hres);
5785 ok(V_VT(&res) == VT_R4, "V_VT(documentMode) = %u\n", V_VT(&res));
5786 document_mode = V_R4(&res);
5787 IHTMLDocument6_Release(doc6);
5788 }else {
5789 document_mode = 0;
5792 if(window)
5793 IHTMLWindow2_Release(window);
5794 hres = IHTMLDocument2_get_parentWindow(doc, &window);
5795 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
5796 ok(window != NULL, "window == NULL\n");
5799 static IHTMLDocument2 *create_document(void)
5801 IHTMLDocument2 *doc;
5802 HRESULT hres;
5804 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
5805 &IID_IHTMLDocument2, (void**)&doc);
5806 #if !defined(__i386__) && !defined(__x86_64__)
5807 todo_wine
5808 #endif
5809 ok(hres == S_OK, "CoCreateInstance failed: %08lx\n", hres);
5810 return SUCCEEDED(hres) ? doc : NULL;
5813 static IHTMLDocument2 *create_document_with_origin(const char *str)
5815 IInternetSession *internet_session;
5816 IPersistMoniker *persist;
5817 IHTMLDocument2 *doc;
5818 IMoniker *mon;
5819 HRESULT hres;
5820 BSTR url;
5821 MSG msg;
5823 doc = create_document();
5824 if(!doc)
5825 return NULL;
5827 if(!protocol_doc_str) {
5828 hres = CoInternetGetSession(0, &internet_session, 0);
5829 ok(hres == S_OK, "CoInternetGetSession failed: %08lx\n", hres);
5831 hres = IInternetSession_RegisterNameSpace(internet_session, &protocol_cf, &CLSID_HttpProtocol, L"http", 0, NULL, 0);
5832 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
5834 IInternetSession_Release(internet_session);
5836 protocol_doc_str = str;
5838 notif_doc = doc;
5839 doc_complete = FALSE;
5840 set_client_site(doc, TRUE);
5841 do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
5843 url = SysAllocString(L"http://winetest.example.org");
5844 hres = CreateURLMoniker(NULL, url, &mon);
5845 SysFreeString(url);
5846 ok(hres == S_OK, "CreateUrlMoniker failed: %08lx\n", hres);
5848 hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist);
5849 ok(hres == S_OK, "Could not get IPersistMoniker iface: %08lx\n", hres);
5851 hres = IPersistMoniker_Load(persist, FALSE, mon, NULL, 0);
5852 ok(hres == S_OK, "Load failed: %08lx\n", hres);
5853 IPersistMoniker_Release(persist);
5854 IMoniker_Release(mon);
5856 while(!doc_complete && GetMessageA(&msg, NULL, 0, 0)) {
5857 TranslateMessage(&msg);
5858 DispatchMessageA(&msg);
5861 return doc;
5864 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
5866 return DefWindowProcA(hwnd, msg, wParam, lParam);
5869 typedef void (*testfunc_t)(IHTMLDocument2*);
5871 static void run_test_impl(const char *str, const WCHAR *res, testfunc_t test)
5873 IInternetSession *internet_session;
5874 IHTMLDocument2 *doc;
5875 IHTMLElement *body = NULL;
5876 MSG msg;
5877 HRESULT hres;
5879 doc = create_document();
5880 if (!doc)
5881 return;
5882 set_client_site(doc, TRUE);
5884 if(protocol_doc_str) {
5885 hres = CoInternetGetSession(0, &internet_session, 0);
5886 ok(hres == S_OK, "CoInternetGetSession failed: %08lx\n", hres);
5888 hres = IInternetSession_UnregisterNameSpace(internet_session, &protocol_cf, L"http");
5889 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
5891 IInternetSession_Release(internet_session);
5892 protocol_doc_str = NULL;
5895 if(res)
5896 doc_load_res(doc, res);
5897 else
5898 doc_load_string(doc, str);
5900 do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
5902 while(!doc_complete && GetMessageA(&msg, NULL, 0, 0)) {
5903 TranslateMessage(&msg);
5904 DispatchMessageA(&msg);
5907 hres = IHTMLDocument2_get_body(doc, &body);
5908 ok(hres == S_OK, "get_body failed: %08lx\n", hres);
5910 if(body) {
5911 IHTMLDocument6 *doc6;
5913 IHTMLElement_Release(body);
5915 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument6, (void**)&doc6);
5916 if(SUCCEEDED(hres)) {
5917 VARIANT v;
5918 hres = IHTMLDocument6_get_documentMode(doc6, &v);
5919 ok(hres == S_OK, "get_documentMode failed: %08lx\n", hres);
5920 ok(V_VT(&v) == VT_R4, "V_VT(documentMode) = %u\n", V_VT(&v));
5921 document_mode = V_R4(&v);
5922 IHTMLDocument6_Release(doc6);
5923 }else {
5924 document_mode = 0;
5927 hres = IHTMLDocument2_get_parentWindow(doc, &window);
5928 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
5929 ok(window != NULL, "window == NULL\n");
5931 ok((WNDPROC)GetWindowLongPtrA(container_hwnd, GWLP_WNDPROC) == wnd_proc, "container_hwnd is subclassed\n");
5932 test(doc);
5934 IHTMLWindow2_Release(window);
5935 window = NULL;
5936 }else {
5937 skip("Could not get document body. Assuming no Gecko installed.\n");
5940 set_client_site(doc, FALSE);
5941 IHTMLDocument2_Release(doc);
5944 static void run_test(const char *str, testfunc_t test)
5946 return run_test_impl(str, NULL, test);
5949 static void run_test_from_res(const WCHAR *res, testfunc_t test)
5951 return run_test_impl(NULL, res, test);
5954 static HWND create_container_window(void)
5956 static const CHAR szHTMLDocumentTest[] = "HTMLDocumentTest";
5957 static WNDCLASSEXA wndclass = {
5958 sizeof(WNDCLASSEXA),
5960 wnd_proc,
5961 0, 0, NULL, NULL, NULL, NULL, NULL,
5962 szHTMLDocumentTest,
5963 NULL
5966 RegisterClassExA(&wndclass);
5967 return CreateWindowA(szHTMLDocumentTest, szHTMLDocumentTest,
5968 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
5969 300, 300, NULL, NULL, NULL, NULL);
5972 static void test_empty_document(void)
5974 HRESULT hres;
5975 IHTMLWindow2 *window;
5976 IHTMLDocument2 *windows_doc, *doc;
5977 IConnectionPoint *cp;
5978 DWORD cookie;
5980 doc = create_document();
5981 if(!doc)
5982 return;
5984 hres = IHTMLDocument2_get_parentWindow(doc, &window);
5985 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
5987 hres = IHTMLWindow2_get_document(window, &windows_doc);
5988 IHTMLWindow2_Release(window);
5989 ok(hres == S_OK, "get_document failed: %08lx\n", hres);
5991 cookie = register_cp((IUnknown*)windows_doc, &IID_IDispatch, (IUnknown*)&div_onclick_disp);
5993 cp = get_cp((IUnknown*)doc, &IID_IDispatch);
5994 hres = IConnectionPoint_Unadvise(cp, cookie);
5995 IConnectionPoint_Release(cp);
5996 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
5998 IHTMLDocument2_Release(windows_doc);
5999 IHTMLDocument2_Release(doc);
6002 static void test_storage_events(const char *doc_str)
6004 static struct {
6005 IDispatchEx *onstorage;
6006 IDispatchEx *onstoragecommit;
6007 IDispatchEx *window_onstorage;
6008 } doc_onstorage_handlers[] = {
6009 { &doc1_onstorage_obj, &doc1_onstoragecommit_obj, &window1_onstorage_obj },
6010 { &doc2_onstorage_obj, &doc2_onstoragecommit_obj, &window2_onstorage_obj },
6012 IHTMLStorage *session_storage[2], *local_storage[2];
6013 IHTMLDocument2 *doc[2];
6014 IHTMLDocument6 *doc6;
6015 BSTR key, value;
6016 HRESULT hres;
6017 VARIANT var;
6018 LONG length;
6019 unsigned i;
6021 for(i = 0; i < ARRAY_SIZE(doc); i++)
6022 doc[i] = create_document_with_origin(doc_str);
6024 document_mode = 0;
6025 for(i = 0; i < ARRAY_SIZE(doc); i++) {
6026 IHTMLWindow6 *window6;
6027 IHTMLWindow7 *window7;
6028 IHTMLWindow2 *window;
6030 hres = IHTMLDocument2_get_parentWindow(doc[i], &window);
6031 ok(hres == S_OK, "get_parentWindow[%u] failed: %08lx\n", i, hres);
6032 ok(window != NULL, "window[%u] == NULL\n", i);
6034 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
6035 ok(hres == S_OK, "Could not get IHTMLWindow6: %08lx\n", hres);
6036 IHTMLWindow2_Release(window);
6038 hres = IHTMLWindow6_get_localStorage(window6, &local_storage[i]);
6040 /* w10pro64 testbot VM sometimes returns this for some reason */
6041 if(hres == WININET_E_INTERNAL_ERROR) {
6042 win_skip("localStorage is buggy and not available, skipping storage events tests\n");
6043 goto done;
6046 ok(hres == S_OK, "get_localStorage[%u] failed: %08lx\n", i, hres);
6047 ok(local_storage[i] != NULL, "local_storage[%u] == NULL\n", i);
6048 hres = IHTMLWindow6_get_sessionStorage(window6, &session_storage[i]);
6049 ok(hres == S_OK, "get_sessionStorage[%u] failed: %08lx\n", i, hres);
6050 ok(session_storage[i] != NULL, "session_storage[%u] == NULL\n", i);
6052 hres = IHTMLDocument2_QueryInterface(doc[i], &IID_IHTMLDocument6, (void**)&doc6);
6053 if(SUCCEEDED(hres)) {
6054 if(i == 0) {
6055 hres = IHTMLDocument6_get_documentMode(doc6, &var);
6056 ok(hres == S_OK, "get_documentMode failed: %08lx\n", hres);
6057 ok(V_VT(&var) == VT_R4, "V_VT(documentMode) = %u\n", V_VT(&var));
6058 document_mode = V_R4(&var);
6060 V_VT(&var) = VT_DISPATCH;
6061 V_DISPATCH(&var) = (IDispatch*)doc_onstorage_handlers[i].onstorage;
6062 hres = IHTMLDocument6_put_onstorage(doc6, var);
6063 ok(hres == S_OK, "put_onstorage[%u] failed: %08lx\n", i, hres);
6065 V_DISPATCH(&var) = (IDispatch*)doc_onstorage_handlers[i].onstoragecommit;
6066 hres = IHTMLDocument6_put_onstoragecommit(doc6, var);
6067 ok(hres == S_OK, "put_onstoragecommit[%u] failed: %08lx\n", i, hres);
6068 IHTMLDocument6_Release(doc6);
6071 hres = IHTMLWindow6_QueryInterface(window6, &IID_IHTMLWindow7, (void**)&window7);
6072 IHTMLWindow6_Release(window6);
6073 if(SUCCEEDED(hres)) {
6074 V_VT(&var) = VT_DISPATCH;
6075 V_DISPATCH(&var) = (IDispatch*)doc_onstorage_handlers[i].window_onstorage;
6076 hres = IHTMLWindow7_put_onstorage(window7, var);
6077 ok(hres == S_OK, "put_onstorage[%u] failed: %08lx\n", i, hres);
6078 IHTMLWindow7_Release(window7);
6082 /* local storage */
6083 for(;;) {
6084 hres = IHTMLStorage_get_length(local_storage[0], &length);
6085 ok(hres == S_OK, "get_length failed %08lx\n", hres);
6086 if(length == 0) break;
6088 hres = IHTMLStorage_clear(local_storage[0]);
6089 ok(hres == S_OK, "clear failed: %08lx\n", hres);
6090 SET_EXPECT(doc1_onstoragecommit);
6091 set_onstorage_expect(NULL, NULL, NULL);
6092 pump_msgs(&called_doc1_onstoragecommit);
6093 CHECK_CALLED(doc1_onstoragecommit);
6096 key = SysAllocString(L"test");
6097 hres = IHTMLStorage_removeItem(local_storage[0], key);
6098 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
6100 value = SysAllocString(L"WINE");
6101 hres = IHTMLStorage_setItem(local_storage[0], key, value);
6102 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6103 SysFreeString(value);
6104 SET_EXPECT(doc1_onstoragecommit);
6105 set_onstorage_expect(NULL, NULL, NULL);
6106 pump_msgs(&called_doc1_onstoragecommit);
6107 CHECK_CALLED(doc1_onstoragecommit);
6109 value = SysAllocString(L"wine");
6110 hres = IHTMLStorage_setItem(local_storage[1], key, value);
6111 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6112 SysFreeString(value);
6113 SET_EXPECT(doc1_onstoragecommit); /* Native sometimes calls this here for some reason */
6114 SET_EXPECT(doc2_onstoragecommit);
6115 set_onstorage_expect(NULL, NULL, NULL);
6116 pump_msgs(&called_doc2_onstoragecommit);
6117 CHECK_CALLED(doc2_onstoragecommit);
6118 CLEAR_CALLED(doc1_onstoragecommit);
6120 hres = IHTMLStorage_removeItem(local_storage[0], key);
6121 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
6122 SysFreeString(key);
6123 SET_EXPECT(doc1_onstoragecommit);
6124 set_onstorage_expect(NULL, NULL, NULL);
6125 pump_msgs(&called_doc1_onstoragecommit);
6126 CHECK_CALLED(doc1_onstoragecommit);
6128 key = SysAllocString(L"winetest");
6129 value = SysAllocString(L"WineTest");
6130 hres = IHTMLStorage_setItem(local_storage[1], key, value);
6131 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6132 SysFreeString(value);
6133 SysFreeString(key);
6134 SET_EXPECT(doc2_onstoragecommit);
6135 set_onstorage_expect(NULL, NULL, NULL);
6136 pump_msgs(&called_doc2_onstoragecommit);
6137 CHECK_CALLED(doc2_onstoragecommit);
6139 hres = IHTMLStorage_clear(local_storage[0]);
6140 ok(hres == S_OK, "clear failed: %08lx\n", hres);
6141 SET_EXPECT(doc1_onstoragecommit);
6142 set_onstorage_expect(NULL, NULL, NULL);
6143 pump_msgs(&called_doc1_onstoragecommit);
6144 CHECK_CALLED(doc1_onstoragecommit);
6146 for(i = 0; i < ARRAY_SIZE(local_storage); i++)
6147 IHTMLStorage_Release(local_storage[i]);
6149 /* session storage */
6150 key = SysAllocString(L"foobar");
6151 hres = IHTMLStorage_removeItem(session_storage[0], key);
6152 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
6154 value = SysAllocString(L"BarFoo");
6155 hres = IHTMLStorage_setItem(session_storage[0], key, value);
6156 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6157 SysFreeString(value);
6158 if(document_mode >= 9) SET_EXPECT(window1_onstorage);
6159 SET_EXPECT(doc1_onstorage);
6160 set_onstorage_expect(L"foobar", NULL, L"BarFoo");
6161 pump_msgs(&called_doc1_onstorage);
6162 CHECK_CALLED(doc1_onstorage);
6163 if(document_mode >= 9) CHECK_CALLED(window1_onstorage);
6165 value = SysAllocString(L"barfoo");
6166 hres = IHTMLStorage_setItem(session_storage[1], key, value);
6167 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6168 SysFreeString(value);
6169 if(document_mode >= 9) SET_EXPECT(window2_onstorage);
6170 SET_EXPECT(doc2_onstorage);
6171 set_onstorage_expect(L"foobar", L"BarFoo", L"barfoo");
6172 pump_msgs(&called_doc2_onstorage);
6173 CHECK_CALLED(doc2_onstorage);
6174 if(document_mode >= 9) CHECK_CALLED(window2_onstorage);
6176 hres = IHTMLStorage_removeItem(session_storage[0], key);
6177 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
6178 SysFreeString(key);
6179 if(document_mode >= 9) SET_EXPECT(window1_onstorage);
6180 SET_EXPECT(doc1_onstorage);
6181 set_onstorage_expect(L"foobar", L"barfoo", NULL);
6182 pump_msgs(&called_doc1_onstorage);
6183 CHECK_CALLED(doc1_onstorage);
6184 if(document_mode >= 9) CHECK_CALLED(window1_onstorage);
6186 key = SysAllocString(L"winetest");
6187 value = SysAllocString(L"WineTest");
6188 hres = IHTMLStorage_setItem(session_storage[1], key, value);
6189 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
6190 SysFreeString(value);
6191 SysFreeString(key);
6192 if(document_mode >= 9) SET_EXPECT(window2_onstorage);
6193 SET_EXPECT(doc2_onstorage);
6194 set_onstorage_expect(L"winetest", NULL, L"WineTest");
6195 pump_msgs(&called_doc2_onstorage);
6196 CHECK_CALLED(doc2_onstorage);
6197 if(document_mode >= 9) CHECK_CALLED(window2_onstorage);
6199 hres = IHTMLStorage_clear(session_storage[0]);
6200 ok(hres == S_OK, "clear failed: %08lx\n", hres);
6201 if(document_mode >= 9) SET_EXPECT(window1_onstorage);
6202 SET_EXPECT(doc1_onstorage);
6203 set_onstorage_expect(NULL, NULL, NULL);
6204 pump_msgs(&called_doc1_onstorage);
6205 CHECK_CALLED(doc1_onstorage);
6206 if(document_mode >= 9) CHECK_CALLED(window1_onstorage);
6208 for(i = 0; i < ARRAY_SIZE(session_storage); i++)
6209 IHTMLStorage_Release(session_storage[i]);
6211 done:
6212 set_client_site(doc[0], FALSE);
6213 set_client_site(doc[1], FALSE);
6214 IHTMLDocument2_Release(doc[0]);
6215 IHTMLDocument2_Release(doc[1]);
6218 static void test_sync_xhr_events(const char *doc_str)
6220 IHTMLXMLHttpRequest *xhr[2];
6221 IHTMLDocument2 *doc[2];
6222 IHTMLDocument6 *doc6;
6223 VARIANT var, vempty;
6224 HRESULT hres;
6225 unsigned i;
6227 for(i = 0; i < ARRAY_SIZE(doc); i++)
6228 doc[i] = create_document_with_origin(doc_str);
6230 document_mode = 0;
6231 V_VT(&vempty) = VT_EMPTY;
6233 hres = IHTMLDocument2_QueryInterface(doc[0], &IID_IHTMLDocument6, (void**)&doc6);
6234 if(SUCCEEDED(hres)) {
6235 hres = IHTMLDocument6_get_documentMode(doc6, &var);
6236 ok(hres == S_OK, "get_documentMode failed: %08lx\n", hres);
6237 ok(V_VT(&var) == VT_R4, "V_VT(documentMode) = %u\n", V_VT(&var));
6238 document_mode = V_R4(&var);
6239 IHTMLDocument6_Release(doc6);
6242 for(i = 0; i < ARRAY_SIZE(doc); i++) {
6243 IHTMLXMLHttpRequestFactory *ctor;
6244 IHTMLWindow5 *window5;
6245 IHTMLWindow2 *window;
6246 BSTR bstr, method;
6248 hres = IHTMLDocument2_get_parentWindow(doc[i], &window);
6249 ok(hres == S_OK, "[%u] get_parentWindow failed: %08lx\n", i, hres);
6250 ok(window != NULL, "[%u] window == NULL\n", i);
6252 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
6253 ok(hres == S_OK, "[%u] Could not get IHTMLWindow5: %08lx\n", i, hres);
6254 IHTMLWindow2_Release(window);
6256 hres = IHTMLWindow5_get_XMLHttpRequest(window5, &var);
6257 ok(hres == S_OK, "[%u] get_XMLHttpRequest failed: %08lx\n", i, hres);
6258 ok(V_VT(&var) == VT_DISPATCH, "[%u] V_VT(XMLHttpRequest) == %d\n", i, V_VT(&var));
6259 ok(V_DISPATCH(&var) != NULL, "[%u] V_DISPATCH(XMLHttpRequest) == NULL\n", i);
6260 IHTMLWindow5_Release(window5);
6262 hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLXMLHttpRequestFactory, (void**)&ctor);
6263 ok(hres == S_OK, "[%u] Could not get IHTMLXMLHttpRequestFactory: %08lx\n", i, hres);
6264 IDispatch_Release(V_DISPATCH(&var));
6265 hres = IHTMLXMLHttpRequestFactory_create(ctor, &xhr[i]);
6266 ok(hres == S_OK, "[%u] create failed: %08lx\n", i, hres);
6267 IHTMLXMLHttpRequestFactory_Release(ctor);
6269 V_VT(&var) = VT_BOOL;
6270 V_BOOL(&var) = i ? VARIANT_FALSE : VARIANT_TRUE;
6271 method = SysAllocString(L"GET");
6272 bstr = SysAllocString(L"blank.html?delay_with_signal");
6273 hres = IHTMLXMLHttpRequest_open(xhr[i], method, bstr, var, vempty, vempty);
6274 ok(hres == S_OK, "[%u] open failed: %08lx\n", i, hres);
6275 SysFreeString(method);
6276 SysFreeString(bstr);
6278 V_VT(&var) = VT_DISPATCH;
6279 V_DISPATCH(&var) = (IDispatch*)(i ? &sync_xhr_obj : &async_xhr_obj);
6280 hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr[i], var);
6281 ok(hres == S_OK, "[%u] put_onreadystatechange failed: %08lx\n", i, hres);
6284 /* async xhr */
6285 hres = IHTMLXMLHttpRequest_send(xhr[0], vempty);
6286 ok(hres == S_OK, "async xhr send failed: %08lx\n", hres);
6288 /* sync xhr */
6289 SET_EXPECT(sync_xhr_done);
6290 hres = IHTMLXMLHttpRequest_send(xhr[1], vempty);
6291 ok(hres == S_OK, "sync xhr send failed: %08lx\n", hres);
6292 CHECK_CALLED(sync_xhr_done);
6294 SET_EXPECT(async_xhr_done);
6295 pump_msgs(&called_async_xhr_done);
6296 CHECK_CALLED(async_xhr_done);
6298 for(i = 0; i < ARRAY_SIZE(xhr); i++)
6299 IHTMLXMLHttpRequest_Release(xhr[i]);
6301 set_client_site(doc[0], FALSE);
6302 set_client_site(doc[1], FALSE);
6303 IHTMLDocument2_Release(doc[0]);
6304 IHTMLDocument2_Release(doc[1]);
6307 static BOOL check_ie(void)
6309 IHTMLDocument2 *doc;
6310 IHTMLDocument5 *doc5;
6311 IHTMLDocument7 *doc7;
6312 HRESULT hres;
6314 doc = create_document();
6315 if(!doc)
6316 return FALSE;
6318 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7);
6319 if(SUCCEEDED(hres)) {
6320 is_ie9plus = TRUE;
6321 IHTMLDocument7_Release(doc7);
6324 trace("is_ie9plus %x\n", is_ie9plus);
6326 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
6327 if(SUCCEEDED(hres))
6328 IHTMLDocument5_Release(doc5);
6330 IHTMLDocument2_Release(doc);
6331 return SUCCEEDED(hres);
6334 START_TEST(events)
6336 CoInitialize(NULL);
6338 if(check_ie()) {
6339 container_hwnd = create_container_window();
6341 if(winetest_interactive)
6342 ShowWindow(container_hwnd, SW_SHOW);
6344 run_test(empty_doc_str, test_timeout);
6345 run_test(empty_doc_str, test_onclick);
6346 run_test(empty_doc_ie9_str, test_onclick);
6347 run_test(readystate_doc_str, test_onreadystatechange);
6348 run_test(readystate_doc_ie9_str, test_onreadystatechange);
6349 run_test(img_doc_str, test_imgload);
6350 run_test(input_image_doc_str, test_inputload);
6351 run_test(link_doc_str, test_link_load);
6352 run_test(input_doc_str, test_focus);
6353 run_test(empty_doc_str, test_submit);
6354 run_test(empty_doc_ie9_str, test_submit);
6355 run_test(iframe_doc_str, test_iframe_connections);
6356 if(is_ie9plus) {
6357 run_test_from_res(L"doc_with_prop.html", test_doc_obj);
6358 run_test_from_res(L"doc_with_prop_ie9.html", test_doc_obj);
6359 run_test_from_res(L"doc_with_prop_ie9.html", test_visibilitychange);
6360 run_test_from_res(L"blank_ie10.html", test_visibilitychange);
6361 run_test_from_res(L"iframe.html", test_unload_event);
6362 run_test(empty_doc_ie9_str, test_create_event);
6363 run_test(img_doc_ie9_str, test_imgload);
6364 run_test(input_image_doc_ie9_str, test_inputload);
6367 test_empty_document();
6368 test_storage_events(empty_doc_str);
6369 test_sync_xhr_events(empty_doc_str);
6370 if(is_ie9plus) {
6371 test_storage_events(empty_doc_ie9_str);
6372 test_sync_xhr_events(empty_doc_ie9_str);
6375 DestroyWindow(container_hwnd);
6376 }else {
6377 #if !defined(__i386__) && !defined(__x86_64__)
6378 todo_wine
6379 #endif
6380 win_skip("Too old IE\n");
6383 CoUninitialize();