[MSHTML_WINETEST]
[reactos.git] / rostests / winetests / mshtml / dom.c
1 /*
2 * Copyright 2007-2011 Jacek Caban for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 //#include <stdarg.h>
24 #include <stdio.h>
25
26 //#include "windef.h"
27 //#include "winbase.h"
28 //#include "ole2.h"
29 #include <mshtml.h>
30 #include <mshtmcid.h>
31 #include <mshtmhst.h>
32 //#include "docobj.h"
33 #include <hlink.h>
34 //#include "dispex.h"
35 #include "mshtml_test.h"
36 #include <objsafe.h>
37 #include <htiface.h>
38 #include <tlogstg.h>
39
40 static INT (WINAPI *pLCIDToLocaleName)(LCID,LPWSTR,INT,DWORD);
41 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void);
42
43 static const char doc_blank[] = "<html></html>";
44 static const char doc_str1[] = "<html><body>test</body></html>";
45 static const char range_test_str[] =
46 "<html><body>test \na<font size=\"2\">bc\t123<br /> it's\r\n \t</font>text<br /></body></html>";
47 static const char range_test2_str[] =
48 "<html><body>abc<hr />123<br /><hr />def</body></html>";
49 static const char elem_test_str[] =
50 "<html><head><title>test</title><style id=\"styleid\">.body { margin-right: 0px; }</style>"
51 "<meta id=\"metaid\" name=\"meta name\" http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
52 "<link id=\"linkid\"></head>"
53 "<body onload=\"Testing()\">text test<!-- a comment -->"
54 "<a id=\"a\" href=\"http://test\" name=\"x\">link</a>"
55 "<label for=\"in\" id=\"labelid\">Label:</label>"
56 "<input id=\"in\" class=\"testclass\" tabIndex=\"2\" title=\"test title\" />"
57 "<button id=\"btnid\"></button>"
58 "<select id=\"s\"><option id=\"x\" value=\"val1\">opt1</option><option id=\"y\">opt2</option></select>"
59 "<textarea id=\"X\">text text</textarea>"
60 "<table id=\"tbl\"><tbody><tr></tr><tr id=\"row2\"><td id=\"td1\">td1 text</td><td id=\"td2\">td2 text</td></tr></tbody></table>"
61 "<script id=\"sc\" type=\"text/javascript\"><!--\nfunction Testing() {}\n// -->\n</script>"
62 "<test /><object id=\"objid\" name=\"objname\" vspace=100></object><embed />"
63 "<img id=\"imgid\" name=\"WineImg\"/>"
64 "<iframe src=\"about:blank\" id=\"ifr\"></iframe>"
65 "<form id=\"frm\"></form>"
66 "<div id=\"attr\" attr1=\"attr1\" attr2 attr3=\"attr3\"></div>"
67 "</body></html>";
68 static const char elem_test2_str[] =
69 "<html><head><title>test</title><style>.body { margin-right: 0px; }</style>"
70 "<link id=\"linkid\" rel=\"stylesheet\" href=\"about:blank\" type=\"text/css\"></head>"
71 "<body><div id=\"divid\" emptyattr=\"\" onclick=\"parseInt();\"></div></body>"
72 "</html>";
73
74 static const char indent_test_str[] =
75 "<html><head><title>test</title></head><body>abc<br /><a href=\"about:blank\">123</a></body></html>";
76 static const char cond_comment_str[] =
77 "<html><head><title>test</title></head><body>"
78 "<!--[if gte IE 4]> <br> <![endif]-->"
79 "</body></html>";
80 static const char frameset_str[] =
81 "<html><head><title>frameset test</title></head><frameset rows=\"25, 25, *\">"
82 "<frame src=\"about:blank\" name=\"nm1\" id=\"fr1\"><frame src=\"about:blank\" name=\"nm2\" id=\"fr2\">"
83 "<frame src=\"about:blank\" id=\"fr3\">"
84 "</frameset></html>";
85 static const char emptydiv_str[] =
86 "<html><head><title>emptydiv test</title></head>"
87 "<body><div id=\"divid\"></div></body></html>";
88 static const char noscript_str[] =
89 "<html><head><title>noscript test</title><noscript><style>.body { margin-right: 0px; }</style></noscript></head>"
90 "<body><noscript><div>test</div></noscript></body></html>";
91 static const char doctype_str[] =
92 "<!DOCTYPE html>"
93 "<html><head><title>emptydiv test</title></head>"
94 "<body><div id=\"divid\"></div></body></html>";
95
96 static WCHAR characterW[] = {'c','h','a','r','a','c','t','e','r',0};
97 static WCHAR texteditW[] = {'t','e','x','t','e','d','i','t',0};
98 static WCHAR wordW[] = {'w','o','r','d',0};
99
100 typedef enum {
101 ET_NONE,
102 ET_HTML,
103 ET_HEAD,
104 ET_TITLE,
105 ET_BODY,
106 ET_A,
107 ET_INPUT,
108 ET_SELECT,
109 ET_TEXTAREA,
110 ET_OPTION,
111 ET_STYLE,
112 ET_BLOCKQUOTE,
113 ET_P,
114 ET_BR,
115 ET_TABLE,
116 ET_TBODY,
117 ET_SCRIPT,
118 ET_TEST,
119 ET_TESTG,
120 ET_COMMENT,
121 ET_IMG,
122 ET_TR,
123 ET_TD,
124 ET_IFRAME,
125 ET_FORM,
126 ET_FRAME,
127 ET_OBJECT,
128 ET_EMBED,
129 ET_DIV,
130 ET_META,
131 ET_NOSCRIPT,
132 ET_LINK,
133 ET_LABEL,
134 ET_BUTTON
135 } elem_type_t;
136
137 static const IID * const none_iids[] = {
138 &IID_IUnknown,
139 NULL
140 };
141
142 static const IID * const doc_node_iids[] = {
143 &IID_IHTMLDOMNode,
144 &IID_IHTMLDOMNode2,
145 &IID_IHTMLDocument,
146 &IID_IHTMLDocument2,
147 &IID_IHTMLDocument3,
148 &IID_IHTMLDocument4,
149 &IID_IHTMLDocument5,
150 &IID_IDispatchEx,
151 &IID_IConnectionPointContainer,
152 &IID_IInternetHostSecurityManager,
153 &IID_IOleContainer,
154 &IID_IObjectSafety,
155 &IID_IProvideClassInfo,
156 NULL
157 };
158
159 static const IID * const doc_obj_iids[] = {
160 &IID_IHTMLDocument,
161 &IID_IHTMLDocument2,
162 &IID_IHTMLDocument3,
163 &IID_IHTMLDocument4,
164 &IID_IHTMLDocument5,
165 &IID_IDispatchEx,
166 &IID_IConnectionPointContainer,
167 &IID_ICustomDoc,
168 &IID_IOleContainer,
169 &IID_IObjectSafety,
170 &IID_IProvideClassInfo,
171 &IID_ITargetContainer,
172 NULL
173 };
174
175 #define ELEM_IFACES \
176 &IID_IHTMLDOMNode, \
177 &IID_IHTMLDOMNode2, \
178 &IID_IHTMLElement, \
179 &IID_IHTMLElement2, \
180 &IID_IHTMLElement3, \
181 &IID_IHTMLElement4, \
182 &IID_IDispatchEx
183
184 static const IID * const elem_iids[] = {
185 ELEM_IFACES,
186 &IID_IConnectionPointContainer,
187 NULL
188 };
189
190 static const IID * const body_iids[] = {
191 ELEM_IFACES,
192 &IID_IHTMLTextContainer,
193 &IID_IHTMLBodyElement,
194 &IID_IConnectionPointContainer,
195 NULL
196 };
197
198 static const IID * const anchor_iids[] = {
199 ELEM_IFACES,
200 &IID_IHTMLAnchorElement,
201 &IID_IConnectionPointContainer,
202 NULL
203 };
204
205 static const IID * const input_iids[] = {
206 ELEM_IFACES,
207 &IID_IHTMLInputElement,
208 &IID_IHTMLInputTextElement,
209 &IID_IConnectionPointContainer,
210 NULL
211 };
212
213 static const IID *const button_iids[] = {
214 ELEM_IFACES,
215 &IID_IHTMLButtonElement,
216 &IID_IConnectionPointContainer,
217 NULL
218 };
219
220 static const IID * const label_iids[] = {
221 ELEM_IFACES,
222 &IID_IHTMLLabelElement,
223 &IID_IConnectionPointContainer,
224 NULL
225 };
226
227 static const IID * const select_iids[] = {
228 ELEM_IFACES,
229 &IID_IHTMLSelectElement,
230 &IID_IConnectionPointContainer,
231 NULL
232 };
233
234 static const IID * const textarea_iids[] = {
235 ELEM_IFACES,
236 &IID_IHTMLTextAreaElement,
237 &IID_IConnectionPointContainer,
238 NULL
239 };
240
241 static const IID * const option_iids[] = {
242 ELEM_IFACES,
243 &IID_IHTMLOptionElement,
244 &IID_IConnectionPointContainer,
245 NULL
246 };
247
248 static const IID * const table_iids[] = {
249 ELEM_IFACES,
250 &IID_IHTMLTable,
251 &IID_IHTMLTable2,
252 &IID_IHTMLTable3,
253 &IID_IConnectionPointContainer,
254 NULL
255 };
256
257 static const IID * const script_iids[] = {
258 ELEM_IFACES,
259 &IID_IHTMLScriptElement,
260 &IID_IConnectionPointContainer,
261 NULL
262 };
263
264 static const IID * const text_iids[] = {
265 &IID_IHTMLDOMNode,
266 &IID_IHTMLDOMNode2,
267 &IID_IHTMLDOMTextNode,
268 &IID_IHTMLDOMTextNode2,
269 NULL
270 };
271
272 static const IID * const attr_iids[] = {
273 &IID_IHTMLDOMAttribute,
274 &IID_IHTMLDOMAttribute2,
275 &IID_IDispatchEx,
276 NULL
277 };
278
279 static const IID * const location_iids[] = {
280 &IID_IDispatch,
281 &IID_IHTMLLocation,
282 NULL
283 };
284
285 static const IID * const window_iids[] = {
286 &IID_IDispatch,
287 &IID_IHTMLWindow2,
288 &IID_IHTMLWindow3,
289 &IID_IDispatchEx,
290 &IID_IServiceProvider,
291 NULL
292 };
293
294 static const IID * const comment_iids[] = {
295 ELEM_IFACES,
296 &IID_IHTMLCommentElement,
297 &IID_IConnectionPointContainer,
298 NULL
299 };
300
301 static const IID * const img_iids[] = {
302 ELEM_IFACES,
303 &IID_IHTMLImgElement,
304 &IID_IConnectionPointContainer,
305 NULL
306 };
307
308 static const IID * const tr_iids[] = {
309 ELEM_IFACES,
310 &IID_IHTMLTableRow,
311 &IID_IConnectionPointContainer,
312 NULL
313 };
314
315 static const IID * const td_iids[] = {
316 ELEM_IFACES,
317 &IID_IHTMLTableCell,
318 &IID_IConnectionPointContainer,
319 NULL
320 };
321
322 static const IID * const frame_iids[] = {
323 ELEM_IFACES,
324 &IID_IHTMLFrameBase,
325 &IID_IHTMLFrameBase2,
326 &IID_IConnectionPointContainer,
327 NULL
328 };
329
330 static const IID * const head_iids[] = {
331 ELEM_IFACES,
332 &IID_IHTMLHeadElement,
333 &IID_IConnectionPointContainer,
334 NULL
335 };
336
337 static const IID * const title_iids[] = {
338 ELEM_IFACES,
339 &IID_IHTMLTitleElement,
340 &IID_IConnectionPointContainer,
341 NULL
342 };
343
344 static const IID * const meta_iids[] = {
345 ELEM_IFACES,
346 &IID_IHTMLMetaElement,
347 &IID_IConnectionPointContainer,
348 NULL
349 };
350
351 static const IID * const link_iids[] = {
352 ELEM_IFACES,
353 &IID_IHTMLLinkElement,
354 &IID_IConnectionPointContainer,
355 NULL
356 };
357
358 static const IID * const object_iids[] = {
359 ELEM_IFACES,
360 &IID_IHTMLObjectElement,
361 &IID_IHTMLObjectElement2,
362 /* FIXME: No IConnectionPointContainer */
363 NULL
364 };
365
366 static const IID * const embed_iids[] = {
367 ELEM_IFACES,
368 &IID_IHTMLEmbedElement,
369 /* FIXME: No IConnectionPointContainer */
370 NULL
371 };
372
373 static const IID * const iframe_iids[] = {
374 ELEM_IFACES,
375 &IID_IHTMLFrameBase,
376 &IID_IHTMLFrameBase2,
377 &IID_IHTMLIFrameElement,
378 &IID_IHTMLIFrameElement2,
379 &IID_IConnectionPointContainer,
380 NULL
381 };
382
383 static const IID * const form_iids[] = {
384 ELEM_IFACES,
385 &IID_IHTMLFormElement,
386 &IID_IConnectionPointContainer,
387 &DIID_DispHTMLFormElement,
388 NULL
389 };
390
391 static const IID * const styleelem_iids[] = {
392 ELEM_IFACES,
393 &IID_IHTMLStyleElement,
394 &IID_IConnectionPointContainer,
395 NULL
396 };
397
398 static const IID * const generic_iids[] = {
399 ELEM_IFACES,
400 &IID_IHTMLGenericElement,
401 &IID_IConnectionPointContainer,
402 NULL
403 };
404
405 static const IID * const style_iids[] = {
406 &IID_IUnknown,
407 &IID_IDispatch,
408 &IID_IDispatchEx,
409 &IID_IHTMLStyle,
410 &IID_IHTMLStyle2,
411 &IID_IHTMLStyle3,
412 &IID_IHTMLStyle4,
413 NULL
414 };
415
416 static const IID * const cstyle_iids[] = {
417 &IID_IUnknown,
418 &IID_IDispatch,
419 &IID_IDispatchEx,
420 &IID_IHTMLCurrentStyle,
421 &IID_IHTMLCurrentStyle2,
422 &IID_IHTMLCurrentStyle3,
423 NULL
424 };
425
426 static const IID * const img_factory_iids[] = {
427 &IID_IUnknown,
428 &IID_IDispatch,
429 &IID_IDispatchEx,
430 &IID_IHTMLImageElementFactory,
431 NULL
432 };
433
434 static const IID * const selection_iids[] = {
435 &IID_IUnknown,
436 &IID_IDispatch,
437 &IID_IDispatchEx,
438 &IID_IHTMLSelectionObject,
439 &IID_IHTMLSelectionObject2,
440 NULL
441 };
442
443 typedef struct {
444 const char *tag;
445 REFIID *iids;
446 const IID *dispiid;
447 } elem_type_info_t;
448
449 static const elem_type_info_t elem_type_infos[] = {
450 {"", none_iids, NULL},
451 {"HTML", elem_iids, NULL},
452 {"HEAD", head_iids, &DIID_DispHTMLHeadElement},
453 {"TITLE", title_iids, &DIID_DispHTMLTitleElement},
454 {"BODY", body_iids, &DIID_DispHTMLBody},
455 {"A", anchor_iids, &DIID_DispHTMLAnchorElement},
456 {"INPUT", input_iids, &DIID_DispHTMLInputElement},
457 {"SELECT", select_iids, &DIID_DispHTMLSelectElement},
458 {"TEXTAREA", textarea_iids, &DIID_DispHTMLTextAreaElement},
459 {"OPTION", option_iids, &DIID_DispHTMLOptionElement},
460 {"STYLE", styleelem_iids, &DIID_DispHTMLStyleElement},
461 {"BLOCKQUOTE",elem_iids, NULL},
462 {"P", elem_iids, NULL},
463 {"BR", elem_iids, NULL},
464 {"TABLE", table_iids, &DIID_DispHTMLTable},
465 {"TBODY", elem_iids, NULL},
466 {"SCRIPT", script_iids, &DIID_DispHTMLScriptElement},
467 {"TEST", elem_iids, &DIID_DispHTMLUnknownElement},
468 {"TEST", generic_iids, &DIID_DispHTMLGenericElement},
469 {"!", comment_iids, &DIID_DispHTMLCommentElement},
470 {"IMG", img_iids, &DIID_DispHTMLImg},
471 {"TR", tr_iids, &DIID_DispHTMLTableRow},
472 {"TD", td_iids, &DIID_DispHTMLTableCell},
473 {"IFRAME", iframe_iids, &DIID_DispHTMLIFrame},
474 {"FORM", form_iids, &DIID_DispHTMLFormElement},
475 {"FRAME", frame_iids, &DIID_DispHTMLFrameElement},
476 {"OBJECT", object_iids, &DIID_DispHTMLObjectElement},
477 {"EMBED", embed_iids, &DIID_DispHTMLEmbed},
478 {"DIV", elem_iids, NULL},
479 {"META", meta_iids, &DIID_DispHTMLMetaElement},
480 {"NOSCRIPT", elem_iids, NULL /*&DIID_DispHTMLNoShowElement*/},
481 {"LINK", link_iids, &DIID_DispHTMLLinkElement},
482 {"LABEL", label_iids, &DIID_DispHTMLLabelElement},
483 {"BUTTON", button_iids, &DIID_DispHTMLButtonElement}
484 };
485
486 static int strcmp_wa(LPCWSTR strw, const char *stra)
487 {
488 CHAR buf[512];
489 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
490 return lstrcmpA(stra, buf);
491 }
492
493 static BOOL is_prefix_wa(const WCHAR *strw, const char *prefix)
494 {
495 int len, prefix_len;
496 CHAR buf[512];
497
498 len = WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL)-1;
499 prefix_len = lstrlenA(prefix);
500 if(len < prefix_len)
501 return FALSE;
502
503 buf[prefix_len] = 0;
504 return !lstrcmpA(buf, prefix);
505 }
506
507 static BSTR a2bstr(const char *str)
508 {
509 BSTR ret;
510 int len;
511
512 if(!str)
513 return NULL;
514
515 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
516 ret = SysAllocStringLen(NULL, len);
517 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
518
519 return ret;
520 }
521
522 static const char *debugstr_variant(const VARIANT *var)
523 {
524 static char buf[400];
525
526 if (!var)
527 return "(null)";
528
529 switch (V_VT(var))
530 {
531 case VT_EMPTY:
532 return "{VT_EMPTY}";
533 case VT_BSTR:
534 sprintf(buf, "{VT_BSTR: %s}", wine_dbgstr_w(V_BSTR(var)));
535 break;
536 case VT_BOOL:
537 sprintf(buf, "{VT_BOOL: %x}", V_BOOL(var));
538 break;
539 case VT_UI4:
540 sprintf(buf, "{VT_UI4: %u}", V_UI4(var));
541 break;
542 default:
543 sprintf(buf, "{vt %d}", V_VT(var));
544 break;
545 }
546
547 return buf;
548 }
549
550 static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
551 {
552 IUnknown *unk1, *unk2;
553
554 if(iface1 == iface2)
555 return TRUE;
556
557 IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
558 IUnknown_Release(unk1);
559 IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
560 IUnknown_Release(unk2);
561
562 return unk1 == unk2;
563 }
564
565 static IHTMLDocument2 *create_document(void)
566 {
567 IHTMLDocument2 *doc;
568 IHTMLDocument5 *doc5;
569 HRESULT hres;
570
571 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
572 &IID_IHTMLDocument2, (void**)&doc);
573 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
574 if(FAILED(hres))
575 return NULL;
576
577 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
578 if(FAILED(hres)) {
579 win_skip("Could not get IHTMLDocument5, probably too old IE\n");
580 IHTMLDocument2_Release(doc);
581 return NULL;
582 }
583
584 IHTMLDocument5_Release(doc5);
585 return doc;
586 }
587
588 #define get_dispex_iface(u) _get_dispex_iface(__LINE__,u)
589 static IDispatchEx *_get_dispex_iface(unsigned line, IUnknown *unk)
590 {
591 IDispatchEx *dispex;
592 HRESULT hres;
593
594 hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
595 ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatchEx: %08x\n", hres);
596 return dispex;
597 }
598
599 #define test_ifaces(i,ids) _test_ifaces(__LINE__,i,ids)
600 static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids)
601 {
602 const IID * const *piid;
603 IUnknown *unk;
604 HRESULT hres;
605
606 for(piid = iids; *piid; piid++) {
607 hres = IUnknown_QueryInterface(iface, *piid, (void**)&unk);
608 ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", wine_dbgstr_guid(*piid), hres);
609 if(SUCCEEDED(hres))
610 IUnknown_Release(unk);
611 }
612 }
613
614 #define test_no_iface(a,b) _test_no_iface(__LINE__,a,b)
615 static void _test_no_iface(unsigned line, IUnknown *iface, REFIID iid)
616 {
617 IUnknown *unk;
618 HRESULT hres;
619
620 unk = (void*)0xdeadbeef;
621 hres = IUnknown_QueryInterface(iface, iid, (void**)&unk);
622 ok_(__FILE__,line)(hres == E_NOINTERFACE, "hres = %08x, expected E_NOINTERFACE\n", hres);
623 ok_(__FILE__,line)(!unk, "unk = %p\n", unk);
624 }
625
626 #define test_get_dispid(u,id) _test_get_dispid(__LINE__,u,id)
627 static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid)
628 {
629 IDispatchEx *dispex = _get_dispex_iface(line, unk);
630 ITypeInfo *typeinfo;
631 BOOL ret = FALSE;
632 UINT ticnt;
633 HRESULT hres;
634
635 ticnt = 0xdeadbeef;
636 hres = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
637 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfoCount failed: %08x\n", hres);
638 ok_(__FILE__,line) (ticnt == 1, "ticnt=%u\n", ticnt);
639
640 hres = IDispatchEx_GetTypeInfo(dispex, 0, 0, &typeinfo);
641 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfo failed: %08x\n", hres);
642
643 if(SUCCEEDED(hres)) {
644 TYPEATTR *type_attr;
645
646 hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
647 ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08x\n", hres);
648 if(hres == S_OK) {
649 *iid = type_attr->guid;
650 ret = TRUE;
651 }
652
653 ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
654 ITypeInfo_Release(typeinfo);
655 }
656
657 IDispatchEx_Release(dispex);
658 return ret;
659 }
660
661 #define test_disp_value(u) _test_disp_value(__LINE__,u,v)
662 static void _test_disp_value(unsigned line, IUnknown *unk, const char *val)
663 {
664 IDispatchEx *dispex = _get_dispex_iface(line, unk);
665 DISPPARAMS dp = {NULL,NULL,0,0};
666 EXCEPINFO ei;
667 VARIANT var;
668 HRESULT hres;
669
670 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL);
671 IDispatchEx_Release(dispex);
672 ok_(__FILE__,line)(hres == S_OK, "InvokeEx(DISPID_VALUE) returned: %08x\n", hres);
673
674 ok_(__FILE__,line)(V_VT(&var) == VT_BSTR, "V_VT(value) = %d\n", V_VT(&var));
675 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&var), val), "value = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&var)), val);
676 VariantClear(&var);
677 }
678
679 #define test_disp(u,id,v) _test_disp(__LINE__,u,id,v)
680 static void _test_disp(unsigned line, IUnknown *unk, const IID *diid, const char *val)
681 {
682 IID iid;
683
684 if(_test_get_dispid(line, unk, &iid))
685 ok_(__FILE__,line) (IsEqualGUID(&iid, diid), "unexpected guid %s\n", wine_dbgstr_guid(&iid));
686
687 if(val)
688 _test_disp_value(line, unk, val);
689 }
690
691 #define test_disp2(u,id,id2,v) _test_disp2(__LINE__,u,id,id2,v)
692 static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID *diid2, const char *val)
693 {
694 IID iid;
695
696 if(_test_get_dispid(line, unk, &iid))
697 ok_(__FILE__,line) (IsEqualGUID(&iid, diid) || broken(IsEqualGUID(&iid, diid2)),
698 "unexpected guid %s\n", wine_dbgstr_guid(&iid));
699
700 if(val)
701 _test_disp_value(line, unk, val);
702 }
703
704 #define test_class_info(u) _test_class_info(__LINE__,u)
705 static void _test_class_info(unsigned line, IUnknown *unk)
706 {
707 IProvideClassInfo *classinfo;
708 ITypeInfo *typeinfo;
709 TYPEATTR *type_attr;
710 HRESULT hres;
711
712 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo, (void**)&classinfo);
713 ok_(__FILE__,line)(hres == S_OK, "Could not get IProvideClassInfo interface: %08x\n", hres);
714 if(FAILED(hres))
715 return;
716
717 hres = IProvideClassInfo_GetClassInfo(classinfo, &typeinfo);
718 ok_(__FILE__,line)(hres == S_OK, "Could not get ITypeInfo interface: %08x\n", hres);
719 if(FAILED(hres))
720 {
721 IProvideClassInfo_Release(classinfo);
722 return;
723 }
724
725 hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
726 ok_(__FILE__,line)(hres == S_OK, "GetTypeAttr failed: %08x\n", hres);
727 if(SUCCEEDED(hres))
728 {
729 ok_(__FILE__,line)(IsEqualGUID(&type_attr->guid, &CLSID_HTMLDocument),
730 "unexpected guid %s\n", wine_dbgstr_guid(&type_attr->guid));
731 ok_(__FILE__,line)(type_attr->typekind == TKIND_COCLASS,
732 "unexpected typekind %d\n", type_attr->typekind);
733 ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
734 }
735
736 ITypeInfo_Release(typeinfo);
737 IProvideClassInfo_Release(classinfo);
738 }
739
740 #define set_dispex_value(a,b,c) _set_dispex_value(__LINE__,a,b,c)
741 static void _set_dispex_value(unsigned line, IUnknown *unk, const char *name, VARIANT *val)
742 {
743 IDispatchEx *dispex = _get_dispex_iface(line, unk);
744 DISPPARAMS dp = {val, NULL, 1, 0};
745 EXCEPINFO ei;
746 DISPID id;
747 BSTR str;
748 HRESULT hres;
749
750 str = a2bstr(name);
751 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure|fdexNameCaseInsensitive, &id);
752 SysFreeString(str);
753 ok_(__FILE__,line)(hres == S_OK, "GetDispID failed: %08x\n", hres);
754
755 memset(&ei, 0, sizeof(ei));
756 hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL);
757 ok_(__FILE__,line)(hres == S_OK, "InvokeEx failed: %08x\n", hres);
758
759 }
760
761 #define get_elem_iface(u) _get_elem_iface(__LINE__,u)
762 static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk)
763 {
764 IHTMLElement *elem;
765 HRESULT hres;
766
767 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement, (void**)&elem);
768 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement: %08x\n", hres);
769 return elem;
770 }
771
772 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
773 static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk)
774 {
775 IHTMLElement2 *elem;
776 HRESULT hres;
777
778 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement2, (void**)&elem);
779 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres);
780 return elem;
781 }
782
783 #define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
784 static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk)
785 {
786 IHTMLElement3 *elem;
787 HRESULT hres;
788
789 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement3, (void**)&elem);
790 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement3: %08x\n", hres);
791 return elem;
792 }
793
794 #define get_elem4_iface(u) _get_elem4_iface(__LINE__,u)
795 static IHTMLElement4 *_get_elem4_iface(unsigned line, IUnknown *unk)
796 {
797 IHTMLElement4 *elem;
798 HRESULT hres;
799
800 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement4, (void**)&elem);
801 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement4: %08x\n", hres);
802 return elem;
803 }
804
805 #define get_doc3_iface(u) _get_doc3_iface(__LINE__,u)
806 static IHTMLDocument3 *_get_doc3_iface(unsigned line, IHTMLDocument2 *doc)
807 {
808 IHTMLDocument3 *doc3;
809 HRESULT hres;
810
811 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
812 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3 interface: %08x\n", hres);
813
814 return doc3;
815 }
816
817 #define get_node_iface(u) _get_node_iface(__LINE__,u)
818 static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk)
819 {
820 IHTMLDOMNode *node;
821 HRESULT hres;
822
823 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode, (void**)&node);
824 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMNode: %08x\n", hres);
825 return node;
826 }
827
828 #define get_node2_iface(u) _get_node2_iface(__LINE__,u)
829 static IHTMLDOMNode2 *_get_node2_iface(unsigned line, IUnknown *unk)
830 {
831 IHTMLDOMNode2 *node;
832 HRESULT hres;
833
834 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode2, (void**)&node);
835 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMNode2: %08x\n", hres);
836 return node;
837 }
838
839 #define get_htmldoc5_iface(u) _get_htmldoc5_iface(__LINE__,u)
840 static IHTMLDocument5 *_get_htmldoc5_iface(unsigned line, IUnknown *unk)
841 {
842 IHTMLDocument5 *doc;
843 HRESULT hres;
844
845 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument5, (void**)&doc);
846 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument5: %08x\n", hres);
847 return doc;
848 }
849
850 #define get_img_iface(u) _get_img_iface(__LINE__,u)
851 static IHTMLImgElement *_get_img_iface(unsigned line, IUnknown *unk)
852 {
853 IHTMLImgElement *img;
854 HRESULT hres;
855
856 hres = IUnknown_QueryInterface(unk, &IID_IHTMLImgElement, (void**)&img);
857 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLImgElement: %08x\n", hres);
858 return img;
859 }
860
861 #define get_anchor_iface(u) _get_anchor_iface(__LINE__,u)
862 static IHTMLAnchorElement *_get_anchor_iface(unsigned line, IUnknown *unk)
863 {
864 IHTMLAnchorElement *anchor;
865 HRESULT hres;
866
867 hres = IUnknown_QueryInterface(unk, &IID_IHTMLAnchorElement, (void**)&anchor);
868 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLAnchorElement: %08x\n", hres);
869 return anchor;
870 }
871
872 #define get_textarea_iface(u) _get_textarea_iface(__LINE__,u)
873 static IHTMLTextAreaElement *_get_textarea_iface(unsigned line, IUnknown *unk)
874 {
875 IHTMLTextAreaElement *textarea;
876 HRESULT hres;
877
878 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextAreaElement, (void**)&textarea);
879 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextAreaElement: %08x\n", hres);
880 return textarea;
881 }
882
883 #define get_select_iface(u) _get_select_iface(__LINE__,u)
884 static IHTMLSelectElement *_get_select_iface(unsigned line, IUnknown *unk)
885 {
886 IHTMLSelectElement *select;
887 HRESULT hres;
888
889 hres = IUnknown_QueryInterface(unk, &IID_IHTMLSelectElement, (void**)&select);
890 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLSelectElement: %08x\n", hres);
891 return select;
892 }
893
894 #define get_option_iface(u) _get_option_iface(__LINE__,u)
895 static IHTMLOptionElement *_get_option_iface(unsigned line, IUnknown *unk)
896 {
897 IHTMLOptionElement *option;
898 HRESULT hres;
899
900 hres = IUnknown_QueryInterface(unk, &IID_IHTMLOptionElement, (void**)&option);
901 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLOptionElement: %08x\n", hres);
902 return option;
903 }
904
905 #define get_form_iface(u) _get_form_iface(__LINE__,u)
906 static IHTMLFormElement *_get_form_iface(unsigned line, IUnknown *unk)
907 {
908 IHTMLFormElement *form;
909 HRESULT hres;
910
911 hres = IUnknown_QueryInterface(unk, &IID_IHTMLFormElement, (void**)&form);
912 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLFormElement: %08x\n", hres);
913 return form;
914 }
915
916 #define get_text_iface(u) _get_text_iface(__LINE__,u)
917 static IHTMLDOMTextNode *_get_text_iface(unsigned line, IUnknown *unk)
918 {
919 IHTMLDOMTextNode *text;
920 HRESULT hres;
921
922 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMTextNode, (void**)&text);
923 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMTextNode: %08x\n", hres);
924 return text;
925 }
926
927 #define get_text2_iface(u) _get_text2_iface(__LINE__,u)
928 static IHTMLDOMTextNode2 *_get_text2_iface(unsigned line, IUnknown *unk)
929 {
930 IHTMLDOMTextNode2 *text2;
931 HRESULT hres;
932
933 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMTextNode2, (void**)&text2);
934 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMTextNode2: %08x\n", hres);
935 return text2;
936 }
937
938 #define get_comment_iface(u) _get_comment_iface(__LINE__,u)
939 static IHTMLCommentElement *_get_comment_iface(unsigned line, IUnknown *unk)
940 {
941 IHTMLCommentElement *comment;
942 HRESULT hres;
943
944 hres = IUnknown_QueryInterface(unk, &IID_IHTMLCommentElement, (void**)&comment);
945 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLCommentElement: %08x\n", hres);
946 return comment;
947 }
948
949 #define get_object_iface(u) _get_object_iface(__LINE__,u)
950 static IHTMLObjectElement *_get_object_iface(unsigned line, IUnknown *unk)
951 {
952 IHTMLObjectElement *obj;
953 HRESULT hres;
954
955 hres = IUnknown_QueryInterface(unk, &IID_IHTMLObjectElement, (void**)&obj);
956 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLObjectElement: %08x\n", hres);
957 return obj;
958 }
959
960 #define get_style_iface(u) _get_style_iface(__LINE__,u)
961 static IHTMLStyleElement *_get_style_iface(unsigned line, IUnknown *unk)
962 {
963 IHTMLStyleElement *obj;
964 HRESULT hres;
965
966 hres = IUnknown_QueryInterface(unk, &IID_IHTMLStyleElement, (void**)&obj);
967 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLStyleElement: %08x\n", hres);
968 return obj;
969 }
970
971 #define get_metaelem_iface(u) _get_metaelem_iface(__LINE__,u)
972 static IHTMLMetaElement *_get_metaelem_iface(unsigned line, IUnknown *unk)
973 {
974 IHTMLMetaElement *ret;
975 HRESULT hres;
976
977 hres = IUnknown_QueryInterface(unk, &IID_IHTMLMetaElement, (void**)&ret);
978 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLMetaElement: %08x\n", hres);
979 return ret;
980 }
981
982 #define get_link_iface(u) _get_link_iface(__LINE__,u)
983 static IHTMLLinkElement *_get_link_iface(unsigned line, IUnknown *unk)
984 {
985 IHTMLLinkElement *ret;
986 HRESULT hres;
987
988 hres = IUnknown_QueryInterface(unk, &IID_IHTMLLinkElement, (void**)&ret);
989 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLLinkElement: %08x\n", hres);
990 return ret;
991 }
992
993 #define get_iframe2_iface(u) _get_iframe2_iface(__LINE__,u)
994 static IHTMLIFrameElement2 *_get_iframe2_iface(unsigned line, IUnknown *unk)
995 {
996 IHTMLIFrameElement2 *ret;
997 HRESULT hres;
998
999 hres = IUnknown_QueryInterface(unk, &IID_IHTMLIFrameElement2, (void**)&ret);
1000 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLIFrameElement: %08x\n", hres);
1001 return ret;
1002 }
1003
1004 #define get_button_iface(u) _get_button_iface(__LINE__,u)
1005 static IHTMLButtonElement *_get_button_iface(unsigned line, IUnknown *unk)
1006 {
1007 IHTMLButtonElement *ret;
1008 HRESULT hres;
1009
1010 hres = IUnknown_QueryInterface(unk, &IID_IHTMLButtonElement, (void**)&ret);
1011 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLButtonElement: %08x\n", hres);
1012 return ret;
1013 }
1014
1015 #define get_label_iface(u) _get_label_iface(__LINE__,u)
1016 static IHTMLLabelElement *_get_label_iface(unsigned line, IUnknown *unk)
1017 {
1018 IHTMLLabelElement *ret;
1019 HRESULT hres;
1020
1021 hres = IUnknown_QueryInterface(unk, &IID_IHTMLLabelElement, (void**)&ret);
1022 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLLabelElement: %08x\n", hres);
1023 return ret;
1024 }
1025
1026 #define get_attr2_iface(u) _get_attr2_iface(__LINE__,u)
1027 static IHTMLDOMAttribute2 *_get_attr2_iface(unsigned line, IUnknown *unk)
1028 {
1029 IHTMLDOMAttribute2 *ret;
1030 HRESULT hres;
1031
1032 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMAttribute2, (void**)&ret);
1033 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMAttribute2: %08x\n", hres);
1034 return ret;
1035 }
1036
1037 #define test_node_name(u,n) _test_node_name(__LINE__,u,n)
1038 static void _test_node_name(unsigned line, IUnknown *unk, const char *exname)
1039 {
1040 IHTMLDOMNode *node = _get_node_iface(line, unk);
1041 BSTR name;
1042 HRESULT hres;
1043
1044 hres = IHTMLDOMNode_get_nodeName(node, &name);
1045 IHTMLDOMNode_Release(node);
1046 ok_(__FILE__, line) (hres == S_OK, "get_nodeName failed: %08x\n", hres);
1047 ok_(__FILE__, line) (!strcmp_wa(name, exname), "got name: %s, expected %s\n", wine_dbgstr_w(name), exname);
1048
1049 SysFreeString(name);
1050 }
1051
1052 #define get_owner_doc(u) _get_owner_doc(__LINE__,u)
1053 static IHTMLDocument2 *_get_owner_doc(unsigned line, IUnknown *unk)
1054 {
1055 IHTMLDOMNode2 *node = _get_node2_iface(line, unk);
1056 IDispatch *disp = (void*)0xdeadbeef;
1057 IHTMLDocument2 *doc = NULL;
1058 HRESULT hres;
1059
1060 hres = IHTMLDOMNode2_get_ownerDocument(node, &disp);
1061 IHTMLDOMNode2_Release(node);
1062 ok_(__FILE__,line)(hres == S_OK, "get_ownerDocument failed: %08x\n", hres);
1063
1064 if(disp) {
1065 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&doc);
1066 IDispatch_Release(disp);
1067 ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument2 iface: %08x\n", hres);
1068 }
1069
1070 return doc;
1071 }
1072
1073 #define get_doc_window(d) _get_doc_window(__LINE__,d)
1074 static IHTMLWindow2 *_get_doc_window(unsigned line, IHTMLDocument2 *doc)
1075 {
1076 IHTMLWindow2 *window;
1077 HRESULT hres;
1078
1079 window = NULL;
1080 hres = IHTMLDocument2_get_parentWindow(doc, &window);
1081 ok_(__FILE__,line)(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
1082 ok_(__FILE__,line)(window != NULL, "window == NULL\n");
1083
1084 return window;
1085 }
1086
1087 #define clone_node(n,d) _clone_node(__LINE__,n,d)
1088 static IHTMLDOMNode *_clone_node(unsigned line, IUnknown *unk, VARIANT_BOOL deep)
1089 {
1090 IHTMLDOMNode *node = _get_node_iface(line, unk);
1091 IHTMLDOMNode *ret = NULL;
1092 HRESULT hres;
1093
1094 hres = IHTMLDOMNode_cloneNode(node, deep, &ret);
1095 IHTMLDOMNode_Release(node);
1096 ok_(__FILE__,line)(hres == S_OK, "cloneNode failed: %08x\n", hres);
1097 ok_(__FILE__,line)(ret != NULL, "ret == NULL\n");
1098
1099 return ret;
1100
1101 }
1102
1103 #define test_elem_tag(u,n) _test_elem_tag(__LINE__,u,n)
1104 static void _test_elem_tag(unsigned line, IUnknown *unk, const char *extag)
1105 {
1106 IHTMLElement *elem = _get_elem_iface(line, unk);
1107 BSTR tag;
1108 HRESULT hres;
1109
1110 hres = IHTMLElement_get_tagName(elem, &tag);
1111 IHTMLElement_Release(elem);
1112 ok_(__FILE__, line) (hres == S_OK, "get_tagName failed: %08x\n", hres);
1113 ok_(__FILE__, line) (!strcmp_wa(tag, extag), "got tag: %s, expected %s\n", wine_dbgstr_w(tag), extag);
1114
1115 SysFreeString(tag);
1116 }
1117
1118 #define test_elem_type(ifc,t) _test_elem_type(__LINE__,ifc,t)
1119 static void _test_elem_type(unsigned line, IUnknown *unk, elem_type_t type)
1120 {
1121 _test_elem_tag(line, unk, elem_type_infos[type].tag);
1122 _test_ifaces(line, unk, elem_type_infos[type].iids);
1123
1124 if(elem_type_infos[type].dispiid && type != ET_A)
1125 _test_disp(line, unk, elem_type_infos[type].dispiid, "[object]");
1126 }
1127
1128 #define get_node_type(n) _get_node_type(__LINE__,n)
1129 static LONG _get_node_type(unsigned line, IUnknown *unk)
1130 {
1131 IHTMLDOMNode *node = _get_node_iface(line, unk);
1132 LONG type = -1;
1133 HRESULT hres;
1134
1135 hres = IHTMLDOMNode_get_nodeType(node, &type);
1136 ok(hres == S_OK, "get_nodeType failed: %08x\n", hres);
1137
1138 IHTMLDOMNode_Release(node);
1139
1140 return type;
1141 }
1142
1143 #define get_child_nodes(u) _get_child_nodes(__LINE__,u)
1144 static IHTMLDOMChildrenCollection *_get_child_nodes(unsigned line, IUnknown *unk)
1145 {
1146 IHTMLDOMNode *node = _get_node_iface(line, unk);
1147 IHTMLDOMChildrenCollection *col = NULL;
1148 IDispatch *disp;
1149 HRESULT hres;
1150
1151 hres = IHTMLDOMNode_get_childNodes(node, &disp);
1152 IHTMLDOMNode_Release(node);
1153 ok_(__FILE__,line) (hres == S_OK, "get_childNodes failed: %08x\n", hres);
1154 if(FAILED(hres))
1155 return NULL;
1156
1157 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDOMChildrenCollection, (void**)&col);
1158 IDispatch_Release(disp);
1159 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMChildrenCollection: %08x\n", hres);
1160
1161 return col;
1162 }
1163
1164 #define get_child_item(c,i) _get_child_item(__LINE__,c,i)
1165 static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, LONG idx)
1166 {
1167 IHTMLDOMNode *node = NULL;
1168 IDispatch *disp;
1169 HRESULT hres;
1170
1171 hres = IHTMLDOMChildrenCollection_item(col, idx, &disp);
1172 ok(hres == S_OK, "item failed: %08x\n", hres);
1173
1174 node = _get_node_iface(line, (IUnknown*)disp);
1175 IDispatch_Release(disp);
1176
1177 return node;
1178 }
1179
1180 #define test_elem_attr(e,n,v) _test_elem_attr(__LINE__,e,n,v)
1181 static void _test_elem_attr(unsigned line, IHTMLElement *elem, const char *name, const char *exval)
1182 {
1183 VARIANT value;
1184 BSTR tmp;
1185 HRESULT hres;
1186
1187 VariantInit(&value);
1188
1189 tmp = a2bstr(name);
1190 hres = IHTMLElement_getAttribute(elem, tmp, 0, &value);
1191 SysFreeString(tmp);
1192 ok_(__FILE__,line) (hres == S_OK, "getAttribute failed: %08x\n", hres);
1193
1194 if(exval) {
1195 ok_(__FILE__,line) (V_VT(&value) == VT_BSTR, "vt=%d\n", V_VT(&value));
1196 ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&value), exval), "unexpected value %s\n", wine_dbgstr_w(V_BSTR(&value)));
1197 }else {
1198 ok_(__FILE__,line) (V_VT(&value) == VT_NULL, "vt=%d\n", V_VT(&value));
1199 }
1200
1201 VariantClear(&value);
1202 }
1203
1204 #define test_elem_offset(a,b) _test_elem_offset(__LINE__,a,b)
1205 static void _test_elem_offset(unsigned line, IUnknown *unk, const char *parent_tag)
1206 {
1207 IHTMLElement *elem = _get_elem_iface(line, unk);
1208 IHTMLElement *off_parent;
1209 LONG l;
1210 HRESULT hres;
1211
1212 hres = IHTMLElement_get_offsetTop(elem, &l);
1213 ok_(__FILE__,line) (hres == S_OK, "get_offsetTop failed: %08x\n", hres);
1214
1215 hres = IHTMLElement_get_offsetHeight(elem, &l);
1216 ok_(__FILE__,line) (hres == S_OK, "get_offsetHeight failed: %08x\n", hres);
1217
1218 hres = IHTMLElement_get_offsetWidth(elem, &l);
1219 ok_(__FILE__,line) (hres == S_OK, "get_offsetWidth failed: %08x\n", hres);
1220
1221 hres = IHTMLElement_get_offsetLeft(elem, &l);
1222 ok_(__FILE__,line) (hres == S_OK, "get_offsetLeft failed: %08x\n", hres);
1223
1224 hres = IHTMLElement_get_offsetParent(elem, &off_parent);
1225 ok_(__FILE__,line) (hres == S_OK, "get_offsetParent failed: %08x\n", hres);
1226
1227 _test_elem_tag(line, (IUnknown*)off_parent, parent_tag);
1228 IHTMLElement_Release(off_parent);
1229
1230 IHTMLElement_Release(elem);
1231 }
1232
1233 #define test_elem_source_index(a,b) _test_elem_source_index(__LINE__,a,b)
1234 static void _test_elem_source_index(unsigned line, IHTMLElement *elem, int index)
1235 {
1236 LONG l = 0xdeadbeef;
1237 HRESULT hres;
1238
1239 hres = IHTMLElement_get_sourceIndex(elem, &l);
1240 ok_(__FILE__,line)(hres == S_OK, "get_sourceIndex failed: %08x\n", hres);
1241 ok_(__FILE__,line)(l == index, "sourceIndex = %d, expected %d\n", l, index);
1242 }
1243
1244 #define get_doc_node(d) _get_doc_node(__LINE__,d)
1245 static IHTMLDocument2 *_get_doc_node(unsigned line, IHTMLDocument2 *doc)
1246 {
1247 IHTMLWindow2 *window;
1248 IHTMLDocument2 *ret;
1249 HRESULT hres;
1250
1251 hres = IHTMLDocument2_get_parentWindow(doc, &window);
1252 ok_(__FILE__,line)(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
1253
1254 hres = IHTMLWindow2_get_document(window, &ret);
1255 ok_(__FILE__,line)(hres == S_OK, "get_document failed: %08x\n", hres);
1256 ok_(__FILE__,line)(ret != NULL, "document = NULL\n");
1257
1258 return ret;
1259 }
1260
1261 #define test_window_name(d,e) _test_window_name(__LINE__,d,e)
1262 static void _test_window_name(unsigned line, IHTMLWindow2 *window, const char *exname)
1263 {
1264 BSTR name;
1265 HRESULT hres;
1266
1267 hres = IHTMLWindow2_get_name(window, &name);
1268 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
1269 if(exname)
1270 ok_(__FILE__,line)(!strcmp_wa(name, exname), "name = %s\n", wine_dbgstr_w(name));
1271 else
1272 ok_(__FILE__,line)(!name, "name = %s\n", wine_dbgstr_w(name));
1273 SysFreeString(name);
1274 }
1275
1276 #define set_window_name(w,n) _set_window_name(__LINE__,w,n)
1277 static void _set_window_name(unsigned line, IHTMLWindow2 *window, const char *name)
1278 {
1279 BSTR str;
1280 HRESULT hres;
1281
1282 str = a2bstr(name);
1283 hres = IHTMLWindow2_put_name(window, str);
1284 SysFreeString(str);
1285 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
1286
1287 _test_window_name(line, window, name);
1288 }
1289
1290 #define test_window_status(d) _test_window_status(__LINE__,d)
1291 static void _test_window_status(unsigned line, IHTMLWindow2 *window)
1292 {
1293 BSTR status;
1294 HRESULT hres;
1295
1296 status = (void*)0xdeadbeef;
1297 hres = IHTMLWindow2_get_status(window, &status);
1298 ok_(__FILE__,line)(hres == S_OK, "get_status failed: %08x\n", hres);
1299 ok_(__FILE__,line)(!status, "status = %s\n", wine_dbgstr_w(status));
1300 SysFreeString(status);
1301 }
1302
1303 #define set_window_status(w,n) _set_window_status(__LINE__,w,n)
1304 static void _set_window_status(unsigned line, IHTMLWindow2 *window, const char *status)
1305 {
1306 BSTR str;
1307 HRESULT hres;
1308
1309 str = a2bstr(status);
1310 hres = IHTMLWindow2_put_status(window, str);
1311 SysFreeString(str);
1312 ok_(__FILE__,line)(hres == S_OK, "put_status failed: %08x\n", hres);
1313 }
1314
1315 #define test_window_length(w,l) _test_window_length(__LINE__,w,l)
1316 static void _test_window_length(unsigned line, IHTMLWindow2 *window, LONG exlen)
1317 {
1318 LONG length = -1;
1319 HRESULT hres;
1320
1321 hres = IHTMLWindow2_get_length(window, &length);
1322 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
1323 ok_(__FILE__,line)(length == exlen, "length = %d, expected %d\n", length, exlen);
1324 }
1325
1326 #define get_frame_content_window(e) _get_frame_content_window(__LINE__,e)
1327 static IHTMLWindow2 *_get_frame_content_window(unsigned line, IUnknown *elem)
1328 {
1329 IHTMLFrameBase2 *base2;
1330 IHTMLWindow2 *window;
1331 HRESULT hres;
1332
1333 hres = IUnknown_QueryInterface(elem, &IID_IHTMLFrameBase2, (void**)&base2);
1334 ok(hres == S_OK, "Could not get IHTMFrameBase2 iface: %08x\n", hres);
1335
1336 window = NULL;
1337 hres = IHTMLFrameBase2_get_contentWindow(base2, &window);
1338 IHTMLFrameBase2_Release(base2);
1339 ok(hres == S_OK, "get_contentWindow failed: %08x\n", hres);
1340 ok(window != NULL, "contentWindow = NULL\n");
1341
1342 return window;
1343 }
1344
1345 static void test_get_set_attr(IHTMLDocument2 *doc)
1346 {
1347 IHTMLElement *elem;
1348 IHTMLDocument3 *doc3;
1349 HRESULT hres;
1350 BSTR bstr;
1351 VARIANT val;
1352
1353 /* grab an element to test with */
1354 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
1355 ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres);
1356
1357 hres = IHTMLDocument3_get_documentElement(doc3, &elem);
1358 IHTMLDocument3_Release(doc3);
1359 ok(hres == S_OK, "get_documentElement failed: %08x\n", hres);
1360
1361 /* get a non-present attribute */
1362 bstr = a2bstr("notAnAttribute");
1363 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
1364 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1365 ok(V_VT(&val) == VT_NULL, "variant type should have been VT_NULL (0x%x), was: 0x%x\n", VT_NULL, V_VT(&val));
1366 VariantClear(&val);
1367 SysFreeString(bstr);
1368
1369 /* get a present attribute */
1370 bstr = a2bstr("scrollHeight");
1371 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
1372 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1373 ok(V_VT(&val) == VT_I4, "variant type should have been VT_I4 (0x%x), was: 0x%x\n", VT_I4, V_VT(&val));
1374 VariantClear(&val);
1375 SysFreeString(bstr);
1376
1377 /* create a new BSTR attribute */
1378 bstr = a2bstr("newAttribute");
1379
1380 V_VT(&val) = VT_BSTR;
1381 V_BSTR(&val) = a2bstr("the value");
1382 hres = IHTMLElement_setAttribute(elem, bstr, val, 0);
1383 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
1384 VariantClear(&val);
1385
1386 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
1387 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1388 ok(V_VT(&val) == VT_BSTR, "variant type should have been VT_BSTR (0x%x), was: 0x%x\n", VT_BSTR, V_VT(&val));
1389 ok(strcmp_wa(V_BSTR(&val), "the value") == 0, "variant value should have been L\"the value\", was %s\n", wine_dbgstr_w(V_BSTR(&val)));
1390 VariantClear(&val);
1391
1392 /* overwrite the attribute with a BOOL */
1393 V_VT(&val) = VT_BOOL;
1394 V_BOOL(&val) = VARIANT_TRUE;
1395 hres = IHTMLElement_setAttribute(elem, bstr, val, 0);
1396 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
1397 VariantClear(&val);
1398
1399 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
1400 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1401 ok(V_VT(&val) == VT_BOOL, "variant type should have been VT_BOOL (0x%x), was: 0x%x\n", VT_BOOL, V_VT(&val));
1402 ok(V_BOOL(&val) == VARIANT_TRUE, "variant value should have been VARIANT_TRUE (0x%x), was %d\n", VARIANT_TRUE, V_BOOL(&val));
1403 VariantClear(&val);
1404
1405 SysFreeString(bstr);
1406
1407 /* case-insensitive */
1408 bstr = a2bstr("newattribute");
1409 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
1410 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1411 ok(V_VT(&val) == VT_BOOL, "variant type should have been VT_BOOL (0x%x), was: 0x%x\n", VT_BOOL, V_VT(&val));
1412 ok(V_BOOL(&val) == VARIANT_TRUE, "variant value should have been VARIANT_TRUE (0x%x), was %d\n", VARIANT_TRUE, V_BOOL(&val));
1413 VariantClear(&val);
1414 SysFreeString(bstr);
1415
1416 IHTMLElement_Release(elem);
1417 }
1418
1419 #define get_doc_elem(d) _get_doc_elem(__LINE__,d)
1420 static IHTMLElement *_get_doc_elem(unsigned line, IHTMLDocument2 *doc)
1421 {
1422 IHTMLElement *elem;
1423 IHTMLDocument3 *doc3;
1424 HRESULT hres;
1425
1426 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
1427 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3 interface: %08x\n", hres);
1428 hres = IHTMLDocument3_get_documentElement(doc3, &elem);
1429 ok_(__FILE__,line) (hres == S_OK, "get_documentElement failed: %08x\n", hres);
1430 IHTMLDocument3_Release(doc3);
1431
1432 return elem;
1433 }
1434
1435 #define test_anchor_href(a,h) _test_anchor_href(__LINE__,a,h)
1436 static void _test_anchor_href(unsigned line, IUnknown *unk, const char *exhref)
1437 {
1438 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1439 BSTR str;
1440 HRESULT hres;
1441
1442 hres = IHTMLAnchorElement_get_href(anchor, &str);
1443 ok_(__FILE__,line)(hres == S_OK, "get_href failed: %08x\n", hres);
1444 ok_(__FILE__,line)(!strcmp_wa(str, exhref), "href = %s, expected %s\n", wine_dbgstr_w(str), exhref);
1445 SysFreeString(str);
1446
1447 _test_disp_value(line, unk, exhref);
1448 }
1449
1450 #define test_anchor_put_href(a,h) _test_anchor_put_href(__LINE__,a,h)
1451 static void _test_anchor_put_href(unsigned line, IUnknown *unk, const char *exhref)
1452 {
1453 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1454 BSTR str;
1455 HRESULT hres;
1456
1457 str = a2bstr(exhref);
1458 hres = IHTMLAnchorElement_put_href(anchor, str);
1459 ok_(__FILE__,line)(hres == S_OK, "get_href failed: %08x\n", hres);
1460 SysFreeString(str);
1461
1462 _test_disp_value(line, unk, exhref);
1463 }
1464
1465 #define test_anchor_rel(a,h) _test_anchor_rel(__LINE__,a,h)
1466 static void _test_anchor_rel(unsigned line, IUnknown *unk, const char *exrel)
1467 {
1468 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1469 BSTR str;
1470 HRESULT hres;
1471
1472 hres = IHTMLAnchorElement_get_rel(anchor, &str);
1473 ok_(__FILE__,line)(hres == S_OK, "get_rel failed: %08x\n", hres);
1474 if(exrel)
1475 ok_(__FILE__,line)(!strcmp_wa(str, exrel), "rel = %s, expected %s\n", wine_dbgstr_w(str), exrel);
1476 else
1477 ok_(__FILE__,line)(!str, "rel = %s, expected NULL\n", wine_dbgstr_w(str));
1478 SysFreeString(str);
1479 }
1480
1481 #define test_anchor_put_rel(a,h) _test_anchor_put_rel(__LINE__,a,h)
1482 static void _test_anchor_put_rel(unsigned line, IUnknown *unk, const char *exrel)
1483 {
1484 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1485 BSTR str;
1486 HRESULT hres;
1487
1488 str = a2bstr(exrel);
1489 hres = IHTMLAnchorElement_put_rel(anchor, str);
1490 ok_(__FILE__,line)(hres == S_OK, "get_rel failed: %08x\n", hres);
1491 SysFreeString(str);
1492 }
1493
1494 #define test_anchor_get_target(a,h) _test_anchor_get_target(__LINE__,a,h)
1495 static void _test_anchor_get_target(unsigned line, IUnknown *unk, const char *target)
1496 {
1497 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1498 BSTR str;
1499 HRESULT hres;
1500
1501 hres = IHTMLAnchorElement_get_target(anchor, &str);
1502 ok_(__FILE__,line)(hres == S_OK, "get_target failed: %08x\n", hres);
1503 if(target)
1504 ok_(__FILE__,line)(!strcmp_wa(str, target), "target = %s, expected %s\n", wine_dbgstr_w(str), target);
1505 else
1506 ok_(__FILE__,line)(str == NULL, "target = %s, expected NULL\n", wine_dbgstr_w(str));
1507 SysFreeString(str);
1508 }
1509
1510 #define test_anchor_put_target(a,h) _test_anchor_put_target(__LINE__,a,h)
1511 static void _test_anchor_put_target(unsigned line, IUnknown *unk, const char *target)
1512 {
1513 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1514 BSTR str;
1515 HRESULT hres;
1516
1517 str = target ? a2bstr(target) : NULL;
1518 hres = IHTMLAnchorElement_put_target(anchor, str);
1519 ok_(__FILE__,line)(hres == S_OK, "put_target failed: %08x\n", hres);
1520 SysFreeString(str);
1521 }
1522
1523 #define test_anchor_name(a,h) _test_anchor_name(__LINE__,a,h)
1524 static void _test_anchor_name(unsigned line, IUnknown *unk, const char *name)
1525 {
1526 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1527 BSTR str;
1528 HRESULT hres;
1529
1530 hres = IHTMLAnchorElement_get_name(anchor, &str);
1531 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
1532 if(name)
1533 ok_(__FILE__,line)(!strcmp_wa(str, name), "name = %s, expected %s\n", wine_dbgstr_w(str), name);
1534 else
1535 ok_(__FILE__,line)(str == NULL, "name = %s, expected NULL\n", wine_dbgstr_w(str));
1536 SysFreeString(str);
1537 }
1538
1539 #define test_anchor_put_name(a,h) _test_anchor_put_name(__LINE__,a,h)
1540 static void _test_anchor_put_name(unsigned line, IUnknown *unk, const char *name)
1541 {
1542 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1543 BSTR str;
1544 HRESULT hres;
1545
1546 str = name ? a2bstr(name) : NULL;
1547 hres = IHTMLAnchorElement_put_name(anchor, str);
1548 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
1549 SysFreeString(str);
1550
1551 _test_anchor_name(line, unk, name);
1552 }
1553
1554 #define test_anchor_hostname(a,h) _test_anchor_hostname(__LINE__,a,h)
1555 static void _test_anchor_hostname(unsigned line, IUnknown *unk, const char *hostname)
1556 {
1557 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1558 BSTR str;
1559 HRESULT hres;
1560
1561 hres = IHTMLAnchorElement_get_hostname(anchor, &str);
1562 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
1563 if(hostname)
1564 ok_(__FILE__,line)(!strcmp_wa(str, hostname), "hostname = %s, expected %s\n", wine_dbgstr_w(str), hostname);
1565 else
1566 ok_(__FILE__,line)(str == NULL, "hostname = %s, expected NULL\n", wine_dbgstr_w(str));
1567 SysFreeString(str);
1568 }
1569
1570 #define test_anchor_search(a,h,n) _test_anchor_search(__LINE__,a,h,n)
1571 static void _test_anchor_search(unsigned line, IUnknown *elem, const char *search, BOOL allowbroken)
1572 {
1573 IHTMLAnchorElement *anchor = _get_anchor_iface(line, elem);
1574 BSTR str;
1575 HRESULT hres;
1576
1577 hres = IHTMLAnchorElement_get_search(anchor, &str);
1578 ok_(__FILE__,line)(hres == S_OK, "get_search failed: %08x\n", hres);
1579 if ( ! str && allowbroken)
1580 win_skip("skip ie6 incorrect behavior\n");
1581 else if(search)
1582 ok_(__FILE__,line)(!strcmp_wa(str, search), "search = %s, expected %s\n", wine_dbgstr_w(str), search);
1583 else
1584 ok_(__FILE__,line)(!str, "search = %s, expected NULL\n", wine_dbgstr_w(str));
1585 SysFreeString(str);
1586 }
1587
1588 #define test_anchor_put_search(a,h) _test_anchor_put_search(__LINE__,a,h)
1589 static void _test_anchor_put_search(unsigned line, IUnknown *unk, const char *search)
1590 {
1591 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1592 BSTR str;
1593 HRESULT hres;
1594
1595 str = search ? a2bstr(search) : NULL;
1596 hres = IHTMLAnchorElement_put_search(anchor, str);
1597 ok_(__FILE__,line)(hres == S_OK, "put_search failed: %08x\n", hres);
1598 SysFreeString(str);
1599 }
1600
1601 #define test_anchor_hash(a,h) _test_anchor_hash(__LINE__,a,h)
1602 static void _test_anchor_hash(unsigned line, IHTMLElement *elem, const char *exhash)
1603 {
1604 IHTMLAnchorElement *anchor = _get_anchor_iface(line, (IUnknown*)elem);
1605 BSTR str;
1606 HRESULT hres;
1607
1608 hres = IHTMLAnchorElement_get_hash(anchor, &str);
1609 ok_(__FILE__,line)(hres == S_OK, "get_hash failed: %08x\n", hres);
1610 if(exhash)
1611 ok_(__FILE__,line)(!strcmp_wa(str, exhash), "hash = %s, expected %s\n", wine_dbgstr_w(str), exhash);
1612 else
1613 ok_(__FILE__,line)(!str, "hash = %s, expected NULL\n", wine_dbgstr_w(str));
1614 SysFreeString(str);
1615 }
1616
1617 #define test_option_text(o,t) _test_option_text(__LINE__,o,t)
1618 static void _test_option_text(unsigned line, IHTMLOptionElement *option, const char *text)
1619 {
1620 BSTR bstr;
1621 HRESULT hres;
1622
1623 hres = IHTMLOptionElement_get_text(option, &bstr);
1624 ok_(__FILE__,line) (hres == S_OK, "get_text failed: %08x\n", hres);
1625 ok_(__FILE__,line) (!strcmp_wa(bstr, text), "text=%s\n", wine_dbgstr_w(bstr));
1626 SysFreeString(bstr);
1627 }
1628
1629 #define test_option_put_text(o,t) _test_option_put_text(__LINE__,o,t)
1630 static void _test_option_put_text(unsigned line, IHTMLOptionElement *option, const char *text)
1631 {
1632 BSTR bstr;
1633 HRESULT hres;
1634
1635 bstr = a2bstr(text);
1636 hres = IHTMLOptionElement_put_text(option, bstr);
1637 SysFreeString(bstr);
1638 ok(hres == S_OK, "put_text failed: %08x\n", hres);
1639
1640 _test_option_text(line, option, text);
1641 }
1642
1643 #define test_option_value(o,t) _test_option_value(__LINE__,o,t)
1644 static void _test_option_value(unsigned line, IHTMLOptionElement *option, const char *value)
1645 {
1646 BSTR bstr;
1647 HRESULT hres;
1648
1649 hres = IHTMLOptionElement_get_value(option, &bstr);
1650 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
1651 ok_(__FILE__,line) (!strcmp_wa(bstr, value), "value=%s\n", wine_dbgstr_w(bstr));
1652 SysFreeString(bstr);
1653 }
1654
1655 #define test_option_put_value(o,t) _test_option_put_value(__LINE__,o,t)
1656 static void _test_option_put_value(unsigned line, IHTMLOptionElement *option, const char *value)
1657 {
1658 BSTR bstr;
1659 HRESULT hres;
1660
1661 bstr = a2bstr(value);
1662 hres = IHTMLOptionElement_put_value(option, bstr);
1663 SysFreeString(bstr);
1664 ok(hres == S_OK, "put_value failed: %08x\n", hres);
1665
1666 _test_option_value(line, option, value);
1667 }
1668
1669 #define test_option_selected(o,s) _test_option_selected(__LINE__,o,s)
1670 static void _test_option_selected(unsigned line, IHTMLOptionElement *option, VARIANT_BOOL ex)
1671 {
1672 VARIANT_BOOL b = 0x100;
1673 HRESULT hres;
1674
1675 hres = IHTMLOptionElement_get_selected(option, &b);
1676 ok_(__FILE__,line)(hres == S_OK, "get_selected failed: %08x\n", hres);
1677 ok_(__FILE__,line)(b == ex, "selected = %x, expected %x\n", b, ex);
1678 }
1679
1680 #define test_option_put_selected(o,s) _test_option_put_selected(__LINE__,o,s)
1681 static void _test_option_put_selected(unsigned line, IHTMLOptionElement *option, VARIANT_BOOL b)
1682 {
1683 HRESULT hres;
1684
1685 hres = IHTMLOptionElement_put_selected(option, b);
1686 ok_(__FILE__,line)(hres == S_OK, "put_selected failed: %08x\n", hres);
1687 _test_option_selected(line, option, b);
1688 }
1689
1690 #define test_option_get_index(o,s) _test_option_get_index(__LINE__,o,s)
1691 static void _test_option_get_index(unsigned line, IHTMLOptionElement *option, LONG exval)
1692 {
1693 HRESULT hres;
1694 LONG val;
1695
1696 hres = IHTMLOptionElement_get_index(option, NULL);
1697 ok_(__FILE__,line)(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres);
1698
1699 val = 12345678;
1700 hres = IHTMLOptionElement_get_index(option, &val);
1701 ok_(__FILE__,line)(hres == S_OK, "get_index failed: %08x\n", hres);
1702 ok_(__FILE__,line)(val == exval || broken(val == 12345678), /* Win2k doesn't touch it*/
1703 "value = %d, expected = %d\n", val, exval);
1704 }
1705
1706 #define test_option_put_defaultSelected(o,d) _test_option_put_defaultSelected(__LINE__,o,d)
1707 static void _test_option_put_defaultSelected(unsigned line, IHTMLOptionElement *option, VARIANT_BOOL b)
1708 {
1709 HRESULT hres;
1710
1711 hres = IHTMLOptionElement_put_defaultSelected(option, b);
1712 ok_(__FILE__,line)(hres == S_OK, "put_defaultSelected %08x\n", hres);
1713 }
1714
1715 #define test_option_defaultSelected(o,e) _test_option_defaultSelected(__LINE__,o,e)
1716 static void _test_option_defaultSelected(unsigned line, IHTMLOptionElement *option, VARIANT_BOOL ex)
1717 {
1718 HRESULT hres;
1719 VARIANT_BOOL b;
1720
1721 hres = IHTMLOptionElement_get_defaultSelected(option, NULL);
1722 ok_(__FILE__,line)(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
1723
1724 b = 0x100;
1725 hres = IHTMLOptionElement_get_defaultSelected(option, &b);
1726 ok_(__FILE__,line)(hres == S_OK, "get_defaultSelected failed: %08x\n", hres);
1727 ok_(__FILE__,line)(b == ex, "b = %x, expected = %x\n", b, ex);
1728 }
1729
1730 static void test_option_defaultSelected_property(IHTMLOptionElement *option)
1731 {
1732 test_option_defaultSelected(option, VARIANT_FALSE);
1733 test_option_selected(option, VARIANT_FALSE);
1734
1735 test_option_put_defaultSelected(option, 0x100); /* Invalid value */
1736 test_option_defaultSelected(option, VARIANT_FALSE);
1737 test_option_selected(option, VARIANT_FALSE);
1738
1739 test_option_put_defaultSelected(option, VARIANT_TRUE);
1740 test_option_defaultSelected(option, VARIANT_TRUE);
1741 test_option_selected(option, VARIANT_FALSE);
1742
1743 test_option_put_defaultSelected(option, 0x100); /* Invalid value */
1744 test_option_defaultSelected(option, VARIANT_FALSE);
1745 test_option_selected(option, VARIANT_FALSE);
1746
1747 test_option_put_selected(option, VARIANT_TRUE);
1748 test_option_selected(option, VARIANT_TRUE);
1749 test_option_defaultSelected(option, VARIANT_FALSE);
1750
1751 test_option_put_defaultSelected(option, VARIANT_TRUE);
1752 test_option_defaultSelected(option, VARIANT_TRUE);
1753 test_option_selected(option, VARIANT_TRUE);
1754
1755 /* Restore defaultSelected */
1756 test_option_put_defaultSelected(option, VARIANT_TRUE);
1757 test_option_put_selected(option, VARIANT_FALSE);
1758 }
1759
1760 #define test_textarea_value(t,v) _test_textarea_value(__LINE__,t,v)
1761 static void _test_textarea_value(unsigned line, IUnknown *unk, const char *exval)
1762 {
1763 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1764 BSTR value = (void*)0xdeadbeef;
1765 HRESULT hres;
1766
1767 hres = IHTMLTextAreaElement_get_value(textarea, &value);
1768 IHTMLTextAreaElement_Release(textarea);
1769 ok_(__FILE__,line)(hres == S_OK, "get_value failed: %08x\n", hres);
1770 if(exval)
1771 ok_(__FILE__,line)(!strcmp_wa(value, exval), "value = %s, expected %s\n", wine_dbgstr_w(value), exval);
1772 else
1773 ok_(__FILE__,line)(!value, "value = %p\n", value);
1774 SysFreeString(value);
1775 }
1776
1777 #define test_textarea_put_value(t,v) _test_textarea_put_value(__LINE__,t,v)
1778 static void _test_textarea_put_value(unsigned line, IUnknown *unk, const char *value)
1779 {
1780 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1781 BSTR tmp = a2bstr(value);
1782 HRESULT hres;
1783
1784 hres = IHTMLTextAreaElement_put_value(textarea, tmp);
1785 IHTMLTextAreaElement_Release(textarea);
1786 ok_(__FILE__,line)(hres == S_OK, "put_value failed: %08x\n", hres);
1787 SysFreeString(tmp);
1788
1789 _test_textarea_value(line, unk, value);
1790 }
1791
1792 #define test_textarea_defaultvalue(t,v) _test_textarea_defaultvalue(__LINE__,t,v)
1793 static void _test_textarea_defaultvalue(unsigned line, IUnknown *unk, const char *exval)
1794 {
1795 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1796 BSTR value = (void*)0xdeadbeef;
1797 HRESULT hres;
1798
1799 hres = IHTMLTextAreaElement_get_defaultValue(textarea, &value);
1800 IHTMLTextAreaElement_Release(textarea);
1801 ok_(__FILE__,line)(hres == S_OK, "get_defaultValue failed: %08x\n", hres);
1802 if(exval)
1803 ok_(__FILE__,line)(!strcmp_wa(value, exval), "defaultValue = %s, expected %s\n", wine_dbgstr_w(value), exval);
1804 else
1805 ok_(__FILE__,line)(!value, "value = %p\n", value);
1806 SysFreeString(value);
1807 }
1808
1809 #define test_textarea_put_defaultvalue(t,v) _test_textarea_put_defaultvalue(__LINE__,t,v)
1810 static void _test_textarea_put_defaultvalue(unsigned line, IUnknown *unk, const char *value)
1811 {
1812 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1813 BSTR tmp = a2bstr(value);
1814 HRESULT hres;
1815
1816 hres = IHTMLTextAreaElement_put_defaultValue(textarea, tmp);
1817 IHTMLTextAreaElement_Release(textarea);
1818 ok_(__FILE__,line)(hres == S_OK, "put_defaultValue failed: %08x\n", hres);
1819 SysFreeString(tmp);
1820
1821 _test_textarea_defaultvalue(line, unk, value);
1822 }
1823
1824 #define test_textarea_readonly(t,v) _test_textarea_readonly(__LINE__,t,v)
1825 static void _test_textarea_readonly(unsigned line, IUnknown *unk, VARIANT_BOOL ex)
1826 {
1827 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1828 VARIANT_BOOL b = 0x100;
1829 HRESULT hres;
1830
1831 hres = IHTMLTextAreaElement_get_readOnly(textarea, &b);
1832 IHTMLTextAreaElement_Release(textarea);
1833 ok_(__FILE__,line)(hres == S_OK, "get_readOnly failed: %08x\n", hres);
1834 ok_(__FILE__,line)(b == ex, "readOnly = %x, expected %x\n", b, ex);
1835 }
1836
1837 #define test_textarea_put_readonly(t,v) _test_textarea_put_readonly(__LINE__,t,v)
1838 static void _test_textarea_put_readonly(unsigned line, IUnknown *unk, VARIANT_BOOL b)
1839 {
1840 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1841 HRESULT hres;
1842
1843 hres = IHTMLTextAreaElement_put_readOnly(textarea, b);
1844 IHTMLTextAreaElement_Release(textarea);
1845 ok_(__FILE__,line)(hres == S_OK, "put_readOnly failed: %08x\n", hres);
1846
1847 _test_textarea_readonly(line, unk, b);
1848 }
1849
1850 #define test_textarea_type(t) _test_textarea_type(__LINE__,t)
1851 static void _test_textarea_type(unsigned line, IUnknown *unk)
1852 {
1853 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1854 BSTR type = (void*)0xdeadbeef;
1855 HRESULT hres;
1856
1857 hres = IHTMLTextAreaElement_get_type(textarea, &type);
1858 IHTMLTextAreaElement_Release(textarea);
1859 ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08x\n", hres);
1860 ok_(__FILE__,line)(!strcmp_wa(type, "textarea"), "type = %s, expected textarea\n", wine_dbgstr_w(type));
1861 SysFreeString(type);
1862 }
1863
1864 #define get_textarea_form(t) _get_textarea_form(__LINE__,t)
1865 static IHTMLFormElement *_get_textarea_form(unsigned line, IUnknown *unk)
1866 {
1867 IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk);
1868 IHTMLFormElement *form;
1869 HRESULT hres;
1870
1871 hres = IHTMLTextAreaElement_get_form(textarea, &form);
1872 IHTMLTextAreaElement_Release(textarea);
1873 ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08x\n", hres);
1874
1875 return form;
1876 }
1877
1878 #define test_comment_text(c,t) _test_comment_text(__LINE__,c,t)
1879 static void _test_comment_text(unsigned line, IUnknown *unk, const char *extext)
1880 {
1881 IHTMLCommentElement *comment = _get_comment_iface(__LINE__,unk);
1882 BSTR text;
1883 HRESULT hres;
1884
1885 text = a2bstr(extext);
1886 hres = IHTMLCommentElement_get_text(comment, &text);
1887 ok_(__FILE__,line)(hres == S_OK, "get_text failed: %08x\n", hres);
1888 ok_(__FILE__,line)(!strcmp_wa(text, extext), "text = \"%s\", expected \"%s\"\n", wine_dbgstr_w(text), extext);
1889
1890 IHTMLCommentElement_Release(comment);
1891 SysFreeString(text);
1892 }
1893
1894 #define test_attr_specified(a,b) _test_attr_specified(__LINE__,a,b)
1895 static void _test_attr_specified(unsigned line, IHTMLDOMAttribute *attr, VARIANT_BOOL expected)
1896 {
1897 VARIANT_BOOL specified;
1898 HRESULT hres;
1899
1900 hres = IHTMLDOMAttribute_get_specified(attr, &specified);
1901 ok_(__FILE__,line)(hres == S_OK, "get_specified failed: %08x\n", hres);
1902 ok_(__FILE__,line)(specified == expected, "specified = %x, expected %x\n", specified, expected);
1903 }
1904
1905 #define test_attr_expando(a,b) _test_attr_expando(__LINE__,a,b)
1906 static void _test_attr_expando(unsigned line, IHTMLDOMAttribute *attr, VARIANT_BOOL expected)
1907 {
1908 IHTMLDOMAttribute2 *attr2 = _get_attr2_iface(line, (IUnknown*)attr);
1909 VARIANT_BOOL expando;
1910 HRESULT hres;
1911
1912 hres = IHTMLDOMAttribute2_get_expando(attr2, &expando);
1913 ok_(__FILE__,line)(hres == S_OK, "get_expando failed: %08x\n", hres);
1914 ok_(__FILE__,line)(expando == expected, "expando = %x, expected %x\n", expando, expected);
1915
1916 IHTMLDOMAttribute2_Release(attr2);
1917 }
1918
1919 #define test_attr_value(a,b) _test_attr_value(__LINE__,a,b)
1920 static void _test_attr_value(unsigned line, IHTMLDOMAttribute *attr, const char *exval)
1921 {
1922 IHTMLDOMAttribute2 *attr2 = _get_attr2_iface(line, (IUnknown*)attr);
1923 BSTR val;
1924 HRESULT hres;
1925
1926 hres = IHTMLDOMAttribute2_get_value(attr2, &val);
1927 ok_(__FILE__,line)(hres == S_OK, "get_value failed: %08x\n", hres);
1928 if(exval)
1929 ok_(__FILE__,line)(!strcmp_wa(val, exval), "value = %s, expected %s\n", wine_dbgstr_w(val), exval);
1930 else
1931 ok_(__FILE__,line)(!val, "value = %s, expected NULL\n", wine_dbgstr_w(val));
1932
1933 IHTMLDOMAttribute2_Release(attr2);
1934 SysFreeString(val);
1935 }
1936
1937 #define test_comment_attrs(c) _test_comment_attrs(__LINE__,c)
1938 static void _test_comment_attrs(unsigned line, IUnknown *unk)
1939 {
1940 IHTMLCommentElement *comment = _get_comment_iface(__LINE__,unk);
1941 IHTMLElement *elem = _get_elem_iface(__LINE__,unk);
1942 IHTMLElement4 *elem4 = _get_elem4_iface(__LINE__,unk);
1943 IHTMLDOMAttribute *attr;
1944 BSTR name = a2bstr("test");
1945 VARIANT val;
1946 HRESULT hres;
1947
1948 hres = IHTMLElement4_getAttributeNode(elem4, name, &attr);
1949 ok(hres == S_OK, "getAttributeNode failed: %08x\n", hres);
1950 ok(attr == NULL, "attr != NULL\n");
1951
1952 V_VT(&val) = VT_I4;
1953 V_I4(&val) = 1234;
1954 hres = IHTMLElement_setAttribute(elem, name, val, 0);
1955 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
1956
1957 hres = IHTMLElement4_getAttributeNode(elem4, name, &attr);
1958 ok(hres == S_OK, "getAttributeNode failed: %08x\n", hres);
1959 ok(attr != NULL, "attr == NULL\n");
1960
1961 test_attr_expando(attr, VARIANT_TRUE);
1962
1963 IHTMLDOMAttribute_Release(attr);
1964 IHTMLCommentElement_Release(comment);
1965 IHTMLElement_Release(elem);
1966 IHTMLElement4_Release(elem4);
1967 SysFreeString(name);
1968 }
1969
1970 #define test_object_vspace(u,s) _test_object_vspace(__LINE__,u,s)
1971 static void _test_object_vspace(unsigned line, IUnknown *unk, LONG exl)
1972 {
1973 IHTMLObjectElement *object = _get_object_iface(line, unk);
1974 LONG l;
1975 HRESULT hres;
1976
1977 l = 0xdeadbeef;
1978 hres = IHTMLObjectElement_get_vspace(object, &l);
1979 ok_(__FILE__,line)(hres == S_OK, "get_vspace failed: %08x\n", hres);
1980 ok_(__FILE__,line)(l == exl, "vspace=%d, expected %d\n", l, exl);
1981 IHTMLObjectElement_Release(object);
1982 }
1983
1984 #define test_object_name(a,b) _test_object_name(__LINE__,a,b)
1985 static void _test_object_name(unsigned line, IHTMLElement *elem, const char *exname)
1986 {
1987 IHTMLObjectElement *object = _get_object_iface(line, (IUnknown*)elem);
1988 BSTR str;
1989 HRESULT hres;
1990
1991 str = (void*)0xdeadbeef;
1992 hres = IHTMLObjectElement_get_name(object, &str);
1993 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
1994 if(exname)
1995 ok_(__FILE__,line)(!strcmp_wa(str, exname), "name=%s, expected %s\n", wine_dbgstr_w(str), exname);
1996 else
1997 ok_(__FILE__,line)(!str, "name=%s, expected NULL\n", wine_dbgstr_w(str));
1998 SysFreeString(str);
1999 IHTMLObjectElement_Release(object);
2000 }
2001
2002 #define set_object_name(a,b) _set_object_name(__LINE__,a,b)
2003 static void _set_object_name(unsigned line, IHTMLElement *elem, const char *name)
2004 {
2005 IHTMLObjectElement *object = _get_object_iface(line, (IUnknown*)elem);
2006 BSTR str;
2007 HRESULT hres;
2008
2009 str = a2bstr(name);
2010 hres = IHTMLObjectElement_put_name(object, str);
2011 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
2012 SysFreeString(str);
2013 IHTMLObjectElement_Release(object);
2014
2015 _test_object_name(line, elem, name);
2016 }
2017
2018 #define create_option_elem(d,t,v) _create_option_elem(__LINE__,d,t,v)
2019 static IHTMLOptionElement *_create_option_elem(unsigned line, IHTMLDocument2 *doc,
2020 const char *txt, const char *val)
2021 {
2022 IHTMLOptionElementFactory *factory;
2023 IHTMLOptionElement *option;
2024 IHTMLWindow2 *window;
2025 VARIANT text, value, empty;
2026 HRESULT hres;
2027
2028 hres = IHTMLDocument2_get_parentWindow(doc, &window);
2029 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
2030
2031 hres = IHTMLWindow2_get_Option(window, &factory);
2032 IHTMLWindow2_Release(window);
2033 ok_(__FILE__,line) (hres == S_OK, "get_Option failed: %08x\n", hres);
2034
2035 test_disp((IUnknown*)factory, &IID_IHTMLOptionElementFactory, "[object]");
2036
2037 V_VT(&text) = VT_BSTR;
2038 V_BSTR(&text) = a2bstr(txt);
2039 V_VT(&value) = VT_BSTR;
2040 V_BSTR(&value) = a2bstr(val);
2041 V_VT(&empty) = VT_EMPTY;
2042
2043 hres = IHTMLOptionElementFactory_create(factory, text, value, empty, empty, &option);
2044 ok_(__FILE__,line) (hres == S_OK, "create failed: %08x\n", hres);
2045
2046 IHTMLOptionElementFactory_Release(factory);
2047 VariantClear(&text);
2048 VariantClear(&value);
2049
2050 _test_option_text(line, option, txt);
2051 _test_option_value(line, option, val);
2052 _test_option_selected(line, option, VARIANT_FALSE);
2053
2054 return option;
2055 }
2056
2057 #define test_img_width(o,w) _test_img_width(__LINE__,o,w)
2058 static void _test_img_width(unsigned line, IHTMLImgElement *img, const LONG exp)
2059 {
2060 LONG found = -1;
2061 HRESULT hres;
2062
2063 hres = IHTMLImgElement_get_width(img, &found);
2064 ok_(__FILE__,line) (hres == S_OK, "get_width failed: %08x\n", hres);
2065 ok_(__FILE__,line) (found == exp, "width=%d\n", found);
2066 }
2067
2068 #define test_img_put_width(o,w) _test_img_put_width(__LINE__,o,w)
2069 static void _test_img_put_width(unsigned line, IHTMLImgElement *img, const LONG width)
2070 {
2071 HRESULT hres;
2072
2073 hres = IHTMLImgElement_put_width(img, width);
2074 ok(hres == S_OK, "put_width failed: %08x\n", hres);
2075
2076 _test_img_width(line, img, width);
2077 }
2078
2079 #define test_img_height(o,h) _test_img_height(__LINE__,o,h)
2080 static void _test_img_height(unsigned line, IHTMLImgElement *img, const LONG exp)
2081 {
2082 LONG found = -1;
2083 HRESULT hres;
2084
2085 hres = IHTMLImgElement_get_height(img, &found);
2086 ok_(__FILE__,line) (hres == S_OK, "get_height failed: %08x\n", hres);
2087 ok_(__FILE__,line) (found == exp, "height=%d\n", found);
2088 }
2089
2090 #define test_img_put_height(o,w) _test_img_put_height(__LINE__,o,w)
2091 static void _test_img_put_height(unsigned line, IHTMLImgElement *img, const LONG height)
2092 {
2093 HRESULT hres;
2094
2095 hres = IHTMLImgElement_put_height(img, height);
2096 ok(hres == S_OK, "put_height failed: %08x\n", hres);
2097
2098 _test_img_height(line, img, height);
2099 }
2100
2101 #define create_img_elem(d,t,v) _create_img_elem(__LINE__,d,t,v)
2102 static IHTMLImgElement *_create_img_elem(unsigned line, IHTMLDocument2 *doc,
2103 LONG wdth, LONG hght)
2104 {
2105 IHTMLImageElementFactory *factory;
2106 IHTMLImgElement *img;
2107 IHTMLWindow2 *window;
2108 VARIANT width, height;
2109 char buf[16];
2110 HRESULT hres;
2111
2112 hres = IHTMLDocument2_get_parentWindow(doc, &window);
2113 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
2114
2115 hres = IHTMLWindow2_get_Image(window, &factory);
2116 IHTMLWindow2_Release(window);
2117 ok_(__FILE__,line) (hres == S_OK, "get_Image failed: %08x\n", hres);
2118
2119 test_ifaces((IUnknown*)factory, img_factory_iids);
2120 test_disp((IUnknown*)factory, &IID_IHTMLImageElementFactory, "[object]");
2121
2122 if(wdth >= 0){
2123 snprintf(buf, 16, "%d", wdth);
2124 V_VT(&width) = VT_BSTR;
2125 V_BSTR(&width) = a2bstr(buf);
2126 }else{
2127 V_VT(&width) = VT_EMPTY;
2128 wdth = 0;
2129 }
2130
2131 if(hght >= 0){
2132 snprintf(buf, 16, "%d", hght);
2133 V_VT(&height) = VT_BSTR;
2134 V_BSTR(&height) = a2bstr(buf);
2135 }else{
2136 V_VT(&height) = VT_EMPTY;
2137 hght = 0;
2138 }
2139
2140 hres = IHTMLImageElementFactory_create(factory, width, height, &img);
2141 ok_(__FILE__,line) (hres == S_OK, "create failed: %08x\n", hres);
2142
2143 IHTMLImageElementFactory_Release(factory);
2144 VariantClear(&width);
2145 VariantClear(&height);
2146
2147 if(SUCCEEDED(hres)) {
2148 _test_img_width(line, img, wdth);
2149 _test_img_height(line, img, hght);
2150 return img;
2151 }
2152
2153 return NULL;
2154 }
2155
2156 #define test_select_length(s,l) _test_select_length(__LINE__,s,l)
2157 static void _test_select_length(unsigned line, IHTMLSelectElement *select, LONG length)
2158 {
2159 LONG len = 0xdeadbeef;
2160 HRESULT hres;
2161
2162 hres = IHTMLSelectElement_get_length(select, &len);
2163 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
2164 ok_(__FILE__,line) (len == length, "len=%d, expected %d\n", len, length);
2165 }
2166
2167 #define test_select_put_length(s,l) _test_select_put_length(__LINE__,s,l)
2168 static void _test_select_put_length(unsigned line, IUnknown *unk, LONG length)
2169 {
2170 IHTMLSelectElement *select = _get_select_iface(line, unk);
2171 HRESULT hres;
2172
2173 hres = IHTMLSelectElement_put_length(select, length);
2174 ok_(__FILE__,line) (hres == S_OK, "put_length failed: %08x\n", hres);
2175 _test_select_length(line, select, length);
2176 IHTMLSelectElement_Release(select);
2177 }
2178
2179 #define test_select_selidx(s,i) _test_select_selidx(__LINE__,s,i)
2180 static void _test_select_selidx(unsigned line, IHTMLSelectElement *select, LONG index)
2181 {
2182 LONG idx = 0xdeadbeef;
2183 HRESULT hres;
2184
2185 hres = IHTMLSelectElement_get_selectedIndex(select, &idx);
2186 ok_(__FILE__,line) (hres == S_OK, "get_selectedIndex failed: %08x\n", hres);
2187 ok_(__FILE__,line) (idx == index, "idx=%d, expected %d\n", idx, index);
2188 }
2189
2190 #define test_select_put_selidx(s,i) _test_select_put_selidx(__LINE__,s,i)
2191 static void _test_select_put_selidx(unsigned line, IHTMLSelectElement *select, LONG index)
2192 {
2193 HRESULT hres;
2194
2195 hres = IHTMLSelectElement_put_selectedIndex(select, index);
2196 ok_(__FILE__,line) (hres == S_OK, "get_selectedIndex failed: %08x\n", hres);
2197 _test_select_selidx(line, select, index);
2198 }
2199
2200 #define test_select_value(s,v) _test_select_value(__LINE__,s,v)
2201 static void _test_select_value(unsigned line, IHTMLSelectElement *select, const char *exval)
2202 {
2203 BSTR val;
2204 HRESULT hres;
2205
2206 hres = IHTMLSelectElement_get_value(select, &val);
2207 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
2208 if(exval)
2209 ok_(__FILE__,line) (!strcmp_wa(val, exval), "unexpected value %s\n", wine_dbgstr_w(val));
2210 else
2211 ok_(__FILE__,line) (val == NULL, "val=%s, expected NULL\n", wine_dbgstr_w(val));
2212 SysFreeString(val);
2213 }
2214
2215 #define test_select_set_value(s,v) _test_select_set_value(__LINE__,s,v)
2216 static void _test_select_set_value(unsigned line, IHTMLSelectElement *select, const char *val)
2217 {
2218 BSTR bstr;
2219 HRESULT hres;
2220
2221 bstr = a2bstr(val);
2222 hres = IHTMLSelectElement_put_value(select, bstr);
2223 SysFreeString(bstr);
2224 ok_(__FILE__,line) (hres == S_OK, "put_value failed: %08x\n", hres);
2225 }
2226
2227 #define test_select_type(s,t) _test_select_type(__LINE__,s,t)
2228 static void _test_select_type(unsigned line, IHTMLSelectElement *select, const char *extype)
2229 {
2230 BSTR type;
2231 HRESULT hres;
2232
2233 hres = IHTMLSelectElement_get_type(select, &type);
2234 ok_(__FILE__,line) (hres == S_OK, "get_type failed: %08x\n", hres);
2235 ok_(__FILE__,line) (!strcmp_wa(type, extype), "type=%s, expected %s\n", wine_dbgstr_w(type), extype);
2236 SysFreeString(type);
2237 }
2238
2239 #define test_select_multiple(s,t) _test_select_multiple(__LINE__,s,t)
2240 static void _test_select_multiple(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL exmultiple)
2241 {
2242 VARIANT_BOOL b = 100;
2243 HRESULT hres;
2244
2245 hres = IHTMLSelectElement_get_multiple(select, &b);
2246 ok_(__FILE__,line) (hres == S_OK, "get_multiple failed: %08x\n", hres);
2247 ok_(__FILE__,line) (b == exmultiple, "multiple=%x, expected %x\n", b, exmultiple);
2248 }
2249
2250 #define test_select_set_multiple(s,v) _test_select_set_multiple(__LINE__,s,v)
2251 static void _test_select_set_multiple(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL val)
2252 {
2253 HRESULT hres;
2254
2255 hres = IHTMLSelectElement_put_multiple(select, val);
2256 ok_(__FILE__,line) (hres == S_OK, "put_multiple failed: %08x\n", hres);
2257
2258 _test_select_multiple(line, select, val);
2259 }
2260
2261 #define test_select_size(s,v) _test_select_size(__LINE__,s,v)
2262 static void _test_select_size(unsigned line, IHTMLSelectElement *select, LONG exval)
2263 {
2264 HRESULT hres;
2265 LONG val;
2266
2267 hres = IHTMLSelectElement_get_size(select, NULL);
2268 ok_(__FILE__,line) (hres == E_INVALIDARG, "got %08x, expected E_INVALIDARG\n", hres);
2269
2270 val = 0xdeadbeef;
2271 hres = IHTMLSelectElement_get_size(select, &val);
2272 ok_(__FILE__,line) (hres == S_OK, "get_size failed: %08x\n", hres);
2273 ok_(__FILE__,line) (val == exval, "size = %d, expected %d\n", val, exval);
2274 }
2275
2276 #define test_select_set_size(s,v,e) _test_select_set_size(__LINE__,s,v,e)
2277 static void _test_select_set_size(unsigned line, IHTMLSelectElement *select, LONG val, HRESULT exhres)
2278 {
2279 HRESULT hres;
2280
2281 hres = IHTMLSelectElement_put_size(select, val);
2282 ok_(__FILE__,line) (hres == exhres, "put_size(%d) got %08x, expect %08x\n", val, hres, exhres);
2283 }
2284
2285 #define test_select_name(s,v) _test_select_name(__LINE__,s,v)
2286 static void _test_select_name(unsigned line, IHTMLSelectElement *select, const char *extext)
2287 {
2288 HRESULT hres;
2289 BSTR text;
2290
2291 text = NULL;
2292 hres = IHTMLSelectElement_get_name(select, &text);
2293 ok_(__FILE__,line) (hres == S_OK, "get_name failed: %08x\n", hres);
2294 if(extext) {
2295 ok_(__FILE__,line) (text != NULL, "text == NULL\n");
2296 ok_(__FILE__,line) (!strcmp_wa(text, extext), "name = %s, expected %s\n",
2297 wine_dbgstr_w(text), extext);
2298 SysFreeString(text);
2299 } else
2300 ok_(__FILE__,line) (text == NULL, "text(%p) = %s\n", text, wine_dbgstr_w(text));
2301 }
2302
2303 #define test_select_set_name(s,v) _test_select_set_name(__LINE__,s,v)
2304 static void _test_select_set_name(unsigned line, IHTMLSelectElement *select, const char *text)
2305 {
2306 HRESULT hres;
2307 BSTR bstr;
2308
2309 bstr = a2bstr(text);
2310
2311 hres = IHTMLSelectElement_put_name(select, bstr);
2312 ok_(__FILE__,line) (hres == S_OK, "put_name(%s) failed: %08x\n", wine_dbgstr_w(bstr), hres);
2313 SysFreeString(bstr);
2314 }
2315
2316 #define test_range_text(r,t) _test_range_text(__LINE__,r,t)
2317 static void _test_range_text(unsigned line, IHTMLTxtRange *range, const char *extext)
2318 {
2319 BSTR text;
2320 HRESULT hres;
2321
2322 hres = IHTMLTxtRange_get_text(range, &text);
2323 ok_(__FILE__, line) (hres == S_OK, "get_text failed: %08x\n", hres);
2324
2325 if(extext) {
2326 ok_(__FILE__, line) (text != NULL, "text == NULL\n");
2327 ok_(__FILE__, line) (!strcmp_wa(text, extext), "text=%s, expected %s\n", wine_dbgstr_w(text), extext);
2328 }else {
2329 ok_(__FILE__, line) (text == NULL, "text=%s, expected NULL\n", wine_dbgstr_w(text));
2330 }
2331
2332 SysFreeString(text);
2333
2334 }
2335
2336 #define test_range_collapse(r,b) _test_range_collapse(__LINE__,r,b)
2337 static void _test_range_collapse(unsigned line, IHTMLTxtRange *range, BOOL b)
2338 {
2339 HRESULT hres;
2340
2341 hres = IHTMLTxtRange_collapse(range, b);
2342 ok_(__FILE__, line) (hres == S_OK, "collapse failed: %08x\n", hres);
2343 _test_range_text(line, range, NULL);
2344 }
2345
2346 #define test_range_expand(r,u,b,t) _test_range_expand(__LINE__,r,u,b,t)
2347 static void _test_range_expand(unsigned line, IHTMLTxtRange *range, LPWSTR unit,
2348 VARIANT_BOOL exb, const char *extext)
2349 {
2350 VARIANT_BOOL b = 0xe0e0;
2351 HRESULT hres;
2352
2353 hres = IHTMLTxtRange_expand(range, unit, &b);
2354 ok_(__FILE__,line) (hres == S_OK, "expand failed: %08x\n", hres);
2355 ok_(__FILE__,line) (b == exb, "b=%x, expected %x\n", b, exb);
2356 _test_range_text(line, range, extext);
2357 }
2358
2359 #define test_range_move(r,u,c,e) _test_range_move(__LINE__,r,u,c,e)
2360 static void _test_range_move(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt)
2361 {
2362 LONG c = 0xdeadbeef;
2363 HRESULT hres;
2364
2365 hres = IHTMLTxtRange_move(range, unit, cnt, &c);
2366 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
2367 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
2368 _test_range_text(line, range, NULL);
2369 }
2370
2371 #define test_range_movestart(r,u,c,e) _test_range_movestart(__LINE__,r,u,c,e)
2372 static void _test_range_movestart(unsigned line, IHTMLTxtRange *range,
2373 LPWSTR unit, LONG cnt, LONG excnt)
2374 {
2375 LONG c = 0xdeadbeef;
2376 HRESULT hres;
2377
2378 hres = IHTMLTxtRange_moveStart(range, unit, cnt, &c);
2379 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
2380 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
2381 }
2382
2383 #define test_range_moveend(r,u,c,e) _test_range_moveend(__LINE__,r,u,c,e)
2384 static void _test_range_moveend(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt)
2385 {
2386 LONG c = 0xdeadbeef;
2387 HRESULT hres;
2388
2389 hres = IHTMLTxtRange_moveEnd(range, unit, cnt, &c);
2390 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
2391 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
2392 }
2393
2394 #define test_range_put_text(r,t) _test_range_put_text(__LINE__,r,t)
2395 static void _test_range_put_text(unsigned line, IHTMLTxtRange *range, const char *text)
2396 {
2397 HRESULT hres;
2398 BSTR bstr = a2bstr(text);
2399
2400 hres = IHTMLTxtRange_put_text(range, bstr);
2401 ok_(__FILE__,line) (hres == S_OK, "put_text failed: %08x\n", hres);
2402 SysFreeString(bstr);
2403 _test_range_text(line, range, NULL);
2404 }
2405
2406 #define test_range_inrange(r1,r2,b) _test_range_inrange(__LINE__,r1,r2,b)
2407 static void _test_range_inrange(unsigned line, IHTMLTxtRange *range1, IHTMLTxtRange *range2, VARIANT_BOOL exb)
2408 {
2409 VARIANT_BOOL b;
2410 HRESULT hres;
2411
2412 b = 0xe0e0;
2413 hres = IHTMLTxtRange_inRange(range1, range2, &b);
2414 ok_(__FILE__,line) (hres == S_OK, "(1->2) isEqual failed: %08x\n", hres);
2415 ok_(__FILE__,line) (b == exb, "(1->2) b=%x, expected %x\n", b, exb);
2416 }
2417
2418 #define test_range_isequal(r1,r2,b) _test_range_isequal(__LINE__,r1,r2,b)
2419 static void _test_range_isequal(unsigned line, IHTMLTxtRange *range1, IHTMLTxtRange *range2, VARIANT_BOOL exb)
2420 {
2421 VARIANT_BOOL b;
2422 HRESULT hres;
2423
2424 b = 0xe0e0;
2425 hres = IHTMLTxtRange_isEqual(range1, range2, &b);
2426 ok_(__FILE__,line) (hres == S_OK, "(1->2) isEqual failed: %08x\n", hres);
2427 ok_(__FILE__,line) (b == exb, "(1->2) b=%x, expected %x\n", b, exb);
2428
2429 b = 0xe0e0;
2430 hres = IHTMLTxtRange_isEqual(range2, range1, &b);
2431 ok_(__FILE__,line) (hres == S_OK, "(2->1) isEqual failed: %08x\n", hres);
2432 ok_(__FILE__,line) (b == exb, "(2->1) b=%x, expected %x\n", b, exb);
2433
2434 if(exb) {
2435 test_range_inrange(range1, range2, VARIANT_TRUE);
2436 test_range_inrange(range2, range1, VARIANT_TRUE);
2437 }
2438 }
2439
2440 #define test_range_paste_html(a,b) _test_range_paste_html(__LINE__,a,b)
2441 static void _test_range_paste_html(unsigned line, IHTMLTxtRange *range, const char *html)
2442 {
2443 BSTR str = a2bstr(html);
2444 HRESULT hres;
2445
2446 hres = IHTMLTxtRange_pasteHTML(range, str);
2447 ok_(__FILE__,line)(hres == S_OK, "pasteHTML failed: %08x\n", hres);
2448 SysFreeString(str);
2449 }
2450
2451 #define test_range_parent(r,t) _test_range_parent(__LINE__,r,t)
2452 static void _test_range_parent(unsigned line, IHTMLTxtRange *range, elem_type_t type)
2453 {
2454 IHTMLElement *elem;
2455 HRESULT hres;
2456
2457 hres = IHTMLTxtRange_parentElement(range, &elem);
2458 ok_(__FILE__,line) (hres == S_OK, "parentElement failed: %08x\n", hres);
2459
2460 _test_elem_type(line, (IUnknown*)elem, type);
2461
2462 IHTMLElement_Release(elem);
2463 }
2464
2465 #define get_elem_col_item_idx(a,b) _get_elem_col_item_idx(__LINE__,a,b)
2466 static IHTMLElement *_get_elem_col_item_idx(unsigned line, IHTMLElementCollection *col, int i)
2467 {
2468 VARIANT name, index;
2469 IHTMLElement *elem;
2470 IDispatch *disp;
2471 HRESULT hres;
2472
2473 V_VT(&index) = VT_EMPTY;
2474 V_VT(&name) = VT_I4;
2475 V_I4(&name) = i;
2476 hres = IHTMLElementCollection_item(col, name, index, &disp);
2477 ok_(__FILE__,line)(hres == S_OK, "item failed: %08x\n", hres);
2478 ok_(__FILE__,line)(disp != NULL, "disp == NULL\n");
2479
2480 elem = _get_elem_iface(line, (IUnknown*)disp);
2481 IDispatch_Release(disp);
2482 return elem;
2483 }
2484
2485 #define test_elem_collection(c,t,l) _test_elem_collection(__LINE__,c,t,l)
2486 static void _test_elem_collection(unsigned line, IUnknown *unk,
2487 const elem_type_t *elem_types, LONG exlen)
2488 {
2489 IHTMLElementCollection *col;
2490 IEnumVARIANT *enum_var;
2491 IUnknown *enum_unk;
2492 ULONG fetched;
2493 LONG len;
2494 DWORD i;
2495 VARIANT name, index, v, vs[5];
2496 IDispatch *disp, *disp2;
2497 HRESULT hres;
2498
2499 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElementCollection, (void**)&col);
2500 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElementCollection: %08x\n", hres);
2501
2502 test_disp((IUnknown*)col, &DIID_DispHTMLElementCollection, "[object]");
2503
2504 hres = IHTMLElementCollection_get_length(col, &len);
2505 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
2506 ok_(__FILE__,line) (len == exlen, "len=%d, expected %d\n", len, exlen);
2507
2508 if(len > exlen)
2509 len = exlen;
2510
2511 V_VT(&index) = VT_EMPTY;
2512
2513 hres = IHTMLElementCollection_get__newEnum(col, &enum_unk);
2514 ok_(__FILE__,line)(hres == S_OK, "_newEnum failed: %08x\n", hres);
2515
2516 hres = IUnknown_QueryInterface(enum_unk, &IID_IEnumVARIANT, (void**)&enum_var);
2517 IUnknown_Release(enum_unk);
2518 ok_(__FILE__,line)(hres == S_OK, "Could not get IEnumVARIANT iface: %08x\n", hres);
2519
2520 for(i=0; i<len; i++) {
2521 V_VT(&name) = VT_I4;
2522 V_I4(&name) = i;
2523 disp = (void*)0xdeadbeef;
2524 hres = IHTMLElementCollection_item(col, name, index, &disp);
2525 ok_(__FILE__,line) (hres == S_OK, "item(%d) failed: %08x\n", i, hres);
2526 ok_(__FILE__,line) (disp != NULL, "item returned NULL\n");
2527 if(FAILED(hres) || !disp)
2528 continue;
2529
2530 _test_elem_type(line, (IUnknown*)disp, elem_types[i]);
2531
2532 if(!i) {
2533 V_VT(&name) = VT_UINT;
2534 V_I4(&name) = 0;
2535 disp2 = (void*)0xdeadbeef;
2536 hres = IHTMLElementCollection_item(col, name, index, &disp2);
2537 ok_(__FILE__,line) (hres == S_OK, "item(%d) failed: %08x\n", i, hres);
2538 ok_(__FILE__,line) (iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n");
2539 if(disp2)
2540 IDispatch_Release(disp2);
2541 }
2542
2543 fetched = 0;
2544 V_VT(&v) = VT_ERROR;
2545 hres = IEnumVARIANT_Next(enum_var, 1, &v, i ? &fetched : NULL);
2546 ok_(__FILE__,line)(hres == S_OK, "Next failed: %08x\n", hres);
2547 if(i)
2548 ok_(__FILE__,line)(fetched == 1, "fetched = %d\n", fetched);
2549 ok_(__FILE__,line)(V_VT(&v) == VT_DISPATCH && V_DISPATCH(&v), "V_VT(v) = %d\n", V_VT(&v));
2550 ok_(__FILE__,line)(iface_cmp((IUnknown*)disp, (IUnknown*)V_DISPATCH(&v)), "disp != V_DISPATCH(v)\n");
2551 IDispatch_Release(V_DISPATCH(&v));
2552
2553 IDispatch_Release(disp);
2554 }
2555
2556 fetched = 0xdeadbeef;
2557 V_VT(&v) = VT_BOOL;
2558 hres = IEnumVARIANT_Next(enum_var, 1, &v, &fetched);
2559 ok_(__FILE__,line)(hres == S_FALSE, "Next returned %08x, expected S_FALSE\n", hres);
2560 ok_(__FILE__,line)(fetched == 0, "fetched = %d\n", fetched);
2561 ok_(__FILE__,line)(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
2562
2563 hres = IEnumVARIANT_Reset(enum_var);
2564 ok_(__FILE__,line)(hres == S_OK, "Reset failed: %08x\n", hres);
2565
2566 fetched = 0xdeadbeef;
2567 V_VT(&v) = VT_BOOL;
2568 hres = IEnumVARIANT_Next(enum_var, 0, &v, &fetched);
2569 ok_(__FILE__,line)(hres == S_OK, "Next returned %08x, expected S_FALSE\n", hres);
2570 ok_(__FILE__,line)(fetched == 0, "fetched = %d\n", fetched);
2571 ok_(__FILE__,line)(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
2572
2573 hres = IEnumVARIANT_Skip(enum_var, len > 2 ? len-2 : 0);
2574 ok_(__FILE__,line)(hres == S_OK, "Skip failed: %08x\n", hres);
2575
2576 memset(vs, 0, sizeof(vs));
2577 fetched = 0;
2578 hres = IEnumVARIANT_Next(enum_var, sizeof(vs)/sizeof(*vs), vs, &fetched);
2579 ok_(__FILE__,line)(hres == S_FALSE, "Next failed: %08x\n", hres);
2580 ok_(__FILE__,line)(fetched == (len > 2 ? 2 : len), "fetched = %d\n", fetched);
2581 if(len) {
2582 ok_(__FILE__,line)(V_VT(vs) == VT_DISPATCH && V_DISPATCH(vs), "V_VT(vs[0]) = %d\n", V_VT(vs));
2583 IDispatch_Release(V_DISPATCH(vs));
2584 }
2585 if(len > 1) {
2586 ok_(__FILE__,line)(V_VT(vs+1) == VT_DISPATCH && V_DISPATCH(vs+1), "V_VT(vs[1]) = %d\n", V_VT(vs+1));
2587 IDispatch_Release(V_DISPATCH(vs+1));
2588 }
2589
2590 hres = IEnumVARIANT_Reset(enum_var);
2591 ok_(__FILE__,line)(hres == S_OK, "Reset failed: %08x\n", hres);
2592
2593 hres = IEnumVARIANT_Skip(enum_var, len+1);
2594 ok_(__FILE__,line)(hres == S_FALSE, "Skip failed: %08x\n", hres);
2595
2596 IEnumVARIANT_Release(enum_var);
2597
2598 V_VT(&name) = VT_I4;
2599 V_I4(&name) = len;
2600 disp = (void*)0xdeadbeef;
2601 hres = IHTMLElementCollection_item(col, name, index, &disp);
2602 ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres);
2603 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
2604
2605 V_VT(&name) = VT_UI4;
2606 V_I4(&name) = len;
2607 disp = (void*)0xdeadbeef;
2608 hres = IHTMLElementCollection_item(col, name, index, &disp);
2609 ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres);
2610 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
2611
2612 V_VT(&name) = VT_INT;
2613 V_I4(&name) = len;
2614 disp = (void*)0xdeadbeef;
2615 hres = IHTMLElementCollection_item(col, name, index, &disp);
2616 ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres);
2617 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
2618
2619 V_VT(&name) = VT_UINT;
2620 V_I4(&name) = len;
2621 disp = (void*)0xdeadbeef;
2622 hres = IHTMLElementCollection_item(col, name, index, &disp);
2623 ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres);
2624 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
2625
2626 V_VT(&name) = VT_I4;
2627 V_I4(&name) = -1;
2628 disp = (void*)0xdeadbeef;
2629 hres = IHTMLElementCollection_item(col, name, index, &disp);
2630 ok_(__FILE__,line) (hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
2631 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
2632
2633 IHTMLElementCollection_Release(col);
2634 }
2635
2636 #define test_elem_all(c,t,l) _test_elem_all(__LINE__,c,t,l)
2637 static void _test_elem_all(unsigned line, IUnknown *unk, const elem_type_t *elem_types, LONG exlen)
2638 {
2639 IHTMLElement *elem = _get_elem_iface(line, unk);
2640 IDispatch *disp;
2641 HRESULT hres;
2642
2643 hres = IHTMLElement_get_all(elem, &disp);
2644 IHTMLElement_Release(elem);
2645 ok_(__FILE__,line)(hres == S_OK, "get_all failed: %08x\n", hres);
2646
2647 _test_elem_collection(line, (IUnknown*)disp, elem_types, exlen);
2648 IDispatch_Release(disp);
2649 }
2650
2651 #define test_doc_all(a,b,c) _test_doc_all(__LINE__,a,b,c)
2652 static void _test_doc_all(unsigned line, IHTMLDocument2 *doc, const elem_type_t *elem_types, LONG exlen)
2653 {
2654 IHTMLElementCollection *col;
2655 HRESULT hres;
2656
2657 hres = IHTMLDocument2_get_all(doc, &col);
2658 ok_(__FILE__,line)(hres == S_OK, "get_all failed: %08x\n", hres);
2659
2660 _test_elem_collection(line, (IUnknown*)col, elem_types, exlen);
2661 IHTMLElementCollection_Release(col);
2662 }
2663
2664 #define test_elem_getelembytag(a,b,c,d) _test_elem_getelembytag(__LINE__,a,b,c,d)
2665 static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t type, LONG exlen, IHTMLElement **ret)
2666 {
2667 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
2668 IHTMLElementCollection *col = NULL;
2669 elem_type_t *types = NULL;
2670 BSTR tmp;
2671 int i;
2672 HRESULT hres;
2673
2674 tmp = a2bstr(elem_type_infos[type].tag);
2675 hres = IHTMLElement2_getElementsByTagName(elem, tmp, &col);
2676 SysFreeString(tmp);
2677 IHTMLElement2_Release(elem);
2678 ok_(__FILE__,line) (hres == S_OK, "getElementByTagName failed: %08x\n", hres);
2679 ok_(__FILE__,line) (col != NULL, "col == NULL\n");
2680
2681 if(exlen) {
2682 types = HeapAlloc(GetProcessHeap(), 0, exlen*sizeof(elem_type_t));
2683 for(i=0; i<exlen; i++)
2684 types[i] = type;
2685 }
2686
2687 _test_elem_collection(line, (IUnknown*)col, types, exlen);
2688
2689 HeapFree(GetProcessHeap(), 0, types);
2690
2691 if(ret)
2692 *ret = get_elem_col_item_idx(col, 0);
2693 IHTMLElementCollection_Release(col);
2694 }
2695
2696 #define test_elem_innertext(e,t) _test_elem_innertext(__LINE__,e,t)
2697 static void _test_elem_innertext(unsigned line, IHTMLElement *elem, const char *extext)
2698 {
2699 BSTR text = NULL;
2700 HRESULT hres;
2701
2702 hres = IHTMLElement_get_innerText(elem, &text);
2703 ok_(__FILE__,line) (hres == S_OK, "get_innerText failed: %08x\n", hres);
2704 if(extext)
2705 ok_(__FILE__,line) (!strcmp_wa(text, extext), "get_innerText returned %s expected %s\n",
2706 wine_dbgstr_w(text), extext);
2707 else
2708 ok_(__FILE__,line) (!text, "get_innerText returned %s expected NULL\n", wine_dbgstr_w(text));
2709 SysFreeString(text);
2710 }
2711
2712 #define test_elem_set_innertext(e,t) _test_elem_set_innertext(__LINE__,e,t)
2713 static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const char *text)
2714 {
2715 IHTMLDOMChildrenCollection *col;
2716 BSTR str;
2717 HRESULT hres;
2718
2719 str = a2bstr(text);
2720 hres = IHTMLElement_put_innerText(elem, str);
2721 ok_(__FILE__,line) (hres == S_OK, "put_innerText failed: %08x\n", hres);
2722 SysFreeString(str);
2723
2724 _test_elem_innertext(line, elem, text);
2725
2726
2727 col = _get_child_nodes(line, (IUnknown*)elem);
2728 ok(col != NULL, "col == NULL\n");
2729 if(col) {
2730 LONG length = 0, type;
2731 IHTMLDOMNode *node;
2732
2733 hres = IHTMLDOMChildrenCollection_get_length(col, &length);
2734 ok(hres == S_OK, "get_length failed: %08x\n", hres);
2735 ok(length == 1, "length = %d\n", length);
2736
2737 node = _get_child_item(line, col, 0);
2738 ok(node != NULL, "node == NULL\n");
2739 if(node) {
2740 type = _get_node_type(line, (IUnknown*)node);
2741 ok(type == 3, "type=%d\n", type);
2742 IHTMLDOMNode_Release(node);
2743 }
2744
2745 IHTMLDOMChildrenCollection_Release(col);
2746 }
2747
2748 }
2749
2750 #define test_elem_innerhtml(e,t) _test_elem_innerhtml(__LINE__,e,t)
2751 static void _test_elem_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
2752 {
2753 IHTMLElement *elem = _get_elem_iface(line, unk);
2754 BSTR html;
2755 HRESULT hres;
2756
2757 hres = IHTMLElement_get_innerHTML(elem, &html);
2758 ok_(__FILE__,line)(hres == S_OK, "get_innerHTML failed: %08x\n", hres);
2759 if(inner_html)
2760 ok_(__FILE__,line)(!strcmp_wa(html, inner_html), "unexpected innerHTML: %s\n", wine_dbgstr_w(html));
2761 else
2762 ok_(__FILE__,line)(!html, "innerHTML = %s\n", wine_dbgstr_w(html));
2763
2764 IHTMLElement_Release(elem);
2765 SysFreeString(html);
2766 }
2767
2768 #define test_elem_set_innerhtml(e,t) _test_elem_set_innerhtml(__LINE__,e,t)
2769 static void _test_elem_set_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
2770 {
2771 IHTMLElement *elem = _get_elem_iface(line, unk);
2772 BSTR html;
2773 HRESULT hres;
2774
2775 html = a2bstr(inner_html);
2776 hres = IHTMLElement_put_innerHTML(elem, html);
2777 ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08x\n", hres);
2778
2779 IHTMLElement_Release(elem);
2780 SysFreeString(html);
2781 }
2782
2783 #define test_elem_set_outerhtml(e,t) _test_elem_set_outerhtml(__LINE__,e,t)
2784 static void _test_elem_set_outerhtml(unsigned line, IUnknown *unk, const char *outer_html)
2785 {
2786 IHTMLElement *elem = _get_elem_iface(line, unk);
2787 BSTR html;
2788 HRESULT hres;
2789
2790 html = a2bstr(outer_html);
2791 hres = IHTMLElement_put_outerHTML(elem, html);
2792 ok_(__FILE__,line)(hres == S_OK, "put_outerHTML failed: %08x\n", hres);
2793
2794 IHTMLElement_Release(elem);
2795 SysFreeString(html);
2796 }
2797
2798 #define test_elem_outerhtml(e,t) _test_elem_outerhtml(__LINE__,e,t)
2799 static void _test_elem_outerhtml(unsigned line, IUnknown *unk, const char *outer_html)
2800 {
2801 IHTMLElement *elem = _get_elem_iface(line, unk);
2802 BSTR html;
2803 HRESULT hres;
2804
2805 hres = IHTMLElement_get_outerHTML(elem, &html);
2806 ok_(__FILE__,line)(hres == S_OK, "get_outerHTML failed: %08x\n", hres);
2807 ok_(__FILE__,line)(!strcmp_wa(html, outer_html), "outerHTML = '%s', expected '%s'\n", wine_dbgstr_w(html), outer_html);
2808
2809 IHTMLElement_Release(elem);
2810 SysFreeString(html);
2811 }
2812
2813 #define test_elem_contains(a,b,c) _test_elem_contains(__LINE__,a,b,c)
2814 static void _test_elem_contains(unsigned line, IHTMLElement *elem, IHTMLElement *elem2, VARIANT_BOOL exval)
2815 {
2816 VARIANT_BOOL b;
2817 HRESULT hres;
2818
2819 b = 100;
2820 hres = IHTMLElement_contains(elem, elem2, &b);
2821 ok_(__FILE__,line)(hres == S_OK, "contains failed: %08x\n", hres);
2822 ok_(__FILE__,line)(b == exval, "contains returned %x, expected %x\n", b, exval);
2823 }
2824
2825 #define test_elem_istextedit(a,b) _test_elem_istextedit(__LINE__,a,b)
2826 static void _test_elem_istextedit(unsigned line, IHTMLElement *elem, VARIANT_BOOL exval)
2827 {
2828 VARIANT_BOOL b;
2829 HRESULT hres;
2830
2831 b = 100;
2832 hres = IHTMLElement_get_isTextEdit(elem, &b);
2833 ok_(__FILE__,line)(hres == S_OK, "isTextEdit failed: %08x\n", hres);
2834 ok_(__FILE__,line)(b == exval, "isTextEdit = %x\n", b);
2835 }
2836
2837 #define get_first_child(n) _get_first_child(__LINE__,n)
2838 static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk)
2839 {
2840 IHTMLDOMNode *node = _get_node_iface(line, unk);
2841 IHTMLDOMNode *child = NULL;
2842 HRESULT hres;
2843
2844 hres = IHTMLDOMNode_get_firstChild(node, &child);
2845 IHTMLDOMNode_Release(node);
2846 ok_(__FILE__,line) (hres == S_OK, "get_firstChild failed: %08x\n", hres);
2847
2848 return child;
2849 }
2850
2851 #define test_node_has_child(u,b) _test_node_has_child(__LINE__,u,b)
2852 static void _test_node_has_child(unsigned line, IUnknown *unk, VARIANT_BOOL exb)
2853 {
2854 IHTMLDOMNode *node = _get_node_iface(line, unk);
2855 VARIANT_BOOL b = 0xdead;
2856 HRESULT hres;
2857
2858 hres = IHTMLDOMNode_hasChildNodes(node, &b);
2859 ok_(__FILE__,line) (hres == S_OK, "hasChildNodes failed: %08x\n", hres);
2860 ok_(__FILE__,line) (b == exb, "hasChildNodes=%x, expected %x\n", b, exb);
2861
2862 IHTMLDOMNode_Release(node);
2863 }
2864
2865 #define test_node_get_parent(u) _test_node_get_parent(__LINE__,u)
2866 static IHTMLDOMNode *_test_node_get_parent(unsigned line, IUnknown *unk)
2867 {
2868 IHTMLDOMNode *node = _get_node_iface(line, unk);
2869 IHTMLDOMNode *parent;
2870 HRESULT hres;
2871
2872 hres = IHTMLDOMNode_get_parentNode(node, &parent);
2873 IHTMLDOMNode_Release(node);
2874 ok_(__FILE__,line) (hres == S_OK, "get_parentNode failed: %08x\n", hres);
2875
2876 return parent;
2877 }
2878
2879 #define node_get_next(u) _node_get_next(__LINE__,u)
2880 static IHTMLDOMNode *_node_get_next(unsigned line, IUnknown *unk)
2881 {
2882 IHTMLDOMNode *node = _get_node_iface(line, unk);
2883 IHTMLDOMNode *next;
2884 HRESULT hres;
2885
2886 hres = IHTMLDOMNode_get_nextSibling(node, &next);
2887 IHTMLDOMNode_Release(node);
2888 ok_(__FILE__,line) (hres == S_OK, "get_nextSiblibg failed: %08x\n", hres);
2889
2890 return next;
2891 }
2892
2893 #define node_get_prev(u) _node_get_prev(__LINE__,u)
2894 static IHTMLDOMNode *_node_get_prev(unsigned line, IUnknown *unk)
2895 {
2896 IHTMLDOMNode *node = _get_node_iface(line, unk);
2897 IHTMLDOMNode *prev;
2898 HRESULT hres;
2899
2900 hres = IHTMLDOMNode_get_previousSibling(node, &prev);
2901 IHTMLDOMNode_Release(node);
2902 ok_(__FILE__,line) (hres == S_OK, "get_previousSibling failed: %08x\n", hres);
2903
2904 return prev;
2905 }
2906
2907 #define test_elem_get_parent(u) _test_elem_get_parent(__LINE__,u)
2908 static IHTMLElement *_test_elem_get_parent(unsigned line, IUnknown *unk)
2909 {
2910 IHTMLElement *elem = _get_elem_iface(line, unk);
2911 IHTMLElement *parent;
2912 HRESULT hres;
2913
2914 hres = IHTMLElement_get_parentElement(elem, &parent);
2915 IHTMLElement_Release(elem);
2916 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
2917
2918 return parent;
2919 }
2920
2921 #define test_elem3_get_disabled(i,b) _test_elem3_get_disabled(__LINE__,i,b)
2922 static void _test_elem3_get_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL exb)
2923 {
2924 IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
2925 VARIANT_BOOL disabled = 100;
2926 HRESULT hres;
2927
2928 if (!elem3) return;
2929 hres = IHTMLElement3_get_disabled(elem3, &disabled);
2930 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
2931 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
2932 IHTMLElement3_Release(elem3);
2933 }
2934
2935 #define test_elem3_set_disabled(i,b) _test_elem3_set_disabled(__LINE__,i,b)
2936 static void _test_elem3_set_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL b)
2937 {
2938 IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
2939 HRESULT hres;
2940
2941 if (!elem3) return;
2942 hres = IHTMLElement3_put_disabled(elem3, b);
2943 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
2944
2945 IHTMLElement3_Release(elem3);
2946 _test_elem3_get_disabled(line, unk, b);
2947 }
2948
2949 #define test_select_get_disabled(i,b) _test_select_get_disabled(__LINE__,i,b)
2950 static void _test_select_get_disabled(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL exb)
2951 {
2952 VARIANT_BOOL disabled = 100;
2953 HRESULT hres;
2954
2955 hres = IHTMLSelectElement_get_disabled(select, &disabled);
2956 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
2957 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
2958
2959 _test_elem3_get_disabled(line, (IUnknown*)select, exb);
2960 }
2961
2962 static void test_select_remove(IHTMLSelectElement *select)
2963 {
2964 HRESULT hres;
2965
2966 hres = IHTMLSelectElement_remove(select, 3);
2967 ok(hres == S_OK, "remove failed: %08x, expected S_OK\n", hres);
2968 test_select_length(select, 2);
2969
2970 hres = IHTMLSelectElement_remove(select, -1);
2971 ok(hres == E_INVALIDARG, "remove failed: %08x, expected E_INVALIDARG\n", hres);
2972 test_select_length(select, 2);
2973
2974 hres = IHTMLSelectElement_remove(select, 0);
2975 ok(hres == S_OK, "remove failed:%08x\n", hres);
2976 test_select_length(select, 1);
2977 }
2978
2979 #define test_text_length(u,l) _test_text_length(__LINE__,u,l)
2980 static void _test_text_length(unsigned line, IUnknown *unk, LONG l)
2981 {
2982 IHTMLDOMTextNode *text = _get_text_iface(line, unk);
2983 LONG length;
2984 HRESULT hres;
2985
2986 hres = IHTMLDOMTextNode_get_length(text, &length);
2987 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
2988 ok_(__FILE__,line)(length == l, "length = %d, expected %d\n", length, l);
2989 IHTMLDOMTextNode_Release(text);
2990 }
2991
2992 #define test_text_data(a,b) _test_text_data(__LINE__,a,b)
2993 static void _test_text_data(unsigned line, IUnknown *unk, const char *exdata)
2994 {
2995 IHTMLDOMTextNode *text = _get_text_iface(line, unk);
2996 BSTR str;
2997 HRESULT hres;
2998
2999 hres = IHTMLDOMTextNode_get_data(text, &str);
3000 ok_(__FILE__,line)(hres == S_OK, "get_data failed: %08x\n", hres);
3001 ok_(__FILE__,line)(!strcmp_wa(str, exdata), "data = %s, expected %s\n", wine_dbgstr_w(str), exdata);
3002 IHTMLDOMTextNode_Release(text);
3003 SysFreeString(str);
3004 }
3005
3006 #define set_text_data(a,b) _set_text_data(__LINE__,a,b)
3007 static void _set_text_data(unsigned line, IUnknown *unk, const char *data)
3008 {
3009 IHTMLDOMTextNode *text = _get_text_iface(line, unk);
3010 BSTR str = a2bstr(data);
3011 HRESULT hres;
3012
3013 hres = IHTMLDOMTextNode_put_data(text, str);
3014 ok_(__FILE__,line)(hres == S_OK, "get_data failed: %08x\n", hres);
3015 IHTMLDOMTextNode_Release(text);
3016 SysFreeString(str);
3017 }
3018
3019 #define text_append_data(a,b) _text_append_data(__LINE__,a,b)
3020 static void _text_append_data(unsigned line, IUnknown *unk, const char *data)
3021 {
3022 IHTMLDOMTextNode2 *text = _get_text2_iface(line, unk);
3023 BSTR str = a2bstr(data);
3024 HRESULT hres;
3025
3026 hres = IHTMLDOMTextNode2_appendData(text, str);
3027 ok_(__FILE__,line)(hres == S_OK, "appendData failed: %08x\n", hres);
3028 IHTMLDOMTextNode2_Release(text);
3029 SysFreeString(str);
3030 }
3031
3032 #define test_select_set_disabled(i,b) _test_select_set_disabled(__LINE__,i,b)
3033 static void _test_select_set_disabled(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL b)
3034 {
3035 HRESULT hres;
3036
3037 hres = IHTMLSelectElement_put_disabled(select, b);
3038 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
3039
3040 _test_select_get_disabled(line, select, b);
3041 }
3042
3043 #define test_elem_dir(u,n) _test_elem_dir(__LINE__,u,n)
3044 static void _test_elem_dir(unsigned line, IUnknown *unk, const char *exdir)
3045 {
3046 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3047 BSTR dir;
3048 HRESULT hres;
3049
3050 hres = IHTMLElement2_get_dir(elem, &dir);
3051 IHTMLElement2_Release(elem);
3052 ok_(__FILE__, line) (hres == S_OK, "get_dir failed: %08x\n", hres);
3053 if(exdir)
3054 ok_(__FILE__, line) (!strcmp_wa(dir, exdir), "got dir: %s, expected %s\n", wine_dbgstr_w(dir), exdir);
3055 else
3056 ok_(__FILE__, line) (!dir, "got dir: %s, expected NULL\n", wine_dbgstr_w(dir));
3057
3058 SysFreeString(dir);
3059 }
3060
3061 #define set_elem_dir(u,n) _set_elem_dir(__LINE__,u,n)
3062 static void _set_elem_dir(unsigned line, IUnknown *unk, const char *dira)
3063 {
3064 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3065 BSTR dir = a2bstr(dira);
3066 HRESULT hres;
3067
3068 hres = IHTMLElement2_put_dir(elem, dir);
3069 IHTMLElement2_Release(elem);
3070 ok_(__FILE__, line) (hres == S_OK, "put_dir failed: %08x\n", hres);
3071 SysFreeString(dir);
3072
3073 _test_elem_dir(line, unk, dira);
3074 }
3075
3076 #define elem_get_scroll_height(u) _elem_get_scroll_height(__LINE__,u)
3077 static LONG _elem_get_scroll_height(unsigned line, IUnknown *unk)
3078 {
3079 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3080 IHTMLTextContainer *txtcont;
3081 LONG l = -1, l2 = -1;
3082 HRESULT hres;
3083
3084 hres = IHTMLElement2_get_scrollHeight(elem, &l);
3085 ok_(__FILE__,line) (hres == S_OK, "get_scrollHeight failed: %08x\n", hres);
3086 IHTMLElement2_Release(elem);
3087
3088 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
3089 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
3090
3091 hres = IHTMLTextContainer_get_scrollHeight(txtcont, &l2);
3092 IHTMLTextContainer_Release(txtcont);
3093 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollHeight failed: %d\n", l2);
3094 ok_(__FILE__,line) (l == l2, "unexpected height %d, expected %d\n", l2, l);
3095
3096 return l;
3097 }
3098
3099 #define elem_get_scroll_width(u) _elem_get_scroll_width(__LINE__,u)
3100 static LONG _elem_get_scroll_width(unsigned line, IUnknown *unk)
3101 {
3102 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3103 IHTMLTextContainer *txtcont;
3104 LONG l = -1, l2 = -1;
3105 HRESULT hres;
3106
3107 hres = IHTMLElement2_get_scrollWidth(elem, &l);
3108 ok_(__FILE__,line) (hres == S_OK, "get_scrollWidth failed: %08x\n", hres);
3109 IHTMLElement2_Release(elem);
3110
3111 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
3112 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
3113
3114 hres = IHTMLTextContainer_get_scrollWidth(txtcont, &l2);
3115 IHTMLTextContainer_Release(txtcont);
3116 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollWidth failed: %d\n", l2);
3117 ok_(__FILE__,line) (l == l2, "unexpected width %d, expected %d\n", l2, l);
3118
3119 return l;
3120 }
3121
3122 #define elem_get_scroll_top(u) _elem_get_scroll_top(__LINE__,u)
3123 static LONG _elem_get_scroll_top(unsigned line, IUnknown *unk)
3124 {
3125 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3126 IHTMLTextContainer *txtcont;
3127 LONG l = -1, l2 = -1;
3128 HRESULT hres;
3129
3130 hres = IHTMLElement2_get_scrollTop(elem, &l);
3131 ok_(__FILE__,line) (hres == S_OK, "get_scrollTop failed: %08x\n", hres);
3132 IHTMLElement2_Release(elem);
3133
3134 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
3135 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
3136
3137 hres = IHTMLTextContainer_get_scrollTop(txtcont, &l2);
3138 IHTMLTextContainer_Release(txtcont);
3139 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollTop failed: %d\n", l2);
3140 ok_(__FILE__,line) (l == l2, "unexpected top %d, expected %d\n", l2, l);
3141
3142 return l;
3143 }
3144
3145 #define elem_get_scroll_left(u) _elem_get_scroll_left(__LINE__,u)
3146 static void _elem_get_scroll_left(unsigned line, IUnknown *unk)
3147 {
3148 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
3149 IHTMLTextContainer *txtcont;
3150 LONG l = -1, l2 = -1;
3151 HRESULT hres;
3152
3153 hres = IHTMLElement2_get_scrollLeft(elem, NULL);
3154 ok(hres == E_INVALIDARG, "expect E_INVALIDARG got 0x%08x\n", hres);
3155
3156 hres = IHTMLElement2_get_scrollLeft(elem, &l);
3157 ok(hres == S_OK, "get_scrollTop failed: %08x\n", hres);
3158 IHTMLElement2_Release(elem);
3159
3160 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
3161 ok(hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
3162
3163 hres = IHTMLTextContainer_get_scrollLeft(txtcont, &l2);
3164 IHTMLTextContainer_Release(txtcont);
3165 ok(hres == S_OK, "IHTMLTextContainer::get_scrollLeft failed: %d\n", l2);
3166 ok(l == l2, "unexpected left %d, expected %d\n", l2, l);
3167 }
3168
3169 #define test_img_src(a,b,c) _test_img_src(__LINE__,a,b,c)
3170 static void _test_img_src(unsigned line, IUnknown *unk, const char *exsrc, const char *broken_src)
3171 {
3172 IHTMLImgElement *img = _get_img_iface(line, unk);
3173 BSTR src;
3174 HRESULT hres;
3175
3176 hres = IHTMLImgElement_get_src(img, &src);
3177 IHTMLImgElement_Release(img);
3178 ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
3179 ok_(__FILE__,line) (!strcmp_wa(src, exsrc) || (broken_src && broken(!strcmp_wa(src, broken_src))),
3180 "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
3181 SysFreeString(src);
3182 }
3183
3184 #define test_img_set_src(u,s) _test_img_set_src(__LINE__,u,s)
3185 static void _test_img_set_src(unsigned line, IUnknown *unk, const char *src)
3186 {
3187 IHTMLImgElement *img = _get_img_iface(line, unk);
3188 BSTR tmp;
3189 HRESULT hres;
3190
3191 tmp = a2bstr(src);
3192 hres = IHTMLImgElement_put_src(img, tmp);
3193 IHTMLImgElement_Release(img);
3194 SysFreeString(tmp);
3195 ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
3196 }
3197
3198 #define test_img_alt(u,a) _test_img_alt(__LINE__,u,a)
3199 static void _test_img_alt(unsigned line, IUnknown *unk, const char *exalt)
3200 {
3201 IHTMLImgElement *img = _get_img_iface(line, unk);
3202 BSTR alt;
3203 HRESULT hres;
3204
3205 hres = IHTMLImgElement_get_alt(img, &alt);
3206 ok_(__FILE__,line) (hres == S_OK, "get_alt failed: %08x\n", hres);
3207 if(exalt)
3208 ok_(__FILE__,line) (!strcmp_wa(alt, exalt), "unexpected alt %s\n", wine_dbgstr_w(alt));
3209 else
3210 ok_(__FILE__,line) (!alt, "alt != NULL\n");
3211 SysFreeString(alt);
3212 }
3213
3214 #define test_img_set_alt(u,a) _test_img_set_alt(__LINE__,u,a)
3215 static void _test_img_set_alt(unsigned line, IUnknown *unk, const char *alt)
3216 {
3217 IHTMLImgElement *img = _get_img_iface(line, unk);
3218 BSTR tmp;
3219 HRESULT hres;
3220
3221 tmp = a2bstr(alt);
3222 hres = IHTMLImgElement_put_alt(img, tmp);
3223 ok_(__FILE__,line) (hres == S_OK, "get_alt failed: %08x\n", hres);
3224 SysFreeString(tmp);
3225
3226 _test_img_alt(line, unk, alt);
3227 }
3228
3229 #define test_img_align(u,a) _test_img_align(__LINE__,u,a)
3230 static void _test_img_align(unsigned line, IUnknown *unk, const char *align)
3231 {
3232 IHTMLImgElement *img = _get_img_iface(line, unk);
3233 BSTR tmp;
3234 HRESULT hres;
3235
3236 tmp = a2bstr(align);
3237 hres = IHTMLImgElement_put_align(img, tmp);
3238 ok_(__FILE__,line) (hres == S_OK, "put_align failed: %08x\n", hres);
3239 SysFreeString(tmp);
3240
3241 hres = IHTMLImgElement_get_align(img, &tmp);
3242 ok_(__FILE__,line) (hres == S_OK, "put_align failed: %08x\n", hres);
3243 ok_(__FILE__,line) (!strcmp_wa(tmp, align), "Expect %s, got %s\n", align, wine_dbgstr_w(tmp));
3244 SysFreeString(tmp);
3245 }
3246
3247 #define test_img_name(u, c) _test_img_name(__LINE__,u, c)
3248 static void _test_img_name(unsigned line, IUnknown *unk, const char *pValue)
3249 {
3250 IHTMLImgElement *img = _get_img_iface(line, unk);
3251 BSTR sName;
3252 HRESULT hres;
3253
3254 hres = IHTMLImgElement_get_name(img, &sName);
3255 ok_(__FILE__,line) (hres == S_OK, "get_Name failed: %08x\n", hres);
3256 ok_(__FILE__,line) (!strcmp_wa (sName, pValue), "expected '%s' got '%s'\n", pValue, wine_dbgstr_w(sName));
3257 IHTMLImgElement_Release(img);
3258 SysFreeString(sName);
3259 }
3260
3261 #define test_img_complete(a,b) _test_img_complete(__LINE__,a,b)
3262 static void _test_img_complete(unsigned line, IHTMLElement *elem, VARIANT_BOOL exb)
3263 {
3264 IHTMLImgElement *img = _get_img_iface(line, (IUnknown*)elem);
3265 VARIANT_BOOL b = 100;
3266 HRESULT hres;
3267
3268 hres = IHTMLImgElement_get_complete(img, &b);
3269 ok_(__FILE__,line) (hres == S_OK, "get_complete failed: %08x\n", hres);
3270 ok_(__FILE__,line) (b == exb, "complete = %x, expected %x\n", b, exb);
3271 IHTMLImgElement_Release(img);
3272 }
3273
3274 #define test_img_isMap(u, c) _test_img_isMap(__LINE__,u, c)
3275 static void _test_img_isMap(unsigned line, IUnknown *unk, VARIANT_BOOL v)
3276 {
3277 IHTMLImgElement *img = _get_img_iface(line, unk);
3278 VARIANT_BOOL b = 100;
3279 HRESULT hres;
3280
3281 hres = IHTMLImgElement_put_isMap(img, v);
3282 ok_(__FILE__,line) (hres == S_OK, "put_isMap failed: %08x\n", hres);
3283
3284 hres = IHTMLImgElement_get_isMap(img, &b);
3285 ok_(__FILE__,line) (hres == S_OK, "get_isMap failed: %08x\n", hres);
3286 ok_(__FILE__,line) (b == v, "isMap = %x, expected %x\n", b, v);
3287
3288 hres = IHTMLImgElement_get_isMap(img, NULL);
3289 ok_(__FILE__,line) (hres == E_INVALIDARG, "ret = %08x, expected E_INVALIDARG\n", hres);
3290 IHTMLImgElement_Release(img);
3291 }
3292
3293 static void test_dynamic_properties(IHTMLElement *elem)
3294 {
3295 static const WCHAR attr1W[] = {'a','t','t','r','1',0};
3296 IDispatchEx *dispex;
3297 BSTR name, attr1 = SysAllocString(attr1W);
3298 VARIANT_BOOL succ;
3299 VARIANT val;
3300 int checked_no = 0;
3301 DISPID id = DISPID_STARTENUM;
3302 HRESULT hres;
3303
3304 hres = IHTMLElement_QueryInterface(elem, &IID_IDispatchEx, (void**)&dispex);
3305 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
3306
3307 hres = IHTMLElement_removeAttribute(elem, attr1, 0, &succ);
3308 ok(hres == S_OK, "removeAttribute failed: %08x\n", hres);
3309 ok(succ, "removeAttribute set succ to FALSE\n");
3310
3311 while(1) {
3312 hres = IDispatchEx_GetNextDispID(dispex, fdexEnumAll, id, &id);
3313 ok(hres==S_OK || hres==S_FALSE, "GetNextDispID failed: %08x\n", hres);
3314 if(hres != S_OK)
3315 break;
3316
3317 hres = IDispatchEx_GetMemberName(dispex, id, &name);
3318 ok(hres == S_OK, "GetMemberName failed: %08x\n", hres);
3319
3320 if(!strcmp_wa(name, "attr1"))
3321 ok(0, "attr1 should be removed\n");
3322 else if(!strcmp_wa(name, "attr2") || !strcmp_wa(name, "attr3"))
3323 checked_no++;
3324 SysFreeString(name);
3325 }
3326 ok(checked_no == 2, "checked_no=%d, expected 2\n", checked_no);
3327 IDispatchEx_Release(dispex);
3328
3329 V_VT(&val) = VT_BSTR;
3330 V_BSTR(&val) = attr1;
3331 hres = IHTMLElement_setAttribute(elem, attr1, val, 0);
3332 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
3333 SysFreeString(attr1);
3334 }
3335
3336 #define test_attr_node_name(a,b) _test_attr_node_name(__LINE__,a,b)
3337 static void _test_attr_node_name(unsigned line, IHTMLDOMAttribute *attr, const char *exname)
3338 {
3339 BSTR str;
3340 HRESULT hres;
3341
3342 hres = IHTMLDOMAttribute_get_nodeName(attr, &str);
3343 ok_(__FILE__,line)(hres == S_OK, "get_nodeName failed: %08x\n", hres);
3344 ok_(__FILE__,line)(!strcmp_wa(str, exname), "node name is %s, expected %s\n", wine_dbgstr_w(str), exname);
3345 SysFreeString(str);
3346 }
3347
3348 static void test_attr_collection_disp(IDispatch *disp)
3349 {
3350 IDispatchEx *dispex;
3351 IHTMLDOMAttribute *attr;
3352 DISPPARAMS dp = {NULL, NULL, 0, 0};
3353 VARIANT var;
3354 EXCEPINFO ei;
3355 DISPID id;
3356 BSTR bstr;
3357 HRESULT hres;
3358
3359 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
3360 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
3361
3362 bstr = a2bstr("0");
3363 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id);
3364 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
3365 SysFreeString(bstr);
3366
3367 VariantInit(&var);
3368 hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
3369 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
3370 ok(V_VT(&var) == VT_DISPATCH, "V_VT(var)=%d\n", V_VT(&var));
3371 ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(var) == NULL\n");
3372 VariantClear(&var);
3373
3374 bstr = a2bstr("attr1");
3375 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id);
3376 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
3377 SysFreeString(bstr);
3378
3379 VariantInit(&var);
3380 hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
3381 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
3382 ok(V_VT(&var) == VT_DISPATCH, "V_VT(var)=%d\n", V_VT(&var));
3383 ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(var) == NULL\n");
3384 hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLDOMAttribute, (void**)&attr);
3385 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
3386
3387 test_attr_node_name(attr, "attr1");
3388
3389 IHTMLDOMAttribute_Release(attr);
3390 VariantClear(&var);
3391
3392 IDispatchEx_Release(dispex);
3393 }
3394
3395 static void test_attr_collection(IHTMLElement *elem)
3396 {
3397 static const WCHAR testW[] = {'t','e','s','t',0};
3398
3399 IHTMLDOMNode *node;
3400 IDispatch *disp, *attr;
3401 IHTMLDOMAttribute *dom_attr;
3402 IHTMLAttributeCollection *attr_col;
3403 BSTR name = SysAllocString(testW);
3404 VARIANT id, val;
3405 LONG i, len, checked;
3406 HRESULT hres;
3407
3408 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLDOMNode, (void**)&node);
3409 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
3410
3411 hres = IHTMLDOMNode_get_attributes(node, &disp);
3412 ok(hres == S_OK, "get_attributes failed: %08x\n", hres);
3413
3414 hres = IHTMLDOMNode_get_attributes(node, &attr);
3415 ok(hres == S_OK, "get_attributes failed: %08x\n", hres);
3416 ok(iface_cmp((IUnknown*)disp, (IUnknown*)attr), "disp != attr\n");
3417 IDispatch_Release(attr);
3418 IHTMLDOMNode_Release(node);
3419
3420 hres = IDispatch_QueryInterface(disp, &IID_IHTMLAttributeCollection, (void**)&attr_col);
3421 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
3422
3423 hres = IHTMLAttributeCollection_get_length(attr_col, &i);
3424 ok(hres == S_OK, "get_length failed: %08x\n", hres);
3425
3426 V_VT(&val) = VT_I4;
3427 V_I4(&val) = 1;
3428 hres = IHTMLElement_setAttribute(elem, name, val, 0);
3429 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
3430 SysFreeString(name);
3431
3432 hres = IHTMLAttributeCollection_get_length(attr_col, &len);
3433 ok(hres == S_OK, "get_length failed: %08x\n", hres);
3434 ok(len == i+1, "get_length returned %d, expected %d\n", len, i+1);
3435
3436 checked = 0;
3437 for(i=0; i<len; i++) {
3438 V_VT(&id) = VT_I4;
3439 V_I4(&id) = i;
3440 hres = IHTMLAttributeCollection_item(attr_col, &id, &attr);
3441 ok(hres == S_OK, "%d) item failed: %08x\n", i, hres);
3442
3443 hres = IDispatch_QueryInterface(attr, &IID_IHTMLDOMAttribute, (void**)&dom_attr);
3444 ok(hres == S_OK, "%d) QueryInterface failed: %08x\n", i, hres);
3445 IDispatch_Release(attr);
3446
3447 hres = IHTMLDOMAttribute_get_nodeName(dom_attr, &name);
3448 ok(hres == S_OK, "%d) get_nodeName failed: %08x\n", i, hres);
3449
3450 if(!strcmp_wa(name, "id")) {
3451 checked++;
3452 hres = IHTMLDOMAttribute_get_nodeValue(dom_attr, &val);
3453 ok(hres == S_OK, "%d) get_nodeValue failed: %08x\n", i, hres);
3454 ok(V_VT(&val) == VT_BSTR, "id: V_VT(&val) = %d\n", V_VT(&val));
3455 ok(!strcmp_wa(V_BSTR(&val), "attr"), "id: V_BSTR(&val) = %s\n", wine_dbgstr_w(V_BSTR(&val)));
3456 test_attr_expando(dom_attr, VARIANT_FALSE);
3457 test_attr_value(dom_attr, "attr");
3458 } else if(!strcmp_wa(name, "attr1")) {
3459 checked++;
3460 hres = IHTMLDOMAttribute_get_nodeValue(dom_attr, &val);
3461 ok(hres == S_OK, "%d) get_nodeValue failed: %08x\n", i, hres);
3462 ok(V_VT(&val) == VT_BSTR, "attr1: V_VT(&val) = %d\n", V_VT(&val));
3463 ok(!strcmp_wa(V_BSTR(&val), "attr1"), "attr1: V_BSTR(&val) = %s\n", wine_dbgstr_w(V_BSTR(&val)));
3464 test_attr_expando(dom_attr, VARIANT_TRUE);
3465 test_attr_value(dom_attr, "attr1");
3466 } else if(!strcmp_wa(name, "attr2")) {
3467 checked++;
3468 hres = IHTMLDOMAttribute_get_nodeValue(dom_attr, &val);
3469 ok(hres == S_OK, "%d) get_nodeValue failed: %08x\n", i, hres);
3470 ok(V_VT(&val) == VT_BSTR, "attr2: V_VT(&val) = %d\n", V_VT(&val));
3471 ok(!V_BSTR(&val), "attr2: V_BSTR(&val) != NULL\n");
3472 test_attr_value(dom_attr, "");
3473 } else if(!strcmp_wa(name, "attr3")) {
3474 checked++;
3475 hres = IHTMLDOMAttribute_get_nodeValue(dom_attr, &val);
3476 ok(hres == S_OK, "%d) get_nodeValue failed: %08x\n", i, hres);
3477 ok(V_VT(&val) == VT_BSTR, "attr3: V_VT(&val) = %d\n", V_VT(&val));
3478 ok(!strcmp_wa(V_BSTR(&val), "attr3"), "attr3: V_BSTR(&val) = %s\n", wine_dbgstr_w(V_BSTR(&val)));
3479 test_attr_value(dom_attr, "attr3");
3480 } else if(!strcmp_wa(name, "test")) {
3481 checked++;
3482 hres = IHTMLDOMAttribute_get_nodeValue(dom_attr, &val);
3483 ok(hres == S_OK, "%d) get_nodeValue failed: %08x\n", i, hres);
3484 ok(V_VT(&val) == VT_I4, "test: V_VT(&val) = %d\n", V_VT(&val));
3485 ok(V_I4(&val) == 1, "test: V_I4(&val) = %d\n", V_I4(&val));
3486 test_attr_value(dom_attr, "1");
3487 }
3488
3489 IHTMLDOMAttribute_Release(dom_attr);
3490 SysFreeString(name);
3491 VariantClear(&val);
3492 }
3493 ok(checked==5, "invalid number of specified attributes (%d)\n", checked);
3494
3495 V_I4(&id) = len;
3496 hres = IHTMLAttributeCollection_item(attr_col, &id, &attr);
3497 ok(hres == E_INVALIDARG, "item failed: %08x\n", hres);
3498
3499 V_VT(&id) = VT_BSTR;
3500 V_BSTR(&id) = a2bstr("nonexisting");
3501 hres = IHTMLAttributeCollection_item(attr_col, &id, &attr);
3502 ok(hres == E_INVALIDARG, "item failed: %08x\n", hres);
3503 VariantClear(&id);
3504
3505 test_attr_collection_disp(disp);
3506
3507 IDispatch_Release(disp);
3508 IHTMLAttributeCollection_Release(attr_col);
3509 }
3510
3511 #define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
3512 static void _test_elem_id(unsigned line, IUnknown *unk, const char *exid)
3513 {
3514 IHTMLElement *elem = _get_elem_iface(line, unk);
3515 BSTR id = (void*)0xdeadbeef;
3516 HRESULT hres;
3517
3518 hres = IHTMLElement_get_id(elem, &id);
3519 IHTMLElement_Release(elem);
3520 ok_(__FILE__,line) (hres == S_OK, "get_id failed: %08x\n", hres);
3521
3522 if(exid)
3523 ok_(__FILE__,line) (!strcmp_wa(id, exid), "unexpected id %s\n", wine_dbgstr_w(id));
3524 else
3525 ok_(__FILE__,line) (!id, "id=%s\n", wine_dbgstr_w(id));
3526
3527 SysFreeString(id);
3528 }
3529
3530 #define test_elem_language(e,i) _test_elem_language(__LINE__,e,i)
3531 static void _test_elem_language(unsigned line, IHTMLElement *elem, const char *exlang)
3532 {
3533 BSTR lang = (void*)0xdeadbeef;
3534 HRESULT hres;
3535
3536 hres = IHTMLElement_get_language(elem, &lang);
3537 ok_(__FILE__,line) (hres == S_OK, "get_language failed: %08x\n", hres);
3538
3539 if(exlang)
3540 ok_(__FILE__,line) (!strcmp_wa(lang, exlang), "unexpected language %s\n", wine_dbgstr_w(lang));
3541 else
3542 ok_(__FILE__,line) (!lang, "language=%s\n", wine_dbgstr_w(lang));
3543
3544 SysFreeString(lang);
3545 }
3546
3547 #define set_elem_language(e,i) _set_elem_language(__LINE__,e,i)
3548 static void _set_elem_language(unsigned line, IHTMLElement *elem, const char *lang)
3549 {
3550 BSTR str = a2bstr(lang);
3551 HRESULT hres;
3552
3553 hres = IHTMLElement_put_language(elem, str);
3554 ok_(__FILE__,line) (hres == S_OK, "get_language failed: %08x\n", hres);
3555 SysFreeString(str);
3556
3557 _test_elem_language(line, elem, lang);
3558 }
3559
3560 #define test_elem_put_id(u,i) _test_elem_put_id(__LINE__,u,i)
3561 static void _test_elem_put_id(unsigned line, IUnknown *unk, const char *new_id)
3562 {
3563 IHTMLElement *elem = _get_elem_iface(line, unk);
3564 BSTR tmp = a2bstr(new_id);
3565 HRESULT hres;
3566
3567 hres = IHTMLElement_put_id(elem, tmp);
3568 IHTMLElement_Release(elem);
3569 SysFreeString(tmp);
3570 ok_(__FILE__,line) (hres == S_OK, "put_id failed: %08x\n", hres);
3571
3572 _test_elem_id(line, unk, new_id);
3573 }
3574
3575 static void test_contenteditable(IUnknown *unk)
3576 {
3577 IHTMLElement3 *elem3 = get_elem3_iface(unk);
3578 HRESULT hres;
3579 BSTR str, strDefault;
3580
3581 hres = IHTMLElement3_get_contentEditable(elem3, &strDefault);
3582 ok(hres == S_OK, "get_contentEditable failed: 0x%08x\n", hres);
3583
3584 str = a2bstr("true");
3585 hres = IHTMLElement3_put_contentEditable(elem3, str);
3586 ok(hres == S_OK, "put_contentEditable(%s) failed: 0x%08x\n", wine_dbgstr_w(str), hres);
3587 SysFreeString(str);
3588 hres = IHTMLElement3_get_contentEditable(elem3, &str);
3589 ok(hres == S_OK, "get_contentEditable failed: 0x%08x\n", hres);
3590 ok(!strcmp_wa(str, "true"), "Got %s, expected %s\n", wine_dbgstr_w(str), "true");
3591
3592 /* Restore origin contentEditable */
3593 hres = IHTMLElement3_put_contentEditable(elem3, strDefault);
3594 ok(hres == S_OK, "put_contentEditable(%s) failed: 0x%08x\n", wine_dbgstr_w(strDefault), hres);
3595 SysFreeString(strDefault);
3596
3597 IHTMLElement3_Release(elem3);
3598 }
3599
3600 #define test_input_type(i,t) _test_input_type(__LINE__,i,t)
3601 static void _test_input_type(unsigned line, IHTMLInputElement *input, const char *extype)
3602 {
3603 BSTR type;
3604 HRESULT hres;
3605
3606 hres = IHTMLInputElement_get_type(input, &type);
3607 ok_(__FILE__,line) (hres == S_OK, "get_type failed: %08x\n", hres);
3608 ok_(__FILE__,line) (!strcmp_wa(type, extype), "type=%s, expected %s\n", wine_dbgstr_w(type), extype);
3609 SysFreeString(type);
3610 }
3611
3612 #define test_input_name(u, c) _test_input_name(__LINE__,u, c)
3613 static void _test_input_name(unsigned line, IHTMLInputElement *input, const char *exname)
3614 {
3615 BSTR name = (BSTR)0xdeadbeef;
3616 HRESULT hres;
3617
3618 hres = IHTMLInputElement_get_name(input, &name);
3619 ok_(__FILE__,line) (hres == S_OK, "get_name failed: %08x\n", hres);
3620 if(exname)
3621 ok_(__FILE__,line) (!strcmp_wa (name, exname), "name=%s, expected %s\n", wine_dbgstr_w(name), exname);
3622 else
3623 ok_(__FILE__,line) (!name, "name=%p, expected NULL\n", name);
3624 SysFreeString(name);
3625 }
3626
3627 #define test_input_set_name(u, c) _test_input_set_name(__LINE__,u, c)
3628 static void _test_input_set_name(unsigned line, IHTMLInputElement *input, const char *name)
3629 {
3630 BSTR tmp = a2bstr(name);
3631 HRESULT hres;
3632
3633 hres = IHTMLInputElement_put_name(input, tmp);
3634 ok_(__FILE__,line) (hres == S_OK, "put_name failed: %08x\n", hres);
3635 SysFreeString(tmp);
3636
3637 _test_input_name(line, input, name);
3638 }
3639
3640 #define test_input_get_disabled(i,b) _test_input_get_disabled(__LINE__,i,b)
3641 static void _test_input_get_disabled(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
3642 {
3643 VARIANT_BOOL disabled = 100;
3644 HRESULT hres;
3645
3646 hres = IHTMLInputElement_get_disabled(input, &disabled);
3647 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
3648 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
3649
3650 _test_elem3_get_disabled(line, (IUnknown*)input, exb);
3651 }
3652
3653 #define test_input_set_disabled(i,b) _test_input_set_disabled(__LINE__,i,b)
3654 static void _test_input_set_disabled(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
3655 {
3656 HRESULT hres;
3657
3658 hres = IHTMLInputElement_put_disabled(input, b);
3659 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
3660
3661 _test_input_get_disabled(line, input, b);
3662 }
3663
3664 #define test_input_get_defaultchecked(i,b) _test_input_get_defaultchecked(__LINE__,i,b)
3665 static void _test_input_get_defaultchecked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
3666 {
3667 VARIANT_BOOL checked = 100;
3668 HRESULT hres;
3669
3670 hres = IHTMLInputElement_get_defaultChecked(input, &checked);
3671 ok_(__FILE__,line) (hres == S_OK, "get_defaultChecked failed: %08x\n", hres);
3672 ok_(__FILE__,line) (checked == exb, "checked=%x, expected %x\n", checked, exb);
3673 }
3674
3675 #define test_input_set_defaultchecked(i,b) _test_input_set_defaultchecked(__LINE__,i,b)
3676 static void _test_input_set_defaultchecked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
3677 {
3678 HRESULT hres;
3679
3680 hres = IHTMLInputElement_put_defaultChecked(input, b);
3681 ok_(__FILE__,line) (hres == S_OK, "get_defaultChecked failed: %08x\n", hres);
3682
3683 _test_input_get_defaultchecked(line, input, b);
3684 }
3685
3686 #define test_input_get_checked(i,b) _test_input_get_checked(__LINE__,i,b)
3687 static void _test_input_get_checked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
3688 {
3689 VARIANT_BOOL checked = 100;
3690 HRESULT hres;
3691
3692 hres = IHTMLInputElement_get_checked(input, &checked);
3693 ok_(__FILE__,line) (hres == S_OK, "get_checked failed: %08x\n", hres);
3694 ok_(__FILE__,line) (checked == exb, "checked=%x, expected %x\n", checked, exb);
3695 }
3696
3697 #define test_input_set_checked(i,b) _test_input_set_checked(__LINE__,i,b)
3698 static void _test_input_set_checked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
3699 {
3700 HRESULT hres;
3701
3702 hres = IHTMLInputElement_put_checked(input, b);
3703 ok_(__FILE__,line) (hres == S_OK, "put_checked failed: %08x\n", hres);
3704
3705 _test_input_get_checked(line, input, b);
3706 }
3707
3708 #define test_input_maxlength(i,b) _test_input_maxlength(__LINE__,i,b)
3709 static void _test_input_maxlength(unsigned line, IHTMLInputElement *input, LONG exl)
3710 {
3711 LONG maxlength = 0xdeadbeef;
3712 HRESULT hres;
3713
3714 hres = IHTMLInputElement_get_maxLength(input, &maxlength);
3715 ok_(__FILE__,line) (hres == S_OK, "get_maxLength failed: %08x\n", hres);
3716 ok_(__FILE__,line) (maxlength == exl, "maxLength=%x, expected %d\n", maxlength, exl);
3717 }
3718
3719 #define test_input_set_maxlength(i,b) _test_input_set_maxlength(__LINE__,i,b)
3720 static void _test_input_set_maxlength(unsigned line, IHTMLInputElement *input, LONG l)
3721 {
3722 HRESULT hres;
3723
3724 hres = IHTMLInputElement_put_maxLength(input, l);
3725 ok_(__FILE__,line) (hres == S_OK, "put_maxLength failed: %08x\n", hres);
3726
3727 _test_input_maxlength(line, input, l);
3728 }
3729
3730 #define test_input_value(o,t) _test_input_value(__LINE__,o,t)
3731 static void _test_input_value(unsigned line, IUnknown *unk, const char *exval)
3732 {
3733 IHTMLInputElement *input;
3734 BSTR bstr;
3735 HRESULT hres;
3736
3737 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
3738 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
3739 if(FAILED(hres))
3740 return;
3741
3742 hres = IHTMLInputElement_get_value(input, &bstr);
3743 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
3744 if(exval)
3745 ok_(__FILE__,line) (!strcmp_wa(bstr, exval), "value=%s\n", wine_dbgstr_w(bstr));
3746 else
3747 ok_(__FILE__,line) (!bstr, "exval != NULL\n");
3748 SysFreeString(bstr);
3749 IHTMLInputElement_Release(input);
3750 }
3751
3752 #define test_input_get_form(o, t) _test_input_get_form(__LINE__, o, t)
3753 static void _test_input_get_form(unsigned line, IUnknown *unk, const char *id)
3754 {
3755 IHTMLInputElement *input;
3756 IHTMLFormElement *form;
3757 IHTMLElement *elem;
3758 HRESULT hres;
3759
3760 ok_(__FILE__,line) (unk != NULL, "unk is NULL!\n");
3761 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
3762 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
3763 ok_(__FILE__,line) (input != NULL, "input == NULL\n");
3764 if(FAILED(hres) || input == NULL)
3765 return;
3766
3767 hres = IHTMLInputElement_get_form(input, &form);
3768 ok_(__FILE__, line) (hres == S_OK, "get_form failed: %08x\n", hres);
3769 ok_(__FILE__, line) (form != NULL, "form == NULL\n");
3770 if(FAILED(hres) || form == NULL){
3771 IHTMLInputElement_Release(input);
3772 return;
3773 }
3774
3775 hres = IHTMLFormElement_QueryInterface(form, &IID_IHTMLElement, (void **)&elem);
3776 ok_(__FILE__, line) (hres == S_OK, "QueryInterface(IID_IHTMLElement) failed: %08x\n", hres);
3777 ok_(__FILE__, line) (elem != NULL, "elem == NULL\n");
3778 if(FAILED(hres) || elem == NULL){
3779 IHTMLInputElement_Release(input);
3780 IHTMLFormElement_Release(form);
3781 return;
3782 }
3783
3784 _test_elem_id(line, (IUnknown*)elem, id);
3785
3786 IHTMLInputElement_Release(input);
3787 IHTMLFormElement_Release(form);
3788 IHTMLElement_Release(elem);
3789 }
3790
3791 #define test_input_put_value(o,v) _test_input_put_value(__LINE__,o,v)
3792 static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val)
3793 {
3794 IHTMLInputElement *input;
3795 BSTR bstr;
3796 HRESULT hres;
3797
3798 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
3799 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
3800 if(FAILED(hres))
3801 return;
3802
3803 bstr = a2bstr(val);
3804 hres = IHTMLInputElement_put_value(input, bstr);
3805 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
3806 SysFreeString(bstr);
3807 IHTMLInputElement_Release(input);
3808
3809 _test_input_value(line, unk, val);
3810 }
3811
3812 #define test_input_defaultValue(o,t) _test_input_defaultValue(__LINE__,o,t)
3813 static void _test_input_defaultValue(unsigned line, IUnknown *unk, const char *exval)
3814 {
3815 IHTMLInputElement *input;
3816 BSTR str;
3817 HRESULT hres;
3818
3819 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
3820 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
3821 if(FAILED(hres))
3822 return;
3823
3824 hres = IHTMLInputElement_get_defaultValue(input, &str);
3825 ok_(__FILE__,line) (hres == S_OK, "get_defaultValue failed: %08x\n", hres);
3826 if(exval)
3827 ok_(__FILE__,line) (!strcmp_wa(str, exval), "defaultValue=%s\n", wine_dbgstr_w(str));
3828 else
3829 ok_(__FILE__,line) (!str, "exval != NULL\n");
3830 SysFreeString(str);
3831 IHTMLInputElement_Release(input);
3832 }
3833
3834 #define test_input_put_defaultValue(o,v) _test_input_put_defaultValue(__LINE__,o,v)
3835 static void _test_input_put_defaultValue(unsigned line, IUnknown *unk, const char *val)
3836 {
3837 IHTMLInputElement *input;
3838 BSTR str;
3839 HRESULT hres;
3840
3841 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
3842 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
3843 if(FAILED(hres))
3844 return;
3845
3846 str = a2bstr(val);
3847 hres = IHTMLInputElement_put_defaultValue(input, str);
3848 ok_(__FILE__,line) (hres == S_OK, "get_defaultValue failed: %08x\n", hres);
3849 SysFreeString(str);
3850 IHTMLInputElement_Release(input);
3851
3852 _test_input_defaultValue(line, unk, val);
3853 }
3854
3855 #define test_input_src(i,s) _test_input_src(__LINE__,i,s)
3856 static void _test_input_src(unsigned line, IHTMLInputElement *input, const char *exsrc)
3857 {
3858 BSTR src;
3859 HRESULT hres;
3860
3861 hres = IHTMLInputElement_get_src(input, &src);
3862 ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
3863 if(exsrc)
3864 ok_(__FILE__,line) (!strcmp_wa(src, exsrc), "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
3865 else
3866 ok_(__FILE__,line) (!src, "get_src returned %s expected NULL\n", wine_dbgstr_w(src));
3867 SysFreeString(src);
3868 }
3869
3870 #define test_input_set_src(u,s) _test_input_set_src(__LINE__,u,s)
3871 static void _test_input_set_src(unsigned line, IHTMLInputElement *input, const char *src)
3872 {
3873 BSTR tmp;
3874 HRESULT hres;
3875
3876 tmp = a2bstr(src);
3877 hres = IHTMLInputElement_put_src(input, tmp);
3878 SysFreeString(tmp);
3879 ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
3880
3881 _test_input_src(line, input, src);
3882 }
3883
3884 #define test_input_set_size(u,s,r) _test_input_set_size(__LINE__,u,s,r)
3885 static void _test_input_set_size(unsigned line, IHTMLInputElement *input, LONG size, HRESULT exret)
3886 {
3887 HRESULT hres;
3888
3889 hres = IHTMLInputElement_put_size(input, size);
3890 ok_(__FILE__,line) (hres == exret, "Expect ret = %08x, got: %08x\n", exret, hres);
3891 }
3892
3893 #define test_input_get_size(u,s) _test_input_get_size(__LINE__,u,s)
3894 static void _test_input_get_size(unsigned line, IHTMLInputElement *input, LONG exsize)
3895 {
3896 HRESULT hres;
3897 LONG size;
3898
3899 hres = IHTMLInputElement_get_size(input, &size);
3900 ok_(__FILE__,line) (hres == S_OK, "get_size failed: %08x\n", hres);
3901 ok_(__FILE__,line) (size == exsize, "Expect %d, got %d\n", exsize, size);
3902
3903 hres = IHTMLInputElement_get_size(input, NULL);
3904 ok_(__FILE__,line) (hres == E_INVALIDARG, "Expect ret E_INVALIDARG, got: %08x\n", hres);
3905 }
3906
3907 #define test_input_readOnly(u,b) _test_input_readOnly(__LINE__,u,b)
3908 static void _test_input_readOnly(unsigned line, IHTMLInputElement *input, VARIANT_BOOL v)
3909 {
3910 HRESULT hres;
3911 VARIANT_BOOL b = 100;
3912
3913 hres = IHTMLInputElement_put_readOnly(input, v);
3914 ok_(__FILE__,line)(hres == S_OK, "put readOnly failed: %08x\n", hres);
3915
3916 hres = IHTMLInputElement_get_readOnly(input, &b);
3917 ok_(__FILE__,line)(hres == S_OK, "get readOnly failed: %08x\n", hres);
3918 ok_(__FILE__,line)(v == b, "Expect %x, got %x\n", v, b);
3919 }
3920
3921 #define test_elem_class(u,c) _test_elem_class(__LINE__,u,c)
3922 static void _test_elem_class(unsigned line, IUnknown *unk, const char *exclass)
3923 {
3924 IHTMLElement *elem = _get_elem_iface(line, unk);
3925 BSTR class = (void*)0xdeadbeef;
3926 HRESULT hres;
3927
3928 hres = IHTMLElement_get_className(elem, &class);
3929 IHTMLElement_Release(elem);
3930 ok_(__FILE__,line) (hres == S_OK, "get_className failed: %08x\n", hres);
3931 if(exclass)
3932 ok_(__FILE__,line) (!strcmp_wa(class, exclass), "unexpected className %s\n", wine_dbgstr_w(class));
3933 else
3934 ok_(__FILE__,line) (!class, "class != NULL\n");
3935 SysFreeString(class);
3936 }
3937
3938 #define test_elem_tabindex(u,i) _test_elem_tabindex(__LINE__,u,i)
3939 static void _test_elem_tabindex(unsigned line, IUnknown *unk, short exindex)
3940 {
3941 IHTMLElement2 *elem2 = _get_elem2_iface(line, unk);
3942 short index = -3;
3943 HRESULT hres;
3944
3945 hres = IHTMLElement2_get_tabIndex(elem2, &index);
3946 IHTMLElement2_Release(elem2);
3947 ok_(__FILE__,line) (hres == S_OK, "get_tabIndex failed: %08x\n", hres);
3948 ok_(__FILE__,line) (index == exindex, "unexpected index %d\n", index);
3949 }
3950
3951 #define test_elem_set_tabindex(u,i) _test_elem_set_tabindex(__LINE__,u,i)
3952 static void _test_elem_set_tabindex(unsigned line, IUnknown *unk, short index)
3953 {
3954 IHTMLElement2 *elem2 = _get_elem2_iface(line, unk);
3955 HRESULT hres;
3956
3957 hres = IHTMLElement2_put_tabIndex(elem2, index);
3958 IHTMLElement2_Release(elem2);
3959 ok_(__FILE__,line) (hres == S_OK, "get_tabIndex failed: %08x\n", hres);
3960
3961 _test_elem_tabindex(line, unk, index);
3962 }
3963
3964 #define test_style_media(s,m) _test_style_media(__LINE__,s,m)
3965 static void _test_style_media(unsigned line, IUnknown *unk, const char *exmedia)
3966 {
3967 IHTMLStyleElement *style = _get_style_iface(line, unk);
3968 BSTR media;
3969 HRESULT hres;
3970
3971 hres = IHTMLStyleElement_get_media(style, &media);
3972 ok_(__FILE__,line)(hres == S_OK, "get_media failed: %08x\n", hres);
3973 if(exmedia)
3974 ok_(__FILE__,line)(!strcmp_wa(media, exmedia), "media = %s, expected %s\n", wine_dbgstr_w(media), exmedia);
3975 else
3976 ok_(__FILE__,line)(!media, "media = %s, expected NULL\n", wine_dbgstr_w(media));
3977
3978 IHTMLStyleElement_Release(style);
3979 SysFreeString(media);
3980 }
3981
3982 #define test_style_put_media(s,m) _test_style_put_media(__LINE__,s,m)
3983 static void _test_style_put_media(unsigned line, IUnknown *unk, const char *media)
3984 {
3985 IHTMLStyleElement *style = _get_style_iface(line, unk);
3986 BSTR str;
3987 HRESULT hres;
3988
3989 str = a2bstr(media);
3990 hres = IHTMLStyleElement_put_media(style, str);
3991 ok_(__FILE__,line)(hres == S_OK, "put_media failed: %08x\n", hres);
3992 IHTMLStyleElement_Release(style);
3993 SysFreeString(str);
3994
3995 _test_style_media(line, unk, media);
3996 }
3997
3998 #define test_style_type(s,m) _test_style_type(__LINE__,s,m)
3999 static void _test_style_type(unsigned line, IUnknown *unk, const char *extype)
4000 {
4001 IHTMLStyleElement *style = _get_style_iface(line, unk);
4002 BSTR type;
4003 HRESULT hres;
4004
4005 hres = IHTMLStyleElement_get_type(style, &type);
4006 ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08x\n", hres);
4007 if(extype)
4008 ok_(__FILE__,line)(!strcmp_wa(type, extype), "type = %s, expected %s\n", wine_dbgstr_w(type), extype);
4009 else
4010 ok_(__FILE__,line)(!type, "type = %s, expected NULL\n", wine_dbgstr_w(type));
4011
4012 IHTMLStyleElement_Release(style);
4013 SysFreeString(type);
4014 }
4015
4016 #define test_style_put_type(s,m) _test_style_put_type(__LINE__,s,m)
4017 static void _test_style_put_type(unsigned line, IUnknown *unk, const char *type)
4018 {
4019 IHTMLStyleElement *style = _get_style_iface(line, unk);
4020 BSTR str;
4021 HRESULT hres;
4022
4023 str = a2bstr(type);
4024 hres = IHTMLStyleElement_put_type(style, str);
4025 ok_(__FILE__,line)(hres == S_OK, "put_type failed: %08x\n", hres);
4026 IHTMLStyleElement_Release(style);
4027 SysFreeString(str);
4028
4029 _test_style_type(line, unk, type);
4030 }
4031
4032 #define test_elem_filters(u) _test_elem_filters(__LINE__,u)
4033 static void _test_elem_filters(unsigned line, IUnknown *unk)
4034 {
4035 IHTMLElement *elem = _get_elem_iface(line, unk);
4036 HRESULT hres;
4037 IHTMLFiltersCollection *filters;
4038
4039 hres = IHTMLElement_get_filters(elem, &filters);
4040 ok_(__FILE__,line) (hres == S_OK || broken(hres == REGDB_E_CLASSNOTREG) /* NT4 */,
4041 "get_filters failed: %08x\n", hres);
4042 if(hres == S_OK)
4043 {
4044 LONG len;
4045 IDispatchEx *dispex;
4046
4047 hres = IHTMLFiltersCollection_get_length(filters, &len);
4048 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
4049 ok_(__FILE__,line) (len == 0, "expect 0 got %d\n", len);
4050
4051 hres = IHTMLFiltersCollection_QueryInterface(filters, &IID_IDispatchEx, (void**)&dispex);
4052 ok_(__FILE__,line) (hres == S_OK || broken(hres == E_NOINTERFACE),
4053 "Could not get IDispatchEx interface: %08x\n", hres);
4054 if(SUCCEEDED(hres)) {
4055 test_disp((IUnknown*)filters, &IID_IHTMLFiltersCollection, "[object]");
4056 IDispatchEx_Release(dispex);
4057 }
4058
4059 IHTMLFiltersCollection_Release(filters);
4060 }
4061
4062 IHTMLElement_Release(elem);
4063 }
4064
4065 #define test_elem_set_class(u,c) _test_elem_set_class(__LINE__,u,c)
4066 static void _test_elem_set_class(unsigned line, IUnknown *unk, const char *class)
4067 {
4068 IHTMLElement *elem = _get_elem_iface(line, unk);
4069 BSTR tmp;
4070 HRESULT hres;
4071
4072 tmp = class ? a2bstr(class) : NULL;
4073 hres = IHTMLElement_put_className(elem, tmp);
4074 IHTMLElement_Release(elem);
4075 ok_(__FILE__,line) (hres == S_OK, "put_className failed: %08x\n", hres);
4076 SysFreeString(tmp);
4077
4078 _test_elem_class(line, unk, class);
4079 }
4080
4081 #define test_elem_title(u,t) _test_elem_title(__LINE__,u,t)
4082 static void _test_elem_title(unsigned line, IUnknown *unk, const char *extitle)
4083 {
4084 IHTMLElement *elem = _get_elem_iface(line, unk);
4085 BSTR title;
4086 HRESULT hres;
4087
4088 hres = IHTMLElement_get_title(elem, &title);
4089 IHTMLElement_Release(elem);
4090 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
4091 if(extitle)
4092 ok_(__FILE__,line) (!strcmp_wa(title, extitle), "unexpected title %s\n", wine_dbgstr_w(title));
4093 else
4094 ok_(__FILE__,line) (!title, "title=%s, expected NULL\n", wine_dbgstr_w(title));
4095
4096 SysFreeString(title);
4097 }
4098
4099 #define test_elem_set_title(u,t) _test_elem_set_title(__LINE__,u,t)
4100 static void _test_elem_set_title(unsigned line, IUnknown *unk, const char *title)
4101 {
4102 IHTMLElement *elem = _get_elem_iface(line, unk);
4103 BSTR tmp;
4104 HRESULT hres;
4105
4106 tmp = a2bstr(title);
4107 hres = IHTMLElement_put_title(elem, tmp);
4108 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
4109
4110 IHTMLElement_Release(elem);
4111 SysFreeString(tmp);
4112 }
4113
4114 #define test_node_get_value_str(u,e) _test_node_get_value_str(__LINE__,u,e)
4115 static void _test_node_get_value_str(unsigned line, IUnknown *unk, const char *exval)
4116 {
4117 IHTMLDOMNode *node = _get_node_iface(line, unk);
4118 VARIANT var;
4119 HRESULT hres;
4120
4121 hres = IHTMLDOMNode_get_nodeValue(node, &var);
4122 IHTMLDOMNode_Release(node);
4123 ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres);
4124
4125 if(exval) {
4126 ok_(__FILE__,line) (V_VT(&var) == VT_BSTR, "vt=%d\n", V_VT(&var));
4127 ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&var), exval), "unexpected value %s\n", wine_dbgstr_w(V_BSTR(&var)));
4128 }else {
4129 ok_(__FILE__,line) (V_VT(&var) == VT_NULL, "vt=%d, expected VT_NULL\n", V_VT(&var));
4130 }
4131
4132 VariantClear(&var);
4133 }
4134
4135 #define test_node_put_value_str(u,v) _test_node_put_value_str(__LINE__,u,v)
4136 static void _test_node_put_value_str(unsigned line, IUnknown *unk, const char *val)
4137 {
4138 IHTMLDOMNode *node = _get_node_iface(line, unk);
4139 VARIANT var;
4140 HRESULT hres;
4141
4142 V_VT(&var) = VT_BSTR;
4143 V_BSTR(&var) = a2bstr(val);
4144
4145 hres = IHTMLDOMNode_put_nodeValue(node, var);
4146 ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres);
4147 IHTMLDOMNode_Release(node);
4148 VariantClear(&var);
4149 }
4150
4151 #define test_elem_client_size(u) _test_elem_client_size(__LINE__,u)
4152 static void _test_elem_client_size(unsigned line, IUnknown *unk)
4153 {
4154 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
4155 LONG l;
4156 HRESULT hres;
4157
4158 hres = IHTMLElement2_get_clientWidth(elem, &l);
4159 ok_(__FILE__,line) (hres == S_OK, "get_clientWidth failed: %08x\n", hres);
4160 hres = IHTMLElement2_get_clientHeight(elem, &l);
4161 ok_(__FILE__,line) (hres == S_OK, "get_clientHeight failed: %08x\n", hres);
4162
4163 IHTMLElement2_Release(elem);
4164 }
4165
4166 #define test_elem_client_rect(u) _test_elem_client_rect(__LINE__,u)
4167 static void _test_elem_client_rect(unsigned line, IUnknown *unk)
4168 {
4169 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
4170 LONG l;
4171 HRESULT hres;
4172
4173 hres = IHTMLElement2_get_clientLeft(elem, &l);
4174 ok_(__FILE__,line) (hres == S_OK, "get_clientLeft failed: %08x\n", hres);
4175 ok_(__FILE__,line) (!l, "clientLeft = %d\n", l);
4176
4177 hres = IHTMLElement2_get_clientTop(elem, &l);
4178 ok_(__FILE__,line) (hres == S_OK, "get_clientTop failed: %08x\n", hres);
4179 ok_(__FILE__,line) (!l, "clientTop = %d\n", l);
4180
4181 IHTMLElement2_Release(elem);
4182 }
4183
4184 #define test_form_length(e,l) _test_form_length(__LINE__,e,l)
4185 static void _test_form_length(unsigned line, IUnknown *unk, LONG exlen)
4186 {
4187 IHTMLFormElement *form = _get_form_iface(line, unk);
4188 LONG len = 0xdeadbeef;
4189 HRESULT hres;
4190
4191 hres = IHTMLFormElement_get_length(form, &len);
4192 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
4193 ok_(__FILE__,line)(len == exlen, "length=%d, expected %d\n", len, exlen);
4194
4195 IHTMLFormElement_Release(form);
4196 }
4197
4198 #define test_form_action(f,a) _test_form_action(__LINE__,f,a)
4199 static void _test_form_action(unsigned line, IUnknown *unk, const char *ex)
4200 {
4201 IHTMLFormElement *form = _get_form_iface(line, unk);
4202 BSTR action = (void*)0xdeadbeef;
4203 HRESULT hres;
4204
4205 hres = IHTMLFormElement_get_action(form, &action);
4206 ok_(__FILE__,line)(hres == S_OK, "get_action failed: %08x\n", hres);
4207 if(ex)
4208 ok_(__FILE__,line)(!strcmp_wa(action, ex), "action=%s, expected %s\n", wine_dbgstr_w(action), ex);
4209 else
4210 ok_(__FILE__,line)(!action, "action=%p\n", action);
4211
4212 SysFreeString(action);
4213 IHTMLFormElement_Release(form);
4214 }
4215
4216 #define test_form_put_action(f,a) _test_form_put_action(__LINE__,f,a)
4217 static void _test_form_put_action(unsigned line, IUnknown *unk, const char *action)
4218 {
4219 IHTMLFormElement *form = _get_form_iface(line, unk);
4220 BSTR tmp = a2bstr(action);
4221 HRESULT hres;
4222
4223 hres = IHTMLFormElement_put_action(form, tmp);
4224 ok_(__FILE__,line)(hres == S_OK, "put_action failed: %08x\n", hres);
4225 SysFreeString(tmp);
4226 IHTMLFormElement_Release(form);
4227
4228 _test_form_action(line, unk, action);
4229 }
4230
4231 #define test_form_method(f,a) _test_form_method(__LINE__,f,a)
4232 static void _test_form_method(unsigned line, IUnknown *unk, const char *ex)
4233 {
4234 IHTMLFormElement *form = _get_form_iface(line, unk);
4235 BSTR method = (void*)0xdeadbeef;
4236 HRESULT hres;
4237
4238 hres = IHTMLFormElement_get_method(form, &method);
4239 ok_(__FILE__,line)(hres == S_OK, "get_method failed: %08x\n", hres);
4240 if(ex)
4241 ok_(__FILE__,line)(!strcmp_wa(method, ex), "method=%s, expected %s\n", wine_dbgstr_w(method), ex);
4242 else
4243 ok_(__FILE__,line)(!method, "method=%p\n", method);
4244
4245 SysFreeString(method);
4246 IHTMLFormElement_Release(form);
4247 }
4248
4249 #define test_form_put_method(f,r,a) _test_form_put_method(__LINE__,f,r,a)
4250 static void _test_form_put_method(unsigned line, IUnknown *unk, HRESULT exp_hres, const char *method)
4251 {
4252 IHTMLFormElement *form = _get_form_iface(line, unk);
4253 BSTR tmp = a2bstr(method);
4254 HRESULT hres;
4255
4256 hres = IHTMLFormElement_put_method(form, tmp);
4257 ok_(__FILE__,line)(hres == exp_hres, "put_method returned: %08x, expected %08x\n", hres, exp_hres);
4258 SysFreeString(tmp);
4259 IHTMLFormElement_Release(form);
4260
4261 if(exp_hres == S_OK)
4262 _test_form_method(line, unk, method);
4263 }
4264
4265 #define test_form_name(f,a) _test_form_name(__LINE__,f,a)
4266 static void _test_form_name(unsigned line, IUnknown *unk, const char *ex)
4267 {
4268 IHTMLFormElement *form = _get_form_iface(line, unk);
4269 BSTR name = (void*)0xdeadbeef;
4270 HRESULT hres;
4271
4272 hres = IHTMLFormElement_get_name(form, &name);
4273 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
4274 if(ex)
4275 ok_(__FILE__,line)(!strcmp_wa(name, ex), "name=%s, expected %s\n", wine_dbgstr_w(name), ex);
4276 else
4277 ok_(__FILE__,line)(!name, "name=%p\n", name);
4278
4279 SysFreeString(name);
4280 IHTMLFormElement_Release(form);
4281 }
4282
4283 #define test_form_put_name(f,a) _test_form_put_name(__LINE__,f,a)
4284 static void _test_form_put_name(unsigned line, IUnknown *unk, const char *name)
4285 {
4286 IHTMLFormElement *form = _get_form_iface(line, unk);
4287 BSTR tmp = a2bstr(name);
4288 HRESULT hres;
4289
4290 hres = IHTMLFormElement_put_name(form, tmp);
4291 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
4292 SysFreeString(tmp);
4293 IHTMLFormElement_Release(form);
4294
4295 _test_form_name(line, unk, name);
4296 }
4297
4298 #define test_form_encoding(f,a) _test_form_encoding(__LINE__,f,a)
4299 static void _test_form_encoding(unsigned line, IUnknown *unk, const char *ex)
4300 {
4301 IHTMLFormElement *form = _get_form_iface(line, unk);
4302 BSTR encoding = (void*)0xdeadbeef;
4303 HRESULT hres;
4304
4305 hres = IHTMLFormElement_get_encoding(form, &encoding);
4306 ok_(__FILE__,line)(hres == S_OK, "get_encoding failed: %08x\n", hres);
4307 if(ex)
4308 ok_(__FILE__,line)(!strcmp_wa(encoding, ex), "encoding=%s, expected %s\n", wine_dbgstr_w(encoding), ex);
4309 else
4310 ok_(__FILE__,line)(!encoding, "encoding=%p\n", encoding);
4311
4312 SysFreeString(encoding);
4313 IHTMLFormElement_Release(form);
4314 }
4315
4316 #define test_form_put_encoding(f,r,a) _test_form_put_encoding(__LINE__,f,r,a)
4317 static void _test_form_put_encoding(unsigned line, IUnknown *unk, HRESULT exp_hres, const char *encoding)
4318 {
4319 IHTMLFormElement *form = _get_form_iface(line, unk);
4320 BSTR tmp = a2bstr(encoding);
4321 HRESULT hres;
4322
4323 hres = IHTMLFormElement_put_encoding(form, tmp);
4324 ok_(__FILE__,line)(hres == exp_hres, "put_encoding returned: %08x, expected %08x\n", hres, exp_hres);
4325 SysFreeString(tmp);
4326 IHTMLFormElement_Release(form);
4327
4328 if(exp_hres == S_OK)
4329 _test_form_encoding(line, unk, encoding);
4330 }
4331
4332 #define test_form_elements(a) _test_form_elements(__LINE__,a)
4333 static void _test_form_elements(unsigned line, IUnknown *unk)
4334 {
4335 IHTMLFormElement *form = _get_form_iface(line, unk);
4336 IDispatch *disp;
4337 HRESULT hres;
4338
4339 disp = NULL;
4340 hres = IHTMLFormElement_get_elements(form, &disp);
4341 ok_(__FILE__,line)(hres == S_OK, "get_elements failed: %08x\n", hres);
4342 ok_(__FILE__,line)(disp != NULL, "disp = NULL\n");
4343 ok_(__FILE__,line)(iface_cmp((IUnknown*)form, (IUnknown*)disp), "disp != form\n");
4344
4345 IDispatch_Release(disp);
4346 IHTMLFormElement_Release(form);
4347 }
4348
4349 #define test_form_reset(a) _test_form_reset(__LINE__,a)
4350 static void _test_form_reset(unsigned line, IUnknown *unk)
4351 {
4352 IHTMLFormElement *form = _get_form_iface(line, unk);
4353 HRESULT hres;
4354
4355 hres = IHTMLFormElement_reset(form);
4356 ok_(__FILE__,line)(hres == S_OK, "reset failed: %08x\n", hres);
4357
4358 IHTMLFormElement_Release(form);
4359 }
4360
4361 static void test_form_target(IUnknown *unk)
4362 {
4363 IHTMLFormElement *form = get_form_iface(unk);
4364 HRESULT hres;
4365 BSTR str;
4366 static const char target[] = "_blank";
4367
4368 str = a2bstr(target);
4369 hres = IHTMLFormElement_put_target(form, str);
4370 ok(hres == S_OK, "put_target(%s) failed: %08x\n", target, hres);
4371 SysFreeString(str);
4372
4373 hres = IHTMLFormElement_get_target(form, &str);
4374 ok(hres == S_OK, "get_target failed: %08x\n", hres);
4375 ok(!strcmp_wa(str, target), "Expected %s, got %s\n", target, wine_dbgstr_w(str));
4376 SysFreeString(str);
4377
4378 IHTMLFormElement_Release(form);
4379 }
4380
4381 static void test_select_form(IUnknown *uselect, IUnknown *uform)
4382 {
4383 IHTMLSelectElement *select = get_select_iface(uselect);
4384 IHTMLFormElement *form;
4385 HRESULT hres;
4386
4387 hres = IHTMLSelectElement_get_form(select, NULL);
4388 ok(hres == E_POINTER, "got %08x\n, expected E_POINTER\n", hres);
4389
4390 hres = IHTMLSelectElement_get_form(select, &form);
4391 ok(hres == S_OK, "get_form failed: %08x\n", hres);
4392 ok(form != NULL, "form == NULL\n");
4393
4394 test_form_length((IUnknown*)form, 1);
4395 test_form_elements((IUnknown*)form);
4396 test_form_name((IUnknown*)form, "form_name");
4397
4398 ok(iface_cmp(uform, (IUnknown*)form), "Expected %p, got %p\n", uform, form);
4399
4400 IHTMLSelectElement_Release(select);
4401 IHTMLFormElement_Release(form);
4402 }
4403
4404 static void test_select_form_notfound(IHTMLSelectElement *select)
4405 {
4406 IHTMLFormElement *form;
4407 HRESULT hres;
4408
4409 form = (IHTMLFormElement*)0xdeadbeef;
4410 hres = IHTMLSelectElement_get_form(select, &form);
4411 ok(hres == S_OK, "get_form failed: %08x\n", hres);
4412 ok(form == NULL, "got %p\n", form);
4413 }
4414
4415 #define test_meta_name(a,b) _test_meta_name(__LINE__,a,b)
4416 static void _test_meta_name(unsigned line, IUnknown *unk, const char *exname)
4417 {
4418 IHTMLMetaElement *meta;
4419 BSTR name = NULL;
4420 HRESULT hres;
4421
4422 meta = _get_metaelem_iface(line, unk);
4423 hres = IHTMLMetaElement_get_name(meta, &name);
4424 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
4425 ok_(__FILE__,line)(!strcmp_wa(name, exname), "name = %s, expected %s\n", wine_dbgstr_w(name), exname);
4426 SysFreeString(name);
4427 IHTMLMetaElement_Release(meta);
4428 }
4429
4430 #define test_meta_content(a,b) _test_meta_content(__LINE__,a,b)
4431 static void _test_meta_content(unsigned line, IUnknown *unk, const char *excontent)
4432 {
4433 IHTMLMetaElement *meta;
4434 BSTR content = NULL;
4435 HRESULT hres;
4436
4437 meta = _get_metaelem_iface(line, unk);
4438 hres = IHTMLMetaElement_get_content(meta, &content);
4439 ok_(__FILE__,line)(hres == S_OK, "get_content failed: %08x\n", hres);
4440 ok_(__FILE__,line)(!strcmp_wa(content, excontent), "content = %s, expected %s\n", wine_dbgstr_w(content), excontent);
4441 SysFreeString(content);
4442 IHTMLMetaElement_Release(meta);
4443 }
4444
4445 #define test_meta_httpequiv(a,b) _test_meta_httpequiv(__LINE__,a,b)
4446 static void _test_meta_httpequiv(unsigned line, IUnknown *unk, const char *exval)
4447 {
4448 IHTMLMetaElement *meta;
4449 BSTR val = NULL;
4450 HRESULT hres;
4451
4452 meta = _get_metaelem_iface(line, unk);
4453 hres = IHTMLMetaElement_get_httpEquiv(meta, &val);
4454 ok_(__FILE__,line)(hres == S_OK, "get_httpEquiv failed: %08x\n", hres);
4455 ok_(__FILE__,line)(!strcmp_wa(val, exval), "httpEquiv = %s, expected %s\n", wine_dbgstr_w(val), exval);
4456 SysFreeString(val);
4457 IHTMLMetaElement_Release(meta);
4458 }
4459
4460 #define test_meta_charset(a,b) _test_meta_charset(__LINE__,a,b)
4461 static void _test_meta_charset(unsigned line, IUnknown *unk, const char *exval)
4462 {
4463 IHTMLMetaElement *meta;
4464 BSTR val = NULL;
4465 HRESULT hres;
4466
4467 meta = _get_metaelem_iface(line, unk);
4468 hres = IHTMLMetaElement_get_charset(meta, &val);
4469 ok_(__FILE__,line)(hres == S_OK, "get_charset failed: %08x\n", hres);
4470 if(exval)
4471 ok_(__FILE__,line)(!strcmp_wa(val, exval), "charset = %s, expected %s\n", wine_dbgstr_w(val), exval);
4472 else
4473 ok_(__FILE__,line)(!val, "charset = %s, expected NULL\n", wine_dbgstr_w(val));
4474 SysFreeString(val);
4475 IHTMLMetaElement_Release(meta);
4476 }
4477
4478 #define set_meta_charset(a,b) _set_meta_charset(__LINE__,a,b)
4479 static void _set_meta_charset(unsigned line, IUnknown *unk, const char *vala)
4480 {
4481 BSTR val = a2bstr(vala);
4482 IHTMLMetaElement *meta;
4483 HRESULT hres;
4484
4485 meta = _get_metaelem_iface(line, unk);
4486 hres = IHTMLMetaElement_put_charset(meta, val);
4487 ok_(__FILE__,line)(hres == S_OK, "put_charset failed: %08x\n", hres);
4488 SysFreeString(val);
4489 IHTMLMetaElement_Release(meta);
4490
4491 _test_meta_charset(line, unk, vala);
4492 }
4493
4494 #define test_link_media(a,b) _test_link_media(__LINE__,a,b)
4495 static void _test_link_media(unsigned line, IHTMLElement *elem, const char *exval)
4496 {
4497 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4498 HRESULT hres;
4499 BSTR str;
4500
4501 str = a2bstr(exval);
4502 hres = IHTMLLinkElement_put_media(link, str);
4503 ok_(__FILE__,line)(hres == S_OK, "put_media(%s) failed: %08x\n", exval, hres);
4504 SysFreeString(str);
4505
4506 hres = IHTMLLinkElement_get_media(link, &str);
4507 ok_(__FILE__,line)(hres == S_OK, "get_media failed: %08x\n", hres);
4508 ok_(__FILE__,line)(!strcmp_wa(str, exval), "got %s, expected %s\n", wine_dbgstr_w(str), exval);
4509 SysFreeString(str);
4510 IHTMLLinkElement_Release(link);
4511 }
4512
4513 #define test_link_disabled(a,b) _test_link_disabled(__LINE__,a,b)
4514 static void _test_link_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL v)
4515 {
4516 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4517 VARIANT_BOOL b = 10;
4518 HRESULT hres;
4519
4520 hres = IHTMLLinkElement_get_disabled(link, &b);
4521 ok_(__FILE__,line)(hres == S_OK, "get_disabled failed: %08x\n", hres);
4522 ok_(__FILE__,line)(b == v, "disabled = %x, expected %x\n", b, v);
4523
4524 IHTMLLinkElement_Release(link);
4525 }
4526
4527 #define link_put_disabled(a,b) _link_put_disabled(__LINE__,a,b)
4528 static void _link_put_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL v)
4529 {
4530 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4531 HRESULT hres;
4532
4533 hres = IHTMLLinkElement_put_disabled(link, v);
4534 ok_(__FILE__,line)(hres == S_OK, "put_disabled failed: %08x\n", hres);
4535 IHTMLLinkElement_Release(link);
4536 _test_link_disabled(line, elem, v);
4537 }
4538
4539 #define test_link_rel(a,b) _test_link_rel(__LINE__,a,b)
4540 static void _test_link_rel(unsigned line, IHTMLElement *elem, const char *v)
4541 {
4542 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4543 BSTR rel;
4544 HRESULT hres;
4545
4546 hres = IHTMLLinkElement_get_rel(link, &rel);
4547 ok_(__FILE__,line)(hres == S_OK, "get_rel failed: %08x\n", hres);
4548 if(v)
4549 ok_(__FILE__,line)(!strcmp_wa(rel, v), "rel = %s, expected %s\n", wine_dbgstr_w(rel), v);
4550 else
4551 ok_(__FILE__,line)(!rel, "rel = %s, expected NULL\n", wine_dbgstr_w(rel));
4552
4553 IHTMLLinkElement_Release(link);
4554 }
4555
4556 #define link_put_rel(a,b) _link_put_rel(__LINE__,a,b)
4557 static void _link_put_rel(unsigned line, IHTMLElement *elem, const char *v)
4558 {
4559 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4560 BSTR str = a2bstr(v);
4561 HRESULT hres;
4562
4563 hres = IHTMLLinkElement_put_rel(link, str);
4564 ok_(__FILE__,line)(hres == S_OK, "put_disabled failed: %08x\n", hres);
4565 SysFreeString(str);
4566 IHTMLLinkElement_Release(link);
4567 _test_link_rel(line, elem, v);
4568 }
4569
4570 #define test_link_rev(a,b) _test_link_rev(__LINE__,a,b)
4571 static void _test_link_rev(unsigned line, IHTMLElement *elem, const char *v)
4572 {
4573 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4574 BSTR rev;
4575 HRESULT hres;
4576
4577 hres = IHTMLLinkElement_get_rev(link, &rev);
4578 ok_(__FILE__,line)(hres == S_OK, "get_rev failed: %08x\n", hres);
4579 if(v)
4580 ok_(__FILE__,line)(!strcmp_wa(rev, v), "rev = %s, expected %s\n", wine_dbgstr_w(rev), v);
4581 else
4582 ok_(__FILE__,line)(!rev, "rev = %s, expected NULL\n", wine_dbgstr_w(rev));
4583
4584 IHTMLLinkElement_Release(link);
4585 }
4586
4587 #define link_put_rev(a,b) _link_put_rev(__LINE__,a,b)
4588 static void _link_put_rev(unsigned line, IHTMLElement *elem, const char *v)
4589 {
4590 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4591 BSTR str = a2bstr(v);
4592 HRESULT hres;
4593
4594 hres = IHTMLLinkElement_put_rev(link, str);
4595 ok_(__FILE__,line)(hres == S_OK, "put_disabled failed: %08x\n", hres);
4596 SysFreeString(str);
4597 IHTMLLinkElement_Release(link);
4598 _test_link_rev(line, elem, v);
4599 }
4600
4601 #define test_link_type(a,b) _test_link_type(__LINE__,a,b)
4602 static void _test_link_type(unsigned line, IHTMLElement *elem, const char *v)
4603 {
4604 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4605 BSTR type;
4606 HRESULT hres;
4607
4608 hres = IHTMLLinkElement_get_type(link, &type);
4609 ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08x\n", hres);
4610 if(v)
4611 ok_(__FILE__,line)(!strcmp_wa(type, v), "type = %s, expected %s\n", wine_dbgstr_w(type), v);
4612 else
4613 ok_(__FILE__,line)(!type, "type = %s, expected NULL\n", wine_dbgstr_w(type));
4614
4615 IHTMLLinkElement_Release(link);
4616 }
4617
4618 #define test_script_text(a,b) _test_script_text(__LINE__,a,b)
4619 static void _test_script_text(unsigned line, IHTMLScriptElement *script, const char *extext)
4620 {
4621 BSTR str;
4622 HRESULT hres;
4623
4624 str = (void*)0xdeadbeef;
4625 hres = IHTMLScriptElement_get_text(script, &str);
4626 ok_(__FILE__,line)(hres == S_OK, "get_text failed: %08x\n", hres);
4627 ok(!strcmp_wa(str, extext), "text = %s, expected \"%s\"\n", wine_dbgstr_w(str), extext);
4628 SysFreeString(str);
4629 }
4630
4631 #define link_put_type(a,b) _link_put_type(__LINE__,a,b)
4632 static void _link_put_type(unsigned line, IHTMLElement *elem, const char *v)
4633 {
4634 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4635 BSTR str = a2bstr(v);
4636 HRESULT hres;
4637
4638 hres = IHTMLLinkElement_put_type(link, str);
4639 ok_(__FILE__,line)(hres == S_OK, "put_disabled failed: %08x\n", hres);
4640 SysFreeString(str);
4641 IHTMLLinkElement_Release(link);
4642 _test_link_type(line, elem, v);
4643 }
4644
4645 #define test_link_href(a,b) _test_link_href(__LINE__,a,b)
4646 static void _test_link_href(unsigned line, IHTMLElement *elem, const char *v)
4647 {
4648 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4649 BSTR href;
4650 HRESULT hres;
4651
4652 hres = IHTMLLinkElement_get_href(link, &href);
4653 ok_(__FILE__,line)(hres == S_OK, "get_href failed: %08x\n", hres);
4654 if(v)
4655 ok_(__FILE__,line)(!strcmp_wa(href, v), "href = %s, expected %s\n", wine_dbgstr_w(href), v);
4656 else
4657 ok_(__FILE__,line)(!href, "href = %s, expected NULL\n", wine_dbgstr_w(href));
4658
4659 IHTMLLinkElement_Release(link);
4660 }
4661
4662 #define link_put_href(a,b) _link_put_href(__LINE__,a,b)
4663 static void _link_put_href(unsigned line, IHTMLElement *elem, const char *v)
4664 {
4665 IHTMLLinkElement *link = _get_link_iface(line, (IUnknown*)elem);
4666 BSTR str = a2bstr(v);
4667 HRESULT hres;
4668
4669 hres = IHTMLLinkElement_put_href(link, str);
4670 ok_(__FILE__,line)(hres == S_OK, "put_disabled failed: %08x\n", hres);
4671 SysFreeString(str);
4672 IHTMLLinkElement_Release(link);
4673 _test_link_href(line, elem, v);
4674 }
4675
4676 #define get_elem_doc(e) _get_elem_doc(__LINE__,e)
4677 static IHTMLDocument2 *_get_elem_doc(unsigned line, IUnknown *unk)
4678 {
4679 IHTMLElement *elem = _get_elem_iface(line, unk);
4680 IHTMLDocument2 *doc;
4681 IDispatch *disp;
4682 HRESULT hres;
4683
4684 disp = NULL;
4685 hres = IHTMLElement_get_document(elem, &disp);
4686 ok(hres == S_OK, "get_document failed: %08x\n", hres);
4687 ok(disp != NULL, "disp == NULL\n");
4688
4689 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&doc);
4690 IDispatch_Release(disp);
4691 ok(hres == S_OK, "Could not get IHTMLDocument2 iface: %08x\n", hres);
4692
4693 return doc;
4694 }
4695
4696 #define get_elem_attr_node(a,b,c) _get_elem_attr_node(__LINE__,a,b,c)
4697 static IHTMLDOMAttribute *_get_elem_attr_node(unsigned line, IUnknown *unk, const char *attr_name, BOOL expect_success)
4698 {
4699 IHTMLElement4 *elem = _get_elem4_iface(line, unk);
4700 BSTR str = a2bstr(attr_name);
4701 IHTMLDOMAttribute *attr;
4702 HRESULT hres;
4703
4704 attr = (void*)0xdeadbeef;
4705 hres = IHTMLElement4_getAttributeNode(elem, str, &attr);
4706 ok_(__FILE__,line)(hres == S_OK, "getAttributeNode failed: %08x\n", hres);
4707 if(expect_success)
4708 ok_(__FILE__,line)(attr != NULL, "attr = NULL\n");
4709 else
4710 ok_(__FILE__,line)(!attr, "attr = %p\n", attr);
4711
4712 IHTMLElement4_Release(elem);
4713 SysFreeString(str);
4714 return attr;
4715 }
4716
4717 #define get_attr_node_value(a,b,c) _get_attr_node_value(__LINE__,a,b,c)
4718 static void _get_attr_node_value(unsigned line, IHTMLDOMAttribute *attr, VARIANT *v, VARTYPE vt)
4719 {
4720 HRESULT hres;
4721
4722 hres = IHTMLDOMAttribute_get_nodeValue(attr, v);
4723 ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x\n", hres);
4724 ok_(__FILE__,line) (V_VT(v) == vt, "vt=%d, expected %d\n", V_VT(v), vt);
4725 }
4726
4727 #define put_attr_node_value(a,b) _put_attr_node_value(__LINE__,a,b)
4728 static void _put_attr_node_value(unsigned line, IHTMLDOMAttribute *attr, VARIANT v)
4729 {
4730 HRESULT hres;
4731
4732 hres = IHTMLDOMAttribute_put_nodeValue(attr, v);
4733 ok_(__FILE__,line) (hres == S_OK, "put_nodeValue failed: %08x\n", hres);
4734 }
4735
4736 #define get_window_doc(e) _get_window_doc(__LINE__,e)
4737 static IHTMLDocument2 *_get_window_doc(unsigned line, IHTMLWindow2 *window)
4738 {
4739 IHTMLDocument2 *doc;
4740 HRESULT hres;
4741
4742 doc = NULL;
4743 hres = IHTMLWindow2_get_document(window, &doc);
4744 ok(hres == S_OK, "get_document failed: %08x\n", hres);
4745 ok(doc != NULL, "disp == NULL\n");
4746
4747 return doc;
4748 }
4749
4750 #define doc_get_body(d) _doc_get_body(__LINE__,d)
4751 static IHTMLElement *_doc_get_body(unsigned line, IHTMLDocument2 *doc)
4752 {
4753 IHTMLElement *elem;
4754 HRESULT hres;
4755
4756 hres = IHTMLDocument2_get_body(doc, &elem);
4757 ok_(__FILE__,line)(hres == S_OK, "get_body failed: %08x\n", hres);
4758 ok_(__FILE__,line)(elem != NULL, "body == NULL\n");
4759
4760 return elem;
4761 }
4762
4763 #define test_create_elem(d,t) _test_create_elem(__LINE__,d,t)
4764 static IHTMLElement *_test_create_elem(unsigned line, IHTMLDocument2 *doc, const char *tag)
4765 {
4766 IHTMLElement *elem = NULL;
4767 BSTR tmp;
4768 HRESULT hres;
4769
4770 tmp = a2bstr(tag);
4771 hres = IHTMLDocument2_createElement(doc, tmp, &elem);
4772 ok_(__FILE__,line) (hres == S_OK, "createElement failed: %08x\n", hres);
4773 ok_(__FILE__,line) (elem != NULL, "elem == NULL\n");
4774 SysFreeString(tmp);
4775
4776 return elem;
4777 }
4778
4779 #define test_create_text(d,t) _test_create_text(__LINE__,d,t)
4780 static IHTMLDOMNode *_test_create_text(unsigned line, IHTMLDocument2 *doc, const char *text)
4781 {
4782 IHTMLDocument3 *doc3;
4783 IHTMLDOMNode *node = NULL;
4784 BSTR tmp;
4785 HRESULT hres;
4786
4787 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
4788 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3: %08x\n", hres);
4789
4790 tmp = a2bstr(text);
4791 hres = IHTMLDocument3_createTextNode(doc3, tmp, &node);
4792 IHTMLDocument3_Release(doc3);
4793 SysFreeString(tmp);
4794 ok_(__FILE__,line) (hres == S_OK, "createElement failed: %08x\n", hres);
4795 ok_(__FILE__,line) (node != NULL, "node == NULL\n");
4796
4797 return node;
4798 }
4799
4800 #define test_node_append_child(n,c) _test_node_append_child(__LINE__,n,c)
4801 static IHTMLDOMNode *_test_node_append_child(unsigned line, IUnknown *node_unk, IUnknown *child_unk)
4802 {
4803 IHTMLDOMNode *node = _get_node_iface(line, node_unk);
4804 IHTMLDOMNode *child = _get_node_iface(line, child_unk);
4805 IHTMLDOMNode *new_child = NULL;
4806 HRESULT hres;
4807
4808 hres = IHTMLDOMNode_appendChild(node, child, &new_child);
4809 ok_(__FILE__,line) (hres == S_OK, "appendChild failed: %08x\n", hres);
4810 ok_(__FILE__,line) (new_child != NULL, "new_child == NULL\n");
4811 /* TODO ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
4812
4813 IHTMLDOMNode_Release(node);
4814 IHTMLDOMNode_Release(child);
4815
4816 return new_child;
4817 }
4818
4819 #define test_node_insertbefore(n,c,v) _test_node_insertbefore(__LINE__,n,c,v)
4820 static IHTMLDOMNode *_test_node_insertbefore(unsigned line, IUnknown *node_unk, IHTMLDOMNode *child, VARIANT *var)
4821 {
4822 IHTMLDOMNode *node = _get_node_iface(line, node_unk);
4823 IHTMLDOMNode *new_child = NULL;
4824 HRESULT hres;
4825
4826 hres = IHTMLDOMNode_insertBefore(node, child, *var, &new_child);
4827 ok_(__FILE__,line) (hres == S_OK, "insertBefore failed: %08x\n", hres);
4828 ok_(__FILE__,line) (new_child != NULL, "new_child == NULL\n");
4829 /* TODO ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
4830
4831 IHTMLDOMNode_Release(node);
4832
4833 return new_child;
4834 }
4835
4836 #define test_node_remove_child(n,c) _test_node_remove_child(__LINE__,n,c)
4837 static void _test_node_remove_child(unsigned line, IUnknown *unk, IHTMLDOMNode *child)
4838 {
4839 IHTMLDOMNode *node = _get_node_iface(line, unk);
4840 IHTMLDOMNode *new_node = NULL;
4841 HRESULT hres;
4842
4843 hres = IHTMLDOMNode_removeChild(node, child, &new_node);
4844 ok_(__FILE__,line) (hres == S_OK, "removeChild failed: %08x\n", hres);
4845 ok_(__FILE__,line) (new_node != NULL, "new_node == NULL\n");
4846 /* TODO ok_(__FILE__,line) (new_node != child, "new_node == child\n"); */
4847
4848 IHTMLDOMNode_Release(node);
4849 IHTMLDOMNode_Release(new_node);
4850 }
4851
4852 #define test_doc_title(d,t) _test_doc_title(__LINE__,d,t)
4853 static void _test_doc_title(unsigned line, IHTMLDocument2 *doc, const char *extitle)
4854 {
4855 BSTR title = NULL;
4856 HRESULT hres;
4857
4858 hres = IHTMLDocument2_get_title(doc, &title);
4859 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
4860 ok_(__FILE__,line) (!strcmp_wa(title, extitle), "unexpected title %s\n", wine_dbgstr_w(title));
4861 SysFreeString(title);
4862 }
4863
4864 #define test_doc_set_title(d,t) _test_doc_set_title(__LINE__,d,t)
4865 static void _test_doc_set_title(unsigned line, IHTMLDocument2 *doc, const char *title)
4866 {
4867 BSTR tmp;
4868 HRESULT hres;
4869
4870 tmp = a2bstr(title);
4871 hres = IHTMLDocument2_put_title(doc, tmp);
4872 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
4873 SysFreeString(tmp);
4874 }
4875
4876 static void test_elem_bounding_client_rect(IUnknown *unk)
4877 {
4878 IHTMLRect *rect, *rect2;
4879 IHTMLElement2 *elem2;
4880 LONG l;
4881 HRESULT hres;
4882
4883 elem2 = get_elem2_iface(unk);
4884 hres = IHTMLElement2_getBoundingClientRect(elem2, &rect);
4885 ok(hres == S_OK, "getBoundingClientRect failed: %08x\n", hres);
4886 hres = IHTMLElement2_getBoundingClientRect(elem2, &rect2);
4887 IHTMLElement2_Release(elem2);
4888 ok(hres == S_OK, "getBoundingClientRect failed: %08x\n", hres);
4889 ok(rect != NULL, "rect == NULL\n");
4890 ok(rect != rect2, "rect == rect2\n");
4891 IHTMLRect_Release(rect2);
4892
4893 test_disp((IUnknown*)rect, &IID_IHTMLRect, "[object]");
4894
4895 l = 0xdeadbeef;
4896 hres = IHTMLRect_get_top(rect, &l);
4897 ok(hres == S_OK, "get_top failed: %08x\n", hres);
4898 ok(l != 0xdeadbeef, "l = 0xdeadbeef\n");
4899
4900 l = 0xdeadbeef;
4901 hres = IHTMLRect_get_left(rect, &l);
4902 ok(hres == S_OK, "get_left failed: %08x\n", hres);
4903 ok(l != 0xdeadbeef, "l = 0xdeadbeef\n");
4904
4905 l = 0xdeadbeef;
4906 hres = IHTMLRect_get_bottom(rect, &l);
4907 ok(hres == S_OK, "get_bottom failed: %08x\n", hres);
4908 ok(l != 0xdeadbeef, "l = 0xdeadbeef\n");
4909
4910 l = 0xdeadbeef;
4911 hres = IHTMLRect_get_right(rect, &l);
4912 ok(hres == S_OK, "get_right failed: %08x\n", hres);
4913 ok(l != 0xdeadbeef, "l = 0xdeadbeef\n");
4914
4915 IHTMLRect_Release(rect);
4916 }
4917
4918 static void test_elem_col_item(IHTMLElementCollection *col, const char *n,
4919 const elem_type_t *elem_types, LONG len)
4920 {
4921 IDispatch *disp;
4922 VARIANT name, index;
4923 DWORD i;
4924 HRESULT hres;
4925
4926 V_VT(&index) = VT_EMPTY;
4927 V_VT(&name) = VT_BSTR;
4928 V_BSTR(&name) = a2bstr(n);
4929
4930 hres = IHTMLElementCollection_item(col, name, index, &disp);
4931 ok(hres == S_OK, "item failed: %08x\n", hres);
4932
4933 test_elem_collection((IUnknown*)disp, elem_types, len);
4934 IDispatch_Release(disp);
4935
4936 V_VT(&index) = VT_I4;
4937
4938 for(i=0; i<len; i++) {
4939 V_I4(&index) = i;
4940 disp = (void*)0xdeadbeef;
4941 hres = IHTMLElementCollection_item(col, name, index, &disp);
4942 ok(hres == S_OK, "item failed: %08x\n", hres);
4943 ok(disp != NULL, "disp == NULL\n");
4944 if(FAILED(hres) || !disp)
4945 continue;
4946
4947 test_elem_type((IUnknown*)disp, elem_types[i]);
4948
4949 IDispatch_Release(disp);
4950 }
4951
4952 V_I4(&index) = len;
4953 disp = (void*)0xdeadbeef;
4954 hres = IHTMLElementCollection_item(col, name, index, &disp);
4955 ok(hres == S_OK, "item failed: %08x\n", hres);
4956 ok(disp == NULL, "disp != NULL\n");
4957
4958 V_I4(&index) = -1;
4959 disp = (void*)0xdeadbeef;
4960 hres = IHTMLElementCollection_item(col, name, index, &disp);
4961 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
4962 ok(disp == NULL, "disp != NULL\n");
4963
4964 SysFreeString(V_BSTR(&name));
4965 }
4966
4967 static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, const char *id, BOOL expect_success)
4968 {
4969 IHTMLElementCollection *col;
4970 IHTMLElement *elem;
4971 IDispatch *disp = (void*)0xdeadbeef;
4972 VARIANT name, index;
4973 HRESULT hres;
4974
4975 hres = IHTMLDocument2_get_all(doc, &col);
4976 ok(hres == S_OK, "get_all failed: %08x\n", hres);
4977 ok(col != NULL, "col == NULL\n");
4978 if(FAILED(hres) || !col)
4979 return NULL;
4980
4981 V_VT(&index) = VT_EMPTY;
4982 V_VT(&name) = VT_BSTR;
4983 V_BSTR(&name) = a2bstr(id);
4984
4985 hres = IHTMLElementCollection_item(col, name, index, &disp);
4986 IHTMLElementCollection_Release(col);
4987 SysFreeString(V_BSTR(&name));
4988 ok(hres == S_OK, "item failed: %08x\n", hres);
4989 if(!expect_success) {
4990 ok(disp == NULL, "disp != NULL\n");
4991 return NULL;
4992 }
4993
4994 ok(disp != NULL, "disp == NULL\n");
4995 if(!disp)
4996 return NULL;
4997
4998 elem = get_elem_iface((IUnknown*)disp);
4999 IDispatch_Release(disp);
5000
5001 return elem;
5002 }
5003
5004 static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, const char *id)
5005 {
5006 IHTMLDocument3 *doc3;
5007 IHTMLElement *elem;
5008 BSTR tmp;
5009 HRESULT hres;
5010
5011 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
5012 ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
5013
5014 tmp = a2bstr(id);
5015 hres = IHTMLDocument3_getElementById(doc3, tmp, &elem);
5016 SysFreeString(tmp);
5017 ok(hres == S_OK, "getElementById(%s) failed: %08x\n", id, hres);
5018
5019 IHTMLDocument3_Release(doc3);
5020
5021 return elem;
5022 }
5023
5024 static void test_select_elem(IHTMLSelectElement *select)
5025 {
5026 IDispatch *disp, *disp2;
5027 VARIANT name, index;
5028 HRESULT hres;
5029
5030 test_select_type(select, "select-one");
5031 test_select_length(select, 2);
5032 test_select_selidx(select, 0);
5033 test_select_put_selidx(select, 1);
5034
5035 test_select_set_value(select, "val1");
5036 test_select_value(select, "val1");
5037
5038 test_select_size(select, 0);
5039 test_select_set_size(select, 1, S_OK);
5040 test_select_size(select, 1);
5041
5042 test_select_set_size(select, -1, CTL_E_INVALIDPROPERTYVALUE);
5043 test_select_size(select, 1);
5044 test_select_set_size(select, 3, S_OK);
5045 test_select_size(select, 3);
5046
5047 test_select_name(select, NULL);
5048 test_select_set_name(select, "select-name");
5049 test_select_name(select, "select-name");
5050 test_select_form_notfound(select);
5051
5052 test_select_get_disabled(select, VARIANT_FALSE);
5053 test_select_set_disabled(select, VARIANT_TRUE);
5054 test_select_set_disabled(select, VARIANT_FALSE);
5055
5056 disp = NULL;
5057 hres = IHTMLSelectElement_get_options(select, &disp);
5058 ok(hres == S_OK, "get_options failed: %08x\n", hres);
5059 ok(disp != NULL, "options == NULL\n");
5060 ok(iface_cmp((IUnknown*)disp, (IUnknown*)select), "disp != select\n");
5061 IDispatch_Release(disp);
5062
5063 V_VT(&index) = VT_EMPTY;
5064 V_VT(&name) = VT_I4;
5065 V_I4(&name) = -1;
5066 disp = (void*)0xdeadbeef;
5067 hres = IHTMLSelectElement_item(select, name, index, &disp);
5068 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
5069 ok(!disp, "disp = %p\n", disp);
5070
5071 V_I4(&name) = 2;
5072 disp = (void*)0xdeadbeef;
5073 hres = IHTMLSelectElement_item(select, name, index, &disp);
5074 ok(hres == S_OK, "item failed: %08x\n", hres);
5075 ok(!disp, "disp = %p\n", disp);
5076
5077 V_I4(&name) = 1;
5078 hres = IHTMLSelectElement_item(select, name, index, NULL);
5079 ok(hres == E_POINTER || broken(hres == E_INVALIDARG), "item failed: %08x, expected E_POINTER\n", hres);
5080
5081 disp = NULL;
5082 hres = IHTMLSelectElement_item(select, name, index, &disp);
5083 ok(hres == S_OK, "item failed: %08x\n", hres);
5084 ok(disp != NULL, "disp = NULL\n");
5085 test_disp((IUnknown*)disp, &DIID_DispHTMLOptionElement, NULL);
5086
5087 V_VT(&index) = VT_I4;
5088 V_I4(&index) = 1;
5089 disp2 = NULL;
5090 hres = IHTMLSelectElement_item(select, name, index, &disp2);
5091 ok(hres == S_OK, "item failed: %08x\n", hres);
5092 ok(disp2 != NULL, "disp = NULL\n");
5093 ok(iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n");
5094 IDispatch_Release(disp2);
5095 IDispatch_Release(disp);
5096
5097 test_select_multiple(select, VARIANT_FALSE);
5098 test_select_set_multiple(select, VARIANT_TRUE);
5099 test_select_remove(select);
5100 }
5101
5102 static void test_form_item(IHTMLElement *elem)
5103 {
5104 IHTMLFormElement *form = get_form_iface((IUnknown*)elem);
5105 IDispatch *disp, *disp2;
5106 VARIANT name, index;
5107 HRESULT hres;
5108
5109 V_VT(&index) = VT_EMPTY;
5110 V_VT(&name) = VT_I4;
5111 V_I4(&name) = -1;
5112 disp = (void*)0xdeadbeef;
5113 hres = IHTMLFormElement_item(form, name, index, &disp);
5114 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
5115 ok(!disp, "disp = %p\n", disp);
5116
5117 V_I4(&name) = 2;
5118 disp = (void*)0xdeadbeef;
5119 hres = IHTMLFormElement_item(form, name, index, &disp);
5120 ok(hres == S_OK, "item failed: %08x\n", hres);
5121 ok(!disp, "disp = %p\n", disp);
5122
5123 V_I4(&name) = 1;
5124 hres = IHTMLFormElement_item(form, name, index, NULL);
5125 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
5126
5127 disp = NULL;
5128 hres = IHTMLFormElement_item(form, name, index, &disp);
5129 ok(hres == S_OK, "item failed: %08x\n", hres);
5130 ok(disp != NULL, "disp = NULL\n");
5131 test_disp((IUnknown*)disp, &DIID_DispHTMLInputElement, NULL);
5132
5133 V_VT(&index) = VT_I4;
5134 V_I4(&index) = 1;
5135 disp2 = NULL;
5136 hres = IHTMLFormElement_item(form, name, index, &disp2);
5137 ok(hres == S_OK, "item failed: %08x\n", hres);
5138 ok(disp2 != NULL, "disp = NULL\n");
5139 ok(iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n");
5140 IDispatch_Release(disp2);
5141 IDispatch_Release(disp);
5142 }
5143
5144 static void test_create_option_elem(IHTMLDocument2 *doc)
5145 {
5146 IHTMLOptionElement *option;
5147
5148 option = create_option_elem(doc, "test text", "test value");
5149
5150 test_option_put_text(option, "new text");
5151 test_option_put_value(option, "new value");
5152 test_option_get_index(option, 0);
5153 test_option_defaultSelected_property(option);
5154 test_option_put_selected(option, VARIANT_TRUE);
5155 test_option_put_selected(option, VARIANT_FALSE);
5156
5157 IHTMLOptionElement_Release(option);
5158 }
5159
5160 static void test_option_form(IUnknown *uoption, IUnknown *uform)
5161 {
5162 IHTMLOptionElement *option = get_option_iface(uoption);
5163 IHTMLFormElement *form;
5164 HRESULT hres;
5165
5166 hres = IHTMLOptionElement_get_form(option, NULL);
5167 ok(hres == E_POINTER, "got %08x\n, expected E_POINTER\n", hres);
5168
5169 hres = IHTMLOptionElement_get_form(option, &form);
5170 ok(hres == S_OK, "get_form failed: %08x\n", hres);
5171 ok(form != NULL, "form == NULL\n");
5172
5173 ok(iface_cmp(uform, (IUnknown*)form), "Expected %p, got %p\n", uform, form);
5174
5175 IHTMLOptionElement_Release(option);
5176 IHTMLFormElement_Release(form);
5177 }
5178
5179 static void test_create_img_elem(IHTMLDocument2 *doc)
5180 {
5181 IHTMLImgElement *img;
5182
5183 img = create_img_elem(doc, 10, 15);
5184
5185 if(img){
5186 test_img_put_width(img, 5);
5187 test_img_put_height(img, 20);
5188
5189 IHTMLImgElement_Release(img);
5190 img = NULL;
5191 }
5192
5193 img = create_img_elem(doc, -1, -1);
5194
5195 if(img){
5196 test_img_put_width(img, 5);
5197 test_img_put_height(img, 20);
5198
5199 IHTMLImgElement_Release(img);
5200 }
5201 }
5202
5203 #define insert_adjacent_elem(a,b,c) _insert_adjacent_elem(__LINE__,a,b,c)
5204 static void _insert_adjacent_elem(unsigned line, IHTMLElement *parent, const char *where, IHTMLElement *elem)
5205 {
5206 IHTMLElement2 *elem2 = _get_elem2_iface(line, (IUnknown*)parent);
5207 IHTMLElement *ret_elem = NULL;
5208 BSTR str = a2bstr(where);
5209 HRESULT hres;
5210
5211 hres = IHTMLElement2_insertAdjacentElement(elem2, str, elem, &ret_elem);
5212 IHTMLElement2_Release(elem2);
5213 SysFreeString(str);
5214 ok_(__FILE__,line)(hres == S_OK, "insertAdjacentElement failed: %08x\n", hres);
5215 ok_(__FILE__,line)(ret_elem == elem, "ret_elem != elem\n");
5216 IHTMLElement_Release(ret_elem);
5217 }
5218
5219 static void test_insert_adjacent_elems(IHTMLDocument2 *doc, IHTMLElement *parent)
5220 {
5221 IHTMLElement *elem, *elem2;
5222
5223 static const elem_type_t br_br[] = {ET_BR, ET_BR};
5224 static const elem_type_t br_div_br[] = {ET_BR, ET_DIV, ET_BR};
5225
5226 elem = test_create_elem(doc, "BR");
5227 insert_adjacent_elem(parent, "BeforeEnd", elem);
5228 IHTMLElement_Release(elem);
5229
5230 test_elem_all((IUnknown*)parent, br_br, 1);
5231
5232 elem = test_create_elem(doc, "BR");
5233 insert_adjacent_elem(parent, "beforeend", elem);
5234
5235 test_elem_all((IUnknown*)parent, br_br, 2);
5236
5237 elem2 = test_create_elem(doc, "DIV");
5238 insert_adjacent_elem(elem, "beforebegin", elem2);
5239 IHTMLElement_Release(elem2);
5240 IHTMLElement_Release(elem);
5241
5242 test_elem_all((IUnknown*)parent, br_div_br, 3);
5243 }
5244
5245 static IHTMLTxtRange *test_create_body_range(IHTMLDocument2 *doc)
5246 {
5247 IHTMLBodyElement *body;
5248 IHTMLTxtRange *range;
5249 IHTMLElement *elem;
5250 HRESULT hres;
5251
5252 elem = doc_get_body(doc);
5253 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
5254 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
5255 IHTMLElement_Release(elem);
5256
5257 hres = IHTMLBodyElement_createTextRange(body, &range);
5258 IHTMLBodyElement_Release(body);
5259 ok(hres == S_OK, "createTextRange failed: %08x\n", hres);
5260
5261 return range;
5262 }
5263
5264 #define range_duplicate(a) _range_duplicate(__LINE__,a)
5265 static IHTMLTxtRange *_range_duplicate(unsigned line, IHTMLTxtRange *range)
5266 {
5267 IHTMLTxtRange *ret;
5268 HRESULT hres;
5269
5270 hres = IHTMLTxtRange_duplicate(range, &ret);
5271 ok_(__FILE__,line)(hres == S_OK, "duplicate failed: %08x\n", hres);
5272
5273 return ret;
5274 }
5275
5276 #define test_range_set_end_point(a,b,c,d) _test_range_set_end_point(__LINE__,a,b,c,d)
5277 static void _test_range_set_end_point(unsigned line, IHTMLTxtRange *range, const char *how,
5278 IHTMLTxtRange *ref_range, HRESULT exhres)
5279 {
5280 BSTR str = a2bstr(how);
5281 HRESULT hres;
5282
5283 hres = IHTMLTxtRange_setEndPoint(range, str, ref_range);
5284 ok_(__FILE__,line)(hres == exhres, "setEndPoint failed: %08x, expected %08x\n", hres, exhres);
5285 SysFreeString(str);
5286 }
5287
5288 static void test_txtrange(IHTMLDocument2 *doc)
5289 {
5290 IHTMLTxtRange *body_range, *range, *range2;
5291 IHTMLSelectionObject *selection;
5292 IDispatch *disp_range;
5293 IHTMLElement *body;
5294 HRESULT hres;
5295
5296 body_range = test_create_body_range(doc);
5297
5298 test_disp((IUnknown*)body_range, &IID_IHTMLTxtRange, "[object]");
5299
5300 test_range_text(body_range, "test abc 123\r\nit's text");
5301
5302 range = range_duplicate(body_range);
5303 range2 = range_duplicate(body_range);
5304
5305 test_range_isequal(range, range2, VARIANT_TRUE);
5306
5307 test_range_text(range, "test abc 123\r\nit's text");
5308 test_range_text(body_range, "test abc 123\r\nit's text");
5309
5310 test_range_collapse(range, TRUE);
5311 test_range_isequal(range, range2, VARIANT_FALSE);
5312 test_range_inrange(range, range2, VARIANT_FALSE);
5313 test_range_inrange(range2, range, VARIANT_TRUE);
5314 IHTMLTxtRange_Release(range2);
5315
5316 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
5317 test_range_expand(range, wordW, VARIANT_FALSE, "test ");
5318 test_range_move(range, characterW, 2, 2);
5319 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
5320
5321 test_range_collapse(range, FALSE);
5322 test_range_expand(range, wordW, VARIANT_TRUE, "abc ");
5323
5324 test_range_collapse(range, FALSE);
5325 test_range_expand(range, wordW, VARIANT_TRUE, "123");
5326 test_range_expand(range, wordW, VARIANT_FALSE, "123");
5327 test_range_move(range, characterW, 2, 2);
5328 test_range_expand(range, wordW, VARIANT_TRUE, "123");
5329 test_range_moveend(range, characterW, -5, -5);
5330 test_range_text(range, NULL);
5331 test_range_moveend(range, characterW, 3, 3);
5332 test_range_text(range, "c 1");
5333 test_range_expand(range, texteditW, VARIANT_TRUE, "test abc 123\r\nit's text");
5334 test_range_collapse(range, TRUE);
5335 test_range_move(range, characterW, 4, 4);
5336 test_range_moveend(range, characterW, 1, 1);
5337 test_range_text(range, " ");
5338 test_range_move(range, wordW, 1, 1);
5339 test_range_moveend(range, characterW, 2, 2);
5340 test_range_text(range, "ab");
5341
5342 IHTMLTxtRange_Release(range);
5343
5344 range = range_duplicate(body_range);
5345
5346 test_range_text(range, "test abc 123\r\nit's text");
5347 test_range_move(range, characterW, 3, 3);
5348 test_range_moveend(range, characterW, 1, 1);
5349 test_range_text(range, "t");
5350 test_range_moveend(range, characterW, 3, 3);
5351 test_range_text(range, "t ab");
5352 test_range_moveend(range, characterW, -2, -2);
5353 test_range_text(range, "t ");
5354 test_range_move(range, characterW, 6, 6);
5355 test_range_moveend(range, characterW, 3, 3);
5356 test_range_text(range, "123");
5357 test_range_moveend(range, characterW, 2, 2);
5358 test_range_text(range, "123\r\ni");
5359
5360 IHTMLTxtRange_Release(range);
5361
5362 range = range_duplicate(body_range);
5363
5364 test_range_move(range, wordW, 1, 1);
5365 test_range_moveend(range, characterW, 2, 2);
5366 test_range_text(range, "ab");
5367
5368 test_range_move(range, characterW, -2, -2);
5369 test_range_moveend(range, characterW, 2, 2);
5370 test_range_text(range, "t ");
5371
5372 test_range_move(range, wordW, 3, 3);
5373 test_range_move(range, wordW, -2, -2);
5374 test_range_moveend(range, characterW, 2, 2);
5375 test_range_text(range, "ab");
5376
5377 test_range_move(range, characterW, -6, -5);
5378 test_range_moveend(range, characterW, -1, 0);
5379 test_range_moveend(range, characterW, -6, 0);
5380 test_range_move(range, characterW, 2, 2);
5381 test_range_moveend(range, characterW, 2, 2);
5382 test_range_text(range, "st");
5383 test_range_moveend(range, characterW, -6, -4);
5384 test_range_moveend(range, characterW, 2, 2);
5385
5386 IHTMLTxtRange_Release(range);
5387
5388 range = range_duplicate(body_range);
5389
5390 test_range_move(range, wordW, 2, 2);
5391 test_range_moveend(range, characterW, 2, 2);
5392 test_range_text(range, "12");
5393
5394 test_range_move(range, characterW, 15, 14);
5395 test_range_move(range, characterW, -2, -2);
5396 test_range_moveend(range, characterW, 3, 2);
5397 test_range_text(range, "t");
5398 test_range_moveend(range, characterW, -1, -1);
5399 test_range_text(range, "t");
5400 test_range_expand(range, wordW, VARIANT_TRUE, "text");
5401 test_range_move(range, characterW, -2, -2);
5402 test_range_moveend(range, characterW, 2, 2);
5403 test_range_text(range, "s ");
5404 test_range_move(range, characterW, 100, 7);
5405 test_range_move(range, wordW, 1, 0);
5406 test_range_move(range, characterW, -2, -2);
5407 test_range_moveend(range, characterW, 3, 2);
5408 test_range_text(range, "t");
5409
5410 IHTMLTxtRange_Release(range);
5411
5412 range = range_duplicate(body_range);
5413
5414 test_range_collapse(range, TRUE);
5415 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
5416 test_range_put_text(range, "word");
5417 test_range_text(body_range, "wordabc 123\r\nit's text");
5418 test_range_text(range, NULL);
5419 test_range_moveend(range, characterW, 3, 3);
5420 test_range_text(range, "abc");
5421 test_range_movestart(range, characterW, -2, -2);
5422 test_range_text(range, "rdabc");
5423 test_range_movestart(range, characterW, 3, 3);
5424 test_range_text(range, "bc");
5425 test_range_movestart(range, characterW, 4, 4);
5426 test_range_text(range, NULL);
5427 test_range_movestart(range, characterW, -3, -3);
5428 test_range_text(range, "c 1");
5429 test_range_movestart(range, characterW, -7, -6);
5430 test_range_text(range, "wordabc 1");
5431 test_range_movestart(range, characterW, 100, 22);
5432 test_range_text(range, NULL);
5433
5434 IHTMLTxtRange_Release(range);
5435
5436 hres = IHTMLDocument2_get_selection(doc, &selection);
5437 ok(hres == S_OK, "IHTMLDocument2_get_selection failed: %08x\n", hres);
5438
5439 test_disp((IUnknown*)selection, &IID_IHTMLSelectionObject, "[object]");
5440 test_ifaces((IUnknown*)selection, selection_iids);
5441
5442 hres = IHTMLSelectionObject_createRange(selection, &disp_range);
5443 ok(hres == S_OK, "IHTMLSelectionObject_createRange failed: %08x\n", hres);
5444 IHTMLSelectionObject_Release(selection);
5445
5446 hres = IDispatch_QueryInterface(disp_range, &IID_IHTMLTxtRange, (void **)&range);
5447 ok(hres == S_OK, "Could not get IID_IHTMLTxtRange interface: 0x%08x\n", hres);
5448 IDispatch_Release(disp_range);
5449
5450 test_range_text(range, NULL);
5451 test_range_moveend(range, characterW, 3, 3);
5452 test_range_text(range, "wor");
5453 test_range_parent(range, ET_BODY);
5454 test_range_expand(range, texteditW, VARIANT_TRUE, "wordabc 123\r\nit's text");
5455 test_range_expand(range, texteditW, VARIANT_TRUE, "wordabc 123\r\nit's text");
5456 test_range_move(range, characterW, 3, 3);
5457 test_range_expand(range, wordW, VARIANT_TRUE, "wordabc ");
5458 test_range_moveend(range, characterW, -4, -4);
5459 test_range_put_text(range, "abc def ");
5460 test_range_expand(range, texteditW, VARIANT_TRUE, "abc def abc 123\r\nit's text");
5461 test_range_move(range, wordW, 1, 1);
5462 test_range_movestart(range, characterW, -1, -1);
5463 test_range_text(range, " ");
5464 test_range_move(range, wordW, 1, 1);
5465 test_range_moveend(range, characterW, 3, 3);
5466 test_range_text(range, "def");
5467 test_range_put_text(range, "xyz");
5468 test_range_moveend(range, characterW, 1, 1);
5469 test_range_move(range, wordW, 1, 1);
5470 test_range_moveend(range, characterW, 2, 2);
5471 test_range_text(range, "ab");
5472
5473 body = doc_get_body(doc);
5474
5475 hres = IHTMLTxtRange_moveToElementText(range, body);
5476 ok(hres == S_OK, "moveToElementText failed: %08x\n", hres);
5477
5478 test_range_text(range, "abc xyz abc 123\r\nit's text");
5479 test_range_parent(range, ET_BODY);
5480
5481 test_range_move(range, wordW, 1, 1);
5482 test_range_moveend(range, characterW, 12, 12);
5483 test_range_text(range, "xyz abc 123");
5484
5485 test_range_collapse(range, VARIANT_TRUE);
5486 test_range_paste_html(range, "<br>paste<br>");
5487 test_range_text(range, NULL);
5488
5489 test_range_moveend(range, characterW, 3, 3);
5490 test_range_text(range, "xyz");
5491
5492 hres = IHTMLTxtRange_moveToElementText(range, body);
5493 ok(hres == S_OK, "moveToElementText failed: %08x\n", hres);
5494
5495 test_range_text(range, "abc \r\npaste\r\nxyz abc 123\r\nit's text");
5496
5497 test_range_move(range, wordW, 2, 2);
5498 test_range_collapse(range, VARIANT_TRUE);
5499 test_range_moveend(range, characterW, 5, 5);
5500 test_range_text(range, "paste");
5501
5502 range2 = range_duplicate(range);
5503
5504 test_range_set_end_point(range, "starttostart", body_range, S_OK);
5505 test_range_text(range, "abc \r\npaste");
5506
5507 test_range_set_end_point(range, "endtoend", body_range, S_OK);
5508 test_range_text(range, "abc \r\npaste\r\nxyz abc 123\r\nit's text");
5509
5510 test_range_set_end_point(range, "starttoend", range2, S_OK);
5511 test_range_text(range, "\r\nxyz abc 123\r\nit's text");
5512
5513 test_range_set_end_point(range, "starttostart", body_range, S_OK);
5514 test_range_set_end_point(range, "endtostart", range2, S_OK);
5515 test_range_text(range, "abc ");
5516
5517 test_range_set_end_point(range, "starttoend", body_range, S_OK);
5518 test_range_text(range, "paste\r\nxyz abc 123\r\nit's text");
5519
5520 test_range_set_end_point(range, "EndToStart", body_range, S_OK);
5521 test_range_text(range, "abc ");
5522
5523 test_range_set_end_point(range, "xxx", body_range, E_INVALIDARG);
5524
5525 IHTMLTxtRange_Release(range);
5526 IHTMLTxtRange_Release(range2);
5527 IHTMLTxtRange_Release(body_range);
5528 IHTMLElement_Release(body);
5529
5530 }
5531
5532 static void test_txtrange2(IHTMLDocument2 *doc)
5533 {
5534 IHTMLTxtRange *range;
5535
5536 range = test_create_body_range(doc);
5537
5538 test_range_text(range, "abc\r\n\r\n123\r\n\r\n\r\ndef");
5539 test_range_move(range, characterW, 5, 5);
5540 test_range_moveend(range, characterW, 1, 1);
5541 test_range_text(range, "2");
5542 test_range_move(range, characterW, -3, -3);
5543 test_range_moveend(range, characterW, 3, 3);
5544 test_range_text(range, "c\r\n\r\n1");
5545 test_range_collapse(range, VARIANT_FALSE);
5546 test_range_moveend(range, characterW, 4, 4);
5547 test_range_text(range, "23");
5548 test_range_moveend(range, characterW, 1, 1);
5549 test_range_text(range, "23\r\n\r\n\r\nd");
5550 test_range_moveend(range, characterW, -1, -1);
5551 test_range_text(range, "23");
5552 test_range_moveend(range, characterW, -1, -1);
5553 test_range_text(range, "23");
5554 test_range_moveend(range, characterW, -2, -2);
5555 test_range_text(range, "2");
5556
5557 IHTMLTxtRange_Release(range);
5558 }
5559
5560 #define test_compatmode(a,b) _test_compatmode(__LINE__,a,b)
5561 static void _test_compatmode(unsigned line, IHTMLDocument2 *doc2, const char *excompat)
5562 {
5563 IHTMLDocument5 *doc = get_htmldoc5_iface((IUnknown*)doc2);
5564 BSTR str;
5565 HRESULT hres;
5566
5567 hres = IHTMLDocument5_get_compatMode(doc, &str);
5568 ok_(__FILE__,line)(hres == S_OK, "get_compatMode failed: %08x\n", hres);
5569 ok_(__FILE__,line)(!strcmp_wa(str, excompat), "compatMode = %s, expected %s\n", wine_dbgstr_w(str), excompat);
5570
5571 IHTMLDocument5_Release(doc);
5572 }
5573
5574 static void test_location(IHTMLDocument2 *doc)
5575 {
5576 IHTMLLocation *location, *location2;
5577 IHTMLWindow2 *window;
5578 BSTR str;
5579 ULONG ref;
5580 HRESULT hres;
5581
5582 hres = IHTMLDocument2_get_location(doc, &location);
5583 ok(hres == S_OK, "get_location failed: %08x\n", hres);
5584
5585 hres = IHTMLDocument2_get_location(doc, &location2);
5586 ok(hres == S_OK, "get_location failed: %08x\n", hres);
5587
5588 ok(location == location2, "location != location2\n");
5589 IHTMLLocation_Release(location2);
5590
5591 hres = IHTMLDocument2_get_parentWindow(doc, &window);
5592 ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
5593
5594 hres = IHTMLWindow2_get_location(window, &location2);
5595 ok(hres == S_OK, "get_location failed: %08x\n", hres);
5596 ok(location == location2, "location != location2\n");
5597 IHTMLLocation_Release(location2);
5598
5599 test_ifaces((IUnknown*)location, location_iids);
5600 test_disp2((IUnknown*)location, &DIID_DispHTMLLocation, &IID_IHTMLLocation, "about:blank");
5601
5602 hres = IHTMLLocation_get_pathname(location, &str);
5603 ok(hres == S_OK, "get_pathname failed: %08x\n", hres);
5604 ok(!strcmp_wa(str, "blank"), "unexpected pathname %s\n", wine_dbgstr_w(str));
5605 SysFreeString(str);
5606
5607 hres = IHTMLLocation_get_href(location, NULL);
5608 ok(hres == E_POINTER, "get_href passed: %08x\n", hres);
5609
5610 hres = IHTMLLocation_get_href(location, &str);
5611 ok(hres == S_OK, "get_href failed: %08x\n", hres);
5612 ok(!strcmp_wa(str, "about:blank"), "unexpected href %s\n", wine_dbgstr_w(str));
5613 SysFreeString(str);
5614
5615 ref = IHTMLLocation_Release(location);
5616 ok(!ref, "location chould be destroyed here\n");
5617 }
5618
5619 static void test_plugins_col(IHTMLDocument2 *doc)
5620 {
5621 IHTMLPluginsCollection *col, *col2;
5622 IHTMLWindow2 *window;
5623 IOmNavigator *nav;
5624 ULONG ref;
5625 LONG len;
5626 HRESULT hres;
5627
5628 window = get_doc_window(doc);
5629 hres = IHTMLWindow2_get_navigator(window, &nav);
5630 ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
5631 IHTMLWindow2_Release(window);
5632
5633 hres = IOmNavigator_get_plugins(nav, &col);
5634 ok(hres == S_OK, "get_plugins failed: %08x\n", hres);
5635
5636 hres = IOmNavigator_get_plugins(nav, &col2);
5637 ok(hres == S_OK, "get_plugins failed: %08x\n", hres);
5638 ok(iface_cmp((IUnknown*)col, (IUnknown*)col2), "col != col2\n");
5639 IHTMLPluginsCollection_Release(col2);
5640
5641 test_disp2((IUnknown*)col, &DIID_DispCPlugins, &IID_IHTMLPluginsCollection, "[object]");
5642
5643 len = 0xdeadbeef;
5644 hres = IHTMLPluginsCollection_get_length(col, &len);
5645 ok(hres == S_OK, "get_length failed: %08x\n", hres);
5646 ok(!len, "length = %d\n", len);
5647
5648 hres = IHTMLPluginsCollection_refresh(col, VARIANT_FALSE);
5649 ok(hres == S_OK, "refresh failed: %08x\n", hres);
5650
5651 hres = IHTMLPluginsCollection_refresh(col, VARIANT_TRUE);
5652 ok(hres == S_OK, "refresh failed: %08x\n", hres);
5653
5654 ref = IHTMLPluginsCollection_Release(col);
5655 ok(!ref, "ref=%d\n", ref);
5656
5657 IOmNavigator_Release(nav);
5658 }
5659
5660 static void test_mime_types_col(IOmNavigator *nav)
5661 {
5662 IHTMLMimeTypesCollection *col, *col2;
5663 LONG length;
5664 ULONG ref;
5665 HRESULT hres;
5666
5667 hres = IOmNavigator_get_mimeTypes(nav, &col);
5668 ok(hres == S_OK, "get_mimeTypes failed: %08x\n", hres);
5669
5670 hres = IOmNavigator_get_mimeTypes(nav, &col2);
5671 ok(hres == S_OK, "get_mimeTypes failed: %08x\n", hres);
5672 ok(iface_cmp((IUnknown*)col, (IUnknown*)col2), "col != col2\n");
5673 IHTMLMimeTypesCollection_Release(col2);
5674
5675 test_disp((IUnknown*)col, &IID_IHTMLMimeTypesCollection, "[object]");
5676
5677 length = 0xdeadbeef;
5678 hres = IHTMLMimeTypesCollection_get_length(col, &length);
5679 ok(hres == S_OK, "get_length failed: %08x\n", hres);
5680 ok(!length, "length = %d\n", length);
5681
5682 ref = IHTMLMimeTypesCollection_Release(col);
5683 ok(!ref, "ref=%d\n", ref);
5684 }
5685
5686 #define test_framebase_name(a,b) _test_framebase_name(__LINE__,a,b)
5687 static void _test_framebase_name(unsigned line, IHTMLElement *elem, const char *name)
5688 {
5689 BSTR str = (void*)0xdeadbeef;
5690 IHTMLFrameBase *fbase;
5691 HRESULT hres;
5692
5693 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFrameBase, (void**)&fbase);
5694 ok(hres == S_OK, "Could not get IHTMLFrameBase interface: 0x%08x\n", hres);
5695
5696 hres = IHTMLFrameBase_get_name(fbase, &str);
5697 ok_(__FILE__,line)(hres == S_OK, "IHTMLFrameBase_get_name failed: 0x%08x\n", hres);
5698 if(name)
5699 ok_(__FILE__,line)(!strcmp_wa(str, name), "name = %s, expected %s\n", wine_dbgstr_w(str), name);
5700 else
5701 ok_(__FILE__,line)(!str, "name = %s, expected NULL\n", wine_dbgstr_w(str));
5702 SysFreeString(str);
5703
5704 IHTMLFrameBase_Release(fbase);
5705 }
5706
5707 #define test_framebase_put_name(a,b) _test_framebase_put_name(__LINE__,a,b)
5708 static void _test_framebase_put_name(unsigned line, IHTMLElement *elem, const char *name)
5709 {
5710 IHTMLFrameBase *fbase;
5711 HRESULT hres;
5712 BSTR str;
5713
5714 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFrameBase, (void**)&fbase);
5715 ok(hres == S_OK, "Could not get IHTMLFrameBase interface: 0x%08x\n", hres);
5716
5717 str = name ? a2bstr(name) : NULL;
5718 hres = IHTMLFrameBase_put_name(fbase, str);
5719 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
5720 SysFreeString(str);
5721
5722 _test_framebase_name(line, elem, name);
5723 IHTMLFrameBase_Release(fbase);
5724 }
5725
5726 #define test_framebase_src(a,b) _test_framebase_src(__LINE__,a,b)
5727 static void _test_framebase_src(unsigned line, IHTMLElement *elem, const char *src)
5728 {
5729 BSTR str = (void*)0xdeadbeef;
5730 IHTMLFrameBase *fbase;
5731 HRESULT hres;
5732
5733 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFrameBase, (void**)&fbase);
5734 ok(hres == S_OK, "Could not get IHTMLFrameBase interface: 0x%08x\n", hres);
5735
5736 hres = IHTMLFrameBase_get_src(fbase, &str);
5737 ok_(__FILE__,line)(hres == S_OK, "IHTMLFrameBase_get_src failed: 0x%08x\n", hres);
5738 if(src)
5739 ok_(__FILE__,line)(!strcmp_wa(str, src), "src = %s, expected %s\n", wine_dbgstr_w(str), src);
5740 else
5741 ok_(__FILE__,line)(!str, "src = %s, expected NULL\n", wine_dbgstr_w(str));
5742 SysFreeString(str);
5743
5744 IHTMLFrameBase_Release(fbase);
5745 }
5746
5747 #define test_framebase_marginheight(a,b) _test_framebase_marginheight(__LINE__,a,b)
5748 static void _test_framebase_marginheight(unsigned line, IHTMLFrameBase *framebase, const char *exval)
5749 {
5750 VARIANT v;
5751 HRESULT hres;
5752
5753 hres = IHTMLFrameBase_get_marginHeight(framebase, &v);
5754 ok_(__FILE__,line)(hres == S_OK, "get_marginHeight failed: %08x\n", hres);
5755 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(marginHeight) = %d\n", V_VT(&v));
5756 if(exval)
5757 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exval), "marginHeight = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exval);
5758 else
5759 ok_(__FILE__,line)(!V_BSTR(&v), "marginHeight = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
5760 VariantClear(&v);
5761 }
5762
5763 #define set_framebase_marginheight(a,b) _set_framebase_marginheight(__LINE__,a,b)
5764 static void _set_framebase_marginheight(unsigned line, IHTMLFrameBase *framebase, const char *val)
5765 {
5766 VARIANT v;
5767 HRESULT hres;
5768
5769 V_VT(&v) = VT_BSTR;
5770 V_BSTR(&v) = a2bstr(val);
5771 hres = IHTMLFrameBase_put_marginHeight(framebase, v);
5772 ok_(__FILE__,line)(hres == S_OK, "put_marginHeight failed: %08x\n", hres);
5773 VariantClear(&v);
5774 }
5775
5776 #define test_framebase_marginwidth(a,b) _test_framebase_marginwidth(__LINE__,a,b)
5777 static void _test_framebase_marginwidth(unsigned line, IHTMLFrameBase *framebase, const char *exval)
5778 {
5779 VARIANT v;
5780 HRESULT hres;
5781
5782 hres = IHTMLFrameBase_get_marginWidth(framebase, &v);
5783 ok_(__FILE__,line)(hres == S_OK, "get_marginWidth failed: %08x\n", hres);
5784 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(marginWidth) = %d\n", V_VT(&v));
5785 if(exval)
5786 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exval), "marginWidth = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exval);
5787 else
5788 ok_(__FILE__,line)(!V_BSTR(&v), "marginWidth = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
5789 VariantClear(&v);
5790 }
5791
5792 #define set_framebase_marginwidth(a,b) _set_framebase_marginwidth(__LINE__,a,b)
5793 static void _set_framebase_marginwidth(unsigned line, IHTMLFrameBase *framebase, const char *val)
5794 {
5795 VARIANT v;
5796 HRESULT hres;
5797
5798 V_VT(&v) = VT_BSTR;
5799 V_BSTR(&v) = a2bstr(val);
5800 hres = IHTMLFrameBase_put_marginWidth(framebase, v);
5801 ok_(__FILE__,line)(hres == S_OK, "put_marginWidth failed: %08x\n", hres);
5802 VariantClear(&v);
5803 }
5804
5805 static void test_framebase(IUnknown *unk)
5806 {
5807 IHTMLFrameBase *fbase;
5808 BSTR str;
5809 HRESULT hres;
5810
5811 /* get/put scrolling */
5812 hres = IUnknown_QueryInterface(unk, &IID_IHTMLFrameBase, (void**)&fbase);
5813 ok(hres == S_OK, "Could not get IHTMLFrameBase interface: 0x%08x\n", hres);
5814
5815 hres = IHTMLFrameBase_get_scrolling(fbase, &str);
5816 ok(hres == S_OK, "IHTMLFrameBase_get_scrolling failed: 0x%08x\n", hres);
5817 ok(!strcmp_wa(str, "auto"), "get_scrolling should have given 'auto', gave: %s\n", wine_dbgstr_w(str));
5818 SysFreeString(str);
5819
5820 str = a2bstr("no");
5821 hres = IHTMLFrameBase_put_scrolling(fbase, str);
5822 ok(hres == S_OK, "IHTMLFrameBase_put_scrolling failed: 0x%08x\n", hres);
5823 SysFreeString(str);
5824
5825 hres = IHTMLFrameBase_get_scrolling(fbase, &str);
5826 ok(hres == S_OK, "IHTMLFrameBase_get_scrolling failed: 0x%08x\n", hres);
5827 ok(!strcmp_wa(str, "no"), "get_scrolling should have given 'no', gave: %s\n", wine_dbgstr_w(str));
5828 SysFreeString(str);
5829
5830 str = a2bstr("junk");
5831 hres = IHTMLFrameBase_put_scrolling(fbase, str);
5832 ok(hres == E_INVALIDARG, "IHTMLFrameBase_put_scrolling should have failed "
5833 "with E_INVALIDARG, instead: 0x%08x\n", hres);
5834 SysFreeString(str);
5835
5836 hres = IHTMLFrameBase_get_scrolling(fbase, &str);
5837 ok(hres == S_OK, "IHTMLFrameBase_get_scrolling failed: 0x%08x\n", hres);
5838 ok(!strcmp_wa(str, "no"), "get_scrolling should have given 'no', gave: %s\n", wine_dbgstr_w(str));
5839 SysFreeString(str);
5840
5841 hres = IHTMLFrameBase_get_frameBorder(fbase, &str);
5842 ok(hres == S_OK, "get_frameBorder failed: %08x\n", hres);
5843 ok(!str, "frameBorder = %s\n", wine_dbgstr_w(str));
5844
5845 str = a2bstr("1");
5846 hres = IHTMLFrameBase_put_frameBorder(fbase, str);
5847 ok(hres == S_OK, "put_frameBorder failed: %08x\n", hres);
5848 SysFreeString(str);
5849
5850 hres = IHTMLFrameBase_get_frameBorder(fbase, &str);
5851 ok(hres == S_OK, "get_frameBorder failed: %08x\n", hres);
5852 ok(!strcmp_wa(str, "1"), "frameBorder = %s, expected \"1\"\n", wine_dbgstr_w(str));
5853
5854 test_framebase_marginheight(fbase, NULL);
5855 set_framebase_marginheight(fbase, "1px");
5856 test_framebase_marginheight(fbase, "1");
5857
5858 test_framebase_marginwidth(fbase, NULL);
5859 set_framebase_marginwidth(fbase, "2px");
5860 test_framebase_marginwidth(fbase, "2");
5861
5862 IHTMLFrameBase_Release(fbase);
5863 }
5864
5865 #define test_language_string(a,b) _test_language_string(__LINE__,a,b)
5866 static void _test_language_string(unsigned line, const WCHAR *lang, LCID lcid)
5867 {
5868 WCHAR buf[64];
5869 int res;
5870
5871 if(pLCIDToLocaleName) {
5872 res = pLCIDToLocaleName(lcid, buf, sizeof(buf)/sizeof(WCHAR), 0);
5873 ok_(__FILE__,line)(res, "LCIDToLocaleName failed: %u\n", GetLastError());
5874 ok_(__FILE__,line)(!lstrcmpW(lang, buf), "lang = %s, expected %s\n", wine_dbgstr_w(lang), wine_dbgstr_w(buf));
5875 }else {
5876 win_skip("LCIDToLocaleName not available, unable to test language string\n");
5877 ok_(__FILE__,line)(lang != NULL, "lang == NULL\n");
5878 }
5879 }
5880
5881 #define test_table_length(t,l) _test_table_length(__LINE__,t,l)
5882 static void _test_table_length(unsigned line, IHTMLTable *table, LONG expect)
5883 {
5884 IHTMLElementCollection *col;
5885 HRESULT hres;
5886 LONG len;
5887
5888 hres = IHTMLTable_get_rows(table, &col);
5889 ok_(__FILE__,line)(hres == S_OK, "get_rows failed: %08x\n", hres);
5890 ok_(__FILE__,line)(col != NULL, "col = NULL\n");
5891 if (hres != S_OK || col == NULL)
5892 return;
5893 hres = IHTMLElementCollection_get_length(col, &len);
5894 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
5895 ok_(__FILE__,line)(len == expect, "Expect %d, got %d\n", expect, len);
5896
5897 IHTMLElementCollection_Release(col);
5898 }
5899
5900 static void test_navigator(IHTMLDocument2 *doc)
5901 {
5902 IHTMLWindow2 *window;
5903 IOmNavigator *navigator, *navigator2;
5904 VARIANT_BOOL b;
5905 char buf[512];
5906 DWORD size;
5907 ULONG ref;
5908 BSTR bstr;
5909 HRESULT hres;
5910
5911 static const WCHAR v40[] = {'4','.','0'};
5912
5913 hres = IHTMLDocument2_get_parentWindow(doc, &window);
5914 ok(hres == S_OK, "parentWidnow failed: %08x\n", hres);
5915
5916 hres = IHTMLWindow2_get_navigator(window, &navigator);
5917 ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
5918 ok(navigator != NULL, "navigator == NULL\n");
5919 test_disp2((IUnknown*)navigator, &DIID_DispHTMLNavigator, &IID_IOmNavigator, "[object]");
5920
5921 hres = IHTMLWindow2_get_navigator(window, &navigator2);
5922 ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
5923 ok(navigator != navigator2, "navigator2 != navihgator\n");
5924
5925 IHTMLWindow2_Release(window);
5926 IOmNavigator_Release(navigator2);
5927
5928 hres = IOmNavigator_get_appCodeName(navigator, &bstr);
5929 ok(hres == S_OK, "get_appCodeName failed: %08x\n", hres);
5930 ok(!strcmp_wa(bstr, "Mozilla"), "Unexpected appCodeName %s\n", wine_dbgstr_w(bstr));
5931 SysFreeString(bstr);
5932
5933 bstr = NULL;
5934 hres = IOmNavigator_get_appName(navigator, &bstr);
5935 ok(hres == S_OK, "get_appName failed: %08x\n", hres);
5936 ok(!strcmp_wa(bstr, "Microsoft Internet Explorer"), "Unexpected appCodeName %s\n", wine_dbgstr_w(bstr));
5937 SysFreeString(bstr);
5938
5939 bstr = NULL;
5940 hres = IOmNavigator_get_platform(navigator, &bstr);
5941 ok(hres == S_OK, "get_platform failed: %08x\n", hres);
5942 ok(!strcmp_wa(bstr, sizeof(void*) == 8 ? "Win64" : "Win32")
5943 || (sizeof(void*) == 8 && broken(!strcmp_wa(bstr, "Win32") /* IE6 */)), "unexpected platform %s\n", wine_dbgstr_w(bstr));
5944 SysFreeString(bstr);
5945
5946 bstr = NULL;
5947 hres = IOmNavigator_get_cpuClass(navigator, &bstr);
5948 ok(hres == S_OK, "get_cpuClass failed: %08x\n", hres);
5949 ok(!strcmp_wa(bstr, sizeof(void*) == 8 ? "x64" : "x86"), "unexpected cpuClass %s\n", wine_dbgstr_w(bstr));
5950 SysFreeString(bstr);
5951
5952 bstr = NULL;
5953 hres = IOmNavigator_get_appVersion(navigator, &bstr);
5954 ok(hres == S_OK, "get_appVersion failed: %08x\n", hres);
5955 ok(!memcmp(bstr, v40, sizeof(v40)), "appVersion is %s\n", wine_dbgstr_w(bstr));
5956 SysFreeString(bstr);
5957
5958 bstr = NULL;
5959 hres = IOmNavigator_get_systemLanguage(navigator, &bstr);
5960 ok(hres == S_OK, "get_systemLanguage failed: %08x\n", hres);
5961 test_language_string(bstr, LOCALE_SYSTEM_DEFAULT);
5962 SysFreeString(bstr);
5963
5964 if (pGetUserDefaultUILanguage)
5965 {
5966 bstr = NULL;
5967 hres = IOmNavigator_get_browserLanguage(navigator, &bstr);
5968 ok(hres == S_OK, "get_browserLanguage failed: %08x\n", hres);
5969 test_language_string(bstr, pGetUserDefaultUILanguage());
5970 SysFreeString(bstr);
5971 }
5972 else
5973 win_skip("GetUserDefaultUILanguage not available\n");
5974
5975 bstr = NULL;
5976 hres = IOmNavigator_get_userLanguage(navigator, &bstr);
5977 ok(hres == S_OK, "get_userLanguage failed: %08x\n", hres);
5978 test_language_string(bstr, LOCALE_USER_DEFAULT);
5979 SysFreeString(bstr);
5980
5981 hres = IOmNavigator_toString(navigator, NULL);
5982 ok(hres == E_INVALIDARG, "toString failed: %08x\n", hres);
5983
5984 bstr = NULL;
5985 hres = IOmNavigator_toString(navigator, &bstr);
5986 ok(hres == S_OK, "toString failed: %08x\n", hres);
5987 ok(!strcmp_wa(bstr, "[object]"), "toString returned %s\n", wine_dbgstr_w(bstr));
5988 SysFreeString(bstr);
5989
5990 b = 100;
5991 hres = IOmNavigator_get_onLine(navigator, &b);
5992 ok(hres == S_OK, "get_onLine failed: %08x\n", hres);
5993 ok(b == VARIANT_TRUE, "onLine = %x\n", b);
5994
5995 size = sizeof(buf);
5996 hres = ObtainUserAgentString(0, buf, &size);
5997 ok(hres == S_OK, "ObtainUserAgentString failed: %08x\n", hres);
5998
5999 bstr = NULL;
6000 hres = IOmNavigator_get_userAgent(navigator, &bstr);
6001 ok(hres == S_OK, "get_userAgent failed: %08x\n", hres);
6002 ok(!strcmp_wa(bstr, buf), "userAgent returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf);
6003 SysFreeString(bstr);
6004
6005 if(!strncmp(buf, "Mozilla/", 8)) {
6006 bstr = NULL;
6007 hres = IOmNavigator_get_appVersion(navigator, &bstr);
6008 ok(hres == S_OK, "get_appVersion failed: %08x\n", hres);
6009 ok(!strcmp_wa(bstr, buf+8), "appVersion returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf+8);
6010 SysFreeString(bstr);
6011 }else {
6012 skip("nonstandard user agent\n");
6013 }
6014
6015 bstr = NULL;
6016 hres = IOmNavigator_get_appMinorVersion(navigator, &bstr);
6017 ok(hres == S_OK, "get_appMonorVersion failed: %08x\n", hres);
6018 ok(bstr != NULL, "appMinorVersion returned NULL\n");
6019 SysFreeString(bstr);
6020
6021 test_mime_types_col(navigator);
6022
6023 ref = IOmNavigator_Release(navigator);
6024 ok(!ref, "navigator should be destroyed here\n");
6025 }
6026
6027 static void test_screen(IHTMLWindow2 *window)
6028 {
6029 IHTMLScreen *screen, *screen2;
6030 IDispatchEx *dispex;
6031 RECT work_area;
6032 LONG l, exl;
6033 HDC hdc;
6034 HRESULT hres;
6035
6036 screen = NULL;
6037 hres = IHTMLWindow2_get_screen(window, &screen);
6038 ok(hres == S_OK, "get_screen failed: %08x\n", hres);
6039 ok(screen != NULL, "screen == NULL\n");
6040
6041 screen2 = NULL;
6042 hres = IHTMLWindow2_get_screen(window, &screen2);
6043 ok(hres == S_OK, "get_screen failed: %08x\n", hres);
6044 ok(screen2 != NULL, "screen == NULL\n");
6045 ok(iface_cmp((IUnknown*)screen2, (IUnknown*)screen), "screen2 != screen\n");
6046 IHTMLScreen_Release(screen2);
6047
6048 hres = IHTMLScreen_QueryInterface(screen, &IID_IDispatchEx, (void**)&dispex);
6049 ok(hres == S_OK || broken(hres == E_NOINTERFACE), "Could not get IDispatchEx interface: %08x\n", hres);
6050 if(SUCCEEDED(hres)) {
6051 test_disp((IUnknown*)screen, &DIID_DispHTMLScreen, "[object]");
6052 IDispatchEx_Release(dispex);
6053 }
6054
6055 hdc = CreateICA("DISPLAY", NULL, NULL, NULL);
6056
6057 exl = GetDeviceCaps(hdc, HORZRES);
6058 l = 0xdeadbeef;
6059 hres = IHTMLScreen_get_width(screen, &l);
6060 ok(hres == S_OK, "get_width failed: %08x\n", hres);
6061 ok(l == exl, "width = %d, expected %d\n", l, exl);
6062
6063 exl = GetDeviceCaps(hdc, VERTRES);
6064 l = 0xdeadbeef;
6065 hres = IHTMLScreen_get_height(screen, &l);
6066 ok(hres == S_OK, "get_height failed: %08x\n", hres);
6067 ok(l == exl, "height = %d, expected %d\n", l, exl);
6068
6069 exl = GetDeviceCaps(hdc, BITSPIXEL);
6070 l = 0xdeadbeef;
6071 hres = IHTMLScreen_get_colorDepth(screen, &l);
6072 ok(hres == S_OK, "get_height failed: %08x\n", hres);
6073 ok(l == exl, "height = %d, expected %d\n", l, exl);
6074
6075 DeleteObject(hdc);
6076
6077 SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0);
6078
6079 l = 0xdeadbeef;
6080 hres = IHTMLScreen_get_availHeight(screen, &l);
6081 ok(hres == S_OK, "get_availHeight failed: %08x\n", hres);
6082 ok(l == work_area.bottom-work_area.top, "availHeight = %d, expected %d\n", l, work_area.bottom-work_area.top);
6083
6084 l = 0xdeadbeef;
6085 hres = IHTMLScreen_get_availWidth(screen, &l);
6086 ok(hres == S_OK, "get_availWidth failed: %08x\n", hres);
6087 ok(l == work_area.right-work_area.left, "availWidth = %d, expected %d\n", l, work_area.right-work_area.left);
6088
6089 IHTMLScreen_Release(screen);
6090 }
6091
6092 static void test_default_selection(IHTMLDocument2 *doc)
6093 {
6094 IHTMLSelectionObject *selection;
6095 IHTMLTxtRange *range;
6096 IDispatch *disp;
6097 BSTR str;
6098 HRESULT hres;
6099
6100 hres = IHTMLDocument2_get_selection(doc, &selection);
6101 ok(hres == S_OK, "get_selection failed: %08x\n", hres);
6102
6103 hres = IHTMLSelectionObject_get_type(selection, &str);
6104 ok(hres == S_OK, "get_type failed: %08x\n", hres);
6105 ok(!strcmp_wa(str, "None"), "type = %s\n", wine_dbgstr_w(str));
6106 SysFreeString(str);
6107
6108 hres = IHTMLSelectionObject_createRange(selection, &disp);
6109 IHTMLSelectionObject_Release(selection);
6110 ok(hres == S_OK, "createRange failed: %08x\n", hres);
6111
6112 hres = IDispatch_QueryInterface(disp, &IID_IHTMLTxtRange, (void**)&range);
6113 IDispatch_Release(disp);
6114 ok(hres == S_OK, "Could not get IHTMLTxtRange interface: %08x\n", hres);
6115
6116 test_range_text(range, NULL);
6117 IHTMLTxtRange_Release(range);
6118 }
6119
6120 static void test_doc_elem(IHTMLDocument2 *doc)
6121 {
6122 IHTMLDocument2 *doc_node, *owner_doc;
6123 IHTMLElement *elem;
6124 IHTMLDocument3 *doc3;
6125 HRESULT hres;
6126 BSTR bstr;
6127
6128 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
6129 ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres);
6130
6131 hres = IHTMLDocument2_toString(doc, &bstr);
6132 ok(hres == S_OK, "toString failed: %08x\n", hres);
6133 ok(!strcmp_wa(bstr, "[object]"),
6134 "toString returned %s, expected [object]\n", wine_dbgstr_w(bstr));
6135 SysFreeString(bstr);
6136
6137 hres = IHTMLDocument3_get_documentElement(doc3, &elem);
6138 IHTMLDocument3_Release(doc3);
6139 ok(hres == S_OK, "get_documentElement failed: %08x\n", hres);
6140
6141 test_node_name((IUnknown*)elem, "HTML");
6142 test_elem_tag((IUnknown*)elem, "HTML");
6143
6144 doc_node = get_doc_node(doc);
6145 owner_doc = get_owner_doc((IUnknown*)elem);
6146 ok(iface_cmp((IUnknown *)doc_node, (IUnknown *)owner_doc), "doc_node != owner_doc\n");
6147 IHTMLDocument2_Release(owner_doc);
6148
6149 owner_doc = get_owner_doc((IUnknown*)doc_node);
6150 ok(!owner_doc, "owner_doc = %p\n", owner_doc);
6151 IHTMLDocument2_Release(doc_node);
6152
6153 test_elem_client_rect((IUnknown*)elem);
6154
6155 IHTMLElement_Release(elem);
6156 }
6157
6158 static void test_default_body(IHTMLBodyElement *body)
6159 {
6160 LONG l;
6161 BSTR bstr;
6162 HRESULT hres;
6163 VARIANT v;
6164
6165 bstr = (void*)0xdeadbeef;
6166 hres = IHTMLBodyElement_get_background(body, &bstr);
6167 ok(hres == S_OK, "get_background failed: %08x\n", hres);
6168 ok(bstr == NULL, "bstr != NULL\n");
6169
6170 l = elem_get_scroll_height((IUnknown*)body);
6171 ok(l != -1, "scrollHeight == -1\n");
6172 l = elem_get_scroll_width((IUnknown*)body);
6173 ok(l != -1, "scrollWidth == -1\n");
6174 l = elem_get_scroll_top((IUnknown*)body);
6175 ok(!l, "scrollTop = %d\n", l);
6176 elem_get_scroll_left((IUnknown*)body);
6177
6178 test_elem_dir((IUnknown*)body, NULL);
6179 set_elem_dir((IUnknown*)body, "ltr");
6180
6181 /* get_text tests */
6182 hres = IHTMLBodyElement_get_text(body, &v);
6183 ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres);
6184 ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR got %d\n", V_VT(&v));
6185 ok(V_BSTR(&v) == NULL, "bstr != NULL\n");
6186
6187 /* get_text - Invalid Text */
6188 V_VT(&v) = VT_BSTR;
6189 V_BSTR(&v) = a2bstr("Invalid");
6190 hres = IHTMLBodyElement_put_text(body, v);
6191 ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres);
6192 VariantClear(&v);
6193
6194 V_VT(&v) = VT_NULL;
6195 hres = IHTMLBodyElement_get_text(body, &v);
6196 ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres);
6197 ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR got %d\n", V_VT(&v));
6198 ok(!strcmp_wa(V_BSTR(&v), "#00a0d0"), "v = %s, expected '#00a0d0'\n", wine_dbgstr_w(V_BSTR(&v)));
6199 VariantClear(&v);
6200
6201 /* get_text - Valid Text */
6202 V_VT(&v) = VT_BSTR;
6203 V_BSTR(&v) = a2bstr("#FF0000");
6204 hres = IHTMLBodyElement_put_text(body, v);
6205 ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres);
6206 VariantClear(&v);
6207
6208 V_VT(&v) = VT_NULL;
6209 hres = IHTMLBodyElement_get_text(body, &v);
6210 ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres);
6211 ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR got %d\n", V_VT(&v));
6212 ok(!strcmp_wa(V_BSTR(&v), "#ff0000"), "v = %s, expected '#ff0000'\n", wine_dbgstr_w(V_BSTR(&v)));
6213 VariantClear(&v);
6214 }
6215
6216 #define test_body_scroll(a,b) _test_body_scroll(__LINE__,a,b)
6217 static void _test_body_scroll(unsigned line, IHTMLBodyElement *body, const char *ex)
6218 {
6219 BSTR str;
6220 HRESULT hres;
6221
6222 hres = IHTMLBodyElement_get_scroll(body, &str);
6223 ok_(__FILE__,line)(hres == S_OK, "get_scroll failed: %08x\n", hres);
6224 ok_(__FILE__,line)(ex ? !strcmp_wa(str, ex) : !str, "scroll = %s\n", wine_dbgstr_w(str));
6225 SysFreeString(str);
6226 }
6227
6228 #define set_body_scroll(a,b) _set_body_scroll(__LINE__,a,b)
6229 static void _set_body_scroll(unsigned line, IHTMLBodyElement *body, const char *val)
6230 {
6231 BSTR str = a2bstr(val);
6232 HRESULT hres;
6233
6234 hres = IHTMLBodyElement_put_scroll(body, str);
6235 ok_(__FILE__,line)(hres == S_OK, "put_scroll failed: %08x\n", hres);
6236 SysFreeString(str);
6237
6238 _test_body_scroll(line, body, val);
6239 }
6240
6241 static void test_body_funs(IHTMLBodyElement *body)
6242 {
6243 VARIANT vbg, vDefaultbg;
6244 HRESULT hres;
6245
6246 hres = IHTMLBodyElement_get_bgColor(body, &vDefaultbg);
6247 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6248 ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n");
6249 ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg)));
6250
6251 V_VT(&vbg) = VT_BSTR;
6252 V_BSTR(&vbg) = a2bstr("red");
6253 hres = IHTMLBodyElement_put_bgColor(body, vbg);
6254 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6255 VariantClear(&vbg);
6256
6257 hres = IHTMLBodyElement_get_bgColor(body, &vbg);
6258 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6259 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
6260 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
6261 VariantClear(&vbg);
6262
6263 /* Restore Originial */
6264 hres = IHTMLBodyElement_put_bgColor(body, vDefaultbg);
6265 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6266 VariantClear(&vDefaultbg);
6267
6268 test_body_scroll(body, NULL);
6269 set_body_scroll(body, "yes");
6270 set_body_scroll(body, "no");
6271 set_body_scroll(body, "auto");
6272 }
6273
6274 static void test_history(IHTMLWindow2 *window)
6275 {
6276 IOmHistory *history, *history2;
6277 HRESULT hres;
6278
6279 history = NULL;
6280 hres = IHTMLWindow2_get_history(window, &history);
6281 ok(hres == S_OK, "get_history failed: %08x\n", hres);
6282 ok(history != NULL, "history = NULL\n");
6283
6284 test_disp2((IUnknown*)history, &DIID_DispHTMLHistory, &IID_IOmHistory, "[object]");
6285
6286 history2 = NULL;
6287 hres = IHTMLWindow2_get_history(window, &history2);
6288 ok(hres == S_OK, "get_history failed: %08x\n", hres);
6289 ok(history2 != NULL, "history2 = NULL\n");
6290 ok(iface_cmp((IUnknown*)history, (IUnknown*)history2), "history != history2\n");
6291
6292 IOmHistory_Release(history2);
6293 IOmHistory_Release(history);
6294 }
6295
6296 static void test_xmlhttprequest(IHTMLWindow5 *window)
6297 {
6298 HRESULT hres;
6299 VARIANT var;
6300 IHTMLXMLHttpRequestFactory *factory;
6301 IHTMLXMLHttpRequest *xml;
6302
6303 hres = IHTMLWindow5_get_XMLHttpRequest(window, &var);
6304 ok(hres == S_OK, "get_XMLHttpRequest failed: %08x\n", hres);
6305 ok(V_VT(&var) == VT_DISPATCH, "expect VT_DISPATCH, got %s\n", debugstr_variant(&var));
6306
6307 factory = NULL;
6308 hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLXMLHttpRequestFactory, (void**)&factory);
6309 ok(hres == S_OK, "QueryInterface(&IID_IHTMLXMLHttpRequestFactory) failed: %08x\n", hres);
6310 ok(factory != NULL, "factory == NULL\n");
6311
6312 xml = NULL;
6313 hres = IHTMLXMLHttpRequestFactory_create(factory, &xml);
6314 ok(hres == S_OK, "create failed: %08x\n", hres);
6315 ok(xml != NULL, "xml == NULL\n");
6316 test_disp((IUnknown*)xml, &DIID_DispHTMLXMLHttpRequest, "[object]");
6317
6318 IHTMLXMLHttpRequest_Release(xml);
6319 IHTMLXMLHttpRequestFactory_Release(factory);
6320 VariantClear(&var);
6321 }
6322
6323 static void test_window(IHTMLDocument2 *doc)
6324 {
6325 IHTMLWindow2 *window, *window2, *self, *parent;
6326 IHTMLWindow5 *window5;
6327 IHTMLDocument2 *doc2 = NULL;
6328 IDispatch *disp;
6329 IUnknown *unk;
6330 VARIANT v;
6331 BSTR str;
6332 HRESULT hres;
6333
6334 hres = IHTMLDocument2_get_parentWindow(doc, &window);
6335 ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
6336 test_ifaces((IUnknown*)window, window_iids);
6337 hres = IHTMLWindow2_QueryInterface(window, &IID_ITravelLogClient, (void**)&unk);
6338 if(hres == S_OK)
6339 IUnknown_Release(unk);
6340 else
6341 win_skip("IID_ITravelLogClient not supported\n");
6342
6343 test_disp((IUnknown*)window, &DIID_DispHTMLWindow2, "[object]");
6344
6345 hres = IHTMLWindow2_get_document(window, &doc2);
6346 ok(hres == S_OK, "get_document failed: %08x\n", hres);
6347 ok(doc2 != NULL, "doc2 == NULL\n");
6348
6349 test_ifaces((IUnknown*)doc2, doc_node_iids);
6350 test_disp((IUnknown*)doc2, &DIID_DispHTMLDocument, "[object]");
6351 test_class_info((IUnknown*)doc2);
6352
6353 test_ifaces((IUnknown*)doc, doc_obj_iids);
6354 test_disp((IUnknown*)doc, &DIID_DispHTMLDocument, "[object]");
6355 test_class_info((IUnknown*)doc);
6356
6357 unk = (void*)0xdeadbeef;
6358 hres = IHTMLDocument2_QueryInterface(doc2, &IID_ICustomDoc, (void**)&unk);
6359 ok(hres == E_NOINTERFACE, "QueryInterface(IID_ICustomDoc) returned: %08x\n", hres);
6360 ok(!unk, "unk = %p\n", unk);
6361
6362 IHTMLDocument2_Release(doc2);
6363
6364 hres = IHTMLWindow2_get_window(window, &window2);
6365 ok(hres == S_OK, "get_window failed: %08x\n", hres);
6366 ok(window2 != NULL, "window2 == NULL\n");
6367
6368 hres = IHTMLWindow2_get_self(window, &self);
6369 ok(hres == S_OK, "get_self failed: %08x\n", hres);
6370 ok(window2 != NULL, "self == NULL\n");
6371
6372 ok(self == window2, "self != window2\n");
6373
6374 IHTMLWindow2_Release(window2);
6375
6376 disp = NULL;
6377 hres = IHTMLDocument2_get_Script(doc, &disp);
6378 ok(hres == S_OK, "get_Script failed: %08x\n", hres);
6379 ok(disp == (void*)window, "disp != window\n");
6380 IDispatch_Release(disp);
6381
6382 hres = IHTMLWindow2_toString(window, NULL);
6383 ok(hres == E_INVALIDARG, "toString failed: %08x\n", hres);
6384
6385 str = NULL;
6386 hres = IHTMLWindow2_toString(window, &str);
6387 ok(hres == S_OK, "toString failed: %08x\n", hres);
6388 ok(!strcmp_wa(str, "[object]") ||
6389 !strcmp_wa(str, "[object Window]") /* win7 ie9 */, "toString returned %s\n", wine_dbgstr_w(str));
6390 SysFreeString(str);
6391
6392 V_VT(&v) = VT_ERROR;
6393 hres = IHTMLWindow2_get_opener(window, &v);
6394 ok(hres == S_OK, "get_opener failed: %08x\n", hres);
6395 ok(V_VT(&v) == VT_EMPTY, "V_VT(opener) = %d\n", V_VT(&v));
6396
6397 parent = NULL;
6398 hres = IHTMLWindow2_get_parent(window, &parent);
6399 ok(hres == S_OK, "get_parent failed: %08x\n", hres);
6400 ok(parent != NULL, "parent == NULL\n");
6401 ok(parent == self, "parent != window\n");
6402 IHTMLWindow2_Release(parent);
6403 IHTMLWindow2_Release(self);
6404
6405 test_window_name(window, NULL);
6406 set_window_name(window, "test");
6407 test_window_length(window, 0);
6408 test_screen(window);
6409 test_window_status(window);
6410 set_window_status(window, "Test!");
6411 test_history(window);
6412
6413 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
6414 if(SUCCEEDED(hres)) {
6415 ok(window5 != NULL, "window5 == NULL\n");
6416 test_xmlhttprequest(window5);
6417 IHTMLWindow5_Release(window5);
6418 }else {
6419 win_skip("IHTMLWindow5 not supported!\n");
6420 }
6421
6422 IHTMLWindow2_Release(window);
6423 }
6424
6425 static void test_dom_implementation(IHTMLDocument2 *doc)
6426 {
6427 IHTMLDocument5 *doc5 = get_htmldoc5_iface((IUnknown*)doc);
6428 IHTMLDOMImplementation *dom_implementation;
6429 VARIANT_BOOL b;
6430 VARIANT v;
6431 BSTR str;
6432 HRESULT hres;
6433
6434 hres = IHTMLDocument5_get_implementation(doc5, &dom_implementation);
6435 IHTMLDocument5_Release(doc5);
6436 ok(hres == S_OK, "get_implementation failed: %08x\n", hres);
6437 ok(dom_implementation != NULL, "dom_implementation == NULL\n");
6438
6439 str = a2bstr("test");
6440 V_VT(&v) = VT_BSTR;
6441 V_BSTR(&v) = a2bstr("1.0");
6442 b = 100;
6443 hres = IHTMLDOMImplementation_hasFeature(dom_implementation, str, v, &b);
6444 SysFreeString(str);
6445 VariantClear(&v);
6446 ok(hres == S_OK, "hasFeature failed: %08x\n", hres);
6447 ok(!b, "hasFeature returned %x\n", b);
6448
6449 IHTMLDOMImplementation_Release(dom_implementation);
6450 }
6451
6452 static void test_defaults(IHTMLDocument2 *doc)
6453 {
6454 IHTMLStyleSheetsCollection *stylesheetcol;
6455 IHTMLCurrentStyle *cstyle;
6456 IHTMLBodyElement *body;
6457 IHTMLElement2 *elem2;
6458 IHTMLElement *elem;
6459 IHTMLStyle *style;
6460 VARIANT v;
6461 BSTR str;
6462 LONG l;
6463 VARIANT_BOOL b;
6464 HRESULT hres;
6465 IHTMLElementCollection *collection;
6466
6467 elem = doc_get_body(doc);
6468
6469 hres = IHTMLDocument2_get_images(doc, NULL);
6470 ok(hres == E_INVALIDARG, "hres %08x\n", hres);
6471
6472 hres = IHTMLDocument2_get_images(doc, &collection);
6473 ok(hres == S_OK, "get_images failed: %08x\n", hres);
6474 if(hres == S_OK)
6475 {
6476 test_elem_collection((IUnknown*)collection, NULL, 0);
6477 IHTMLElementCollection_Release(collection);
6478 }
6479
6480 hres = IHTMLDocument2_get_applets(doc, NULL);
6481 ok(hres == E_INVALIDARG, "hres %08x\n", hres);
6482
6483 hres = IHTMLDocument2_get_applets(doc, &collection);
6484 ok(hres == S_OK, "get_applets failed: %08x\n", hres);
6485 if(hres == S_OK)
6486 {
6487 test_elem_collection((IUnknown*)collection, NULL, 0);
6488 IHTMLElementCollection_Release(collection);
6489 }
6490
6491 hres = IHTMLDocument2_get_links(doc, NULL);
6492 ok(hres == E_INVALIDARG, "hres %08x\n", hres);
6493
6494 hres = IHTMLDocument2_get_links(doc, &collection);
6495 ok(hres == S_OK, "get_links failed: %08x\n", hres);
6496 if(hres == S_OK)
6497 {
6498 test_elem_collection((IUnknown*)collection, NULL, 0);
6499 IHTMLElementCollection_Release(collection);
6500 }
6501
6502 hres = IHTMLDocument2_get_forms(doc, NULL);
6503 ok(hres == E_INVALIDARG, "hres %08x\n", hres);
6504
6505 hres = IHTMLDocument2_get_forms(doc, &collection);
6506 ok(hres == S_OK, "get_forms failed: %08x\n", hres);
6507 if(hres == S_OK)
6508 {
6509 test_elem_collection((IUnknown*)collection, NULL, 0);
6510 IHTMLElementCollection_Release(collection);
6511 }
6512
6513 hres = IHTMLDocument2_get_anchors(doc, NULL);
6514 ok(hres == E_INVALIDARG, "hres %08x\n", hres);
6515
6516 hres = IHTMLDocument2_get_anchors(doc, &collection);
6517 ok(hres == S_OK, "get_anchors failed: %08x\n", hres);
6518 if(hres == S_OK)
6519 {
6520 test_elem_collection((IUnknown*)collection, NULL, 0);
6521 IHTMLElementCollection_Release(collection);
6522 }
6523
6524 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
6525 ok(hres == S_OK, "Could not get IHTMBodyElement: %08x\n", hres);
6526 test_default_body(body);
6527 test_body_funs(body);
6528 IHTMLBodyElement_Release(body);
6529
6530 test_elem_istextedit(elem, VARIANT_TRUE);
6531
6532 hres = IHTMLElement_get_style(elem, &style);
6533 ok(hres == S_OK, "get_style failed: %08x\n", hres);
6534
6535 test_disp((IUnknown*)style, &DIID_DispHTMLStyle, "[object]");
6536 test_ifaces((IUnknown*)style, style_iids);
6537 IHTMLStyle_Release(style);
6538
6539 str = NULL;
6540 hres = IHTMLDocument2_get_charset(doc, &str);
6541 ok(hres == S_OK, "get_charset failed: %08x\n", hres);
6542 ok(str && *str, "charset is empty\n"); /* FIXME: better tests */
6543 SysFreeString(str);
6544
6545 test_window(doc);
6546 test_compatmode(doc, "BackCompat");
6547 test_location(doc);
6548 test_navigator(doc);
6549 test_plugins_col(doc);
6550
6551 elem2 = get_elem2_iface((IUnknown*)elem);
6552 hres = IHTMLElement2_get_currentStyle(elem2, &cstyle);
6553 ok(hres == S_OK, "get_currentStyle failed: %08x\n", hres);
6554 if(SUCCEEDED(hres)) {
6555 IUnknown *unk;
6556
6557 test_disp((IUnknown*)cstyle, &DIID_DispHTMLCurrentStyle, "[object]");
6558 test_ifaces((IUnknown*)cstyle, cstyle_iids);
6559
6560 hres = IHTMLCurrentStyle_QueryInterface(cstyle, &IID_IHTMLCurrentStyle4, (void**)&unk);
6561 if(SUCCEEDED(hres))
6562 IUnknown_Release(unk);
6563 else
6564 {
6565 /*IE6 doesn't have interface */
6566 win_skip("IID_IHTMLCurrentStyle4 not supported\n");
6567 }
6568
6569 IHTMLCurrentStyle_Release(cstyle);
6570 }
6571 IHTMLElement2_Release(elem2);
6572
6573 IHTMLElement_Release(elem);
6574
6575 hres = IHTMLDocument2_get_styleSheets(doc, &stylesheetcol);
6576 ok(hres == S_OK, "get_styleSheets failed: %08x\n", hres);
6577
6578 l = 0xdeadbeef;
6579 hres = IHTMLStyleSheetsCollection_get_length(stylesheetcol, &l);
6580 ok(hres == S_OK, "get_length failed: %08x\n", hres);
6581 ok(l == 0, "length = %d\n", l);
6582
6583 IHTMLStyleSheetsCollection_Release(stylesheetcol);
6584
6585 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFiltersCollection, (void**)&body);
6586 ok(hres == E_NOINTERFACE, "got interface IHTMLFiltersCollection\n");
6587
6588 str = a2bstr("xxx");
6589 b = 100;
6590 V_VT(&v) = VT_EMPTY;
6591 hres = IHTMLDocument2_execCommand(doc, str, FALSE, v, &b);
6592 ok(hres == OLECMDERR_E_NOTSUPPORTED || hres == E_INVALIDARG,
6593 "execCommand failed: %08x, expected OLECMDERR_E_NOTSUPPORTED or E_INVALIDARG\n", hres);
6594 SysFreeString(str);
6595
6596 str = a2bstr("respectvisibilityindesign");
6597 b = 100;
6598 V_VT(&v) = VT_BOOL;
6599 V_BOOL(&v) = VARIANT_TRUE;
6600 hres = IHTMLDocument2_execCommand(doc, str, FALSE, v, &b);
6601 ok(hres == S_OK, "execCommand failed: %08x, expected DRAGDROP_E_NOTREGISTERED\n", hres);
6602 SysFreeString(str);
6603
6604 test_default_selection(doc);
6605 test_doc_title(doc, "");
6606 test_dom_implementation(doc);
6607 }
6608
6609 #define test_button_name(a,b) _test_button_name(__LINE__,a,b)
6610 static void _test_button_name(unsigned line, IHTMLElement *elem, const char *exname)
6611 {
6612 IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem);
6613 BSTR str;
6614 HRESULT hres;
6615
6616 str = (void*)0xdeadbeef;
6617 hres = IHTMLButtonElement_get_name(button, &str);
6618 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
6619 if(exname)
6620 ok_(__FILE__,line)(!strcmp_wa(str, exname), "name = %s, expected %s\n", wine_dbgstr_w(str), exname);
6621 else
6622 ok_(__FILE__,line)(!str, "name = %s, expected NULL\n", wine_dbgstr_w(str));
6623 SysFreeString(str);
6624 IHTMLButtonElement_Release(button);
6625 }
6626
6627 #define set_button_name(a,b) _set_button_name(__LINE__,a,b)
6628 static void _set_button_name(unsigned line, IHTMLElement *elem, const char *name)
6629 {
6630 IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem);
6631 BSTR str = a2bstr(name);
6632 HRESULT hres;
6633
6634 hres = IHTMLButtonElement_put_name(button, str);
6635 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
6636 SysFreeString(str);
6637 IHTMLButtonElement_Release(button);
6638
6639 _test_button_name(line, elem, name);
6640 }
6641
6642 #define test_button_get_disabled(i,b) _test_button_get_disabled(__LINE__,i,b)
6643 static void _test_button_get_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL exb)
6644 {
6645 IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem);
6646 VARIANT_BOOL disabled = 100;
6647 HRESULT hres;
6648
6649 hres = IHTMLButtonElement_get_disabled(button, &disabled);
6650 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
6651 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
6652 IHTMLButtonElement_Release(button);
6653
6654 _test_elem3_get_disabled(line, (IUnknown*)elem, exb);
6655 }
6656
6657 #define test_button_set_disabled(i,b) _test_button_set_disabled(__LINE__,i,b)
6658 static void _test_button_set_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL b)
6659 {
6660 IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem);
6661 HRESULT hres;
6662
6663 hres = IHTMLButtonElement_put_disabled(button, b);
6664 ok_(__FILE__,line) (hres == S_OK, "put_disabled failed: %08x\n", hres);
6665 IHTMLButtonElement_Release(button);
6666
6667 _test_button_get_disabled(line, elem, b);
6668 }
6669
6670 static void test_button_elem(IHTMLElement *elem)
6671 {
6672 test_button_name(elem, NULL);
6673 set_button_name(elem, "button name");
6674
6675 test_elem_istextedit(elem, VARIANT_TRUE);
6676 }
6677
6678 #define test_tr_possess(e,r,l,i) _test_tr_possess(__LINE__,e,r,l,i)
6679 static void _test_tr_possess(unsigned line, IHTMLElement *elem,
6680 IHTMLTableRow *row, LONG len, const char *id)
6681 {
6682 IHTMLElementCollection *col;
6683 IDispatch *disp;
6684 HRESULT hres;
6685 LONG lval;
6686 VARIANT var;
6687
6688 hres = IHTMLTableRow_get_cells(row, &col);
6689 ok_(__FILE__, line)(hres == S_OK, "get_cells failed: %08x\n", hres);
6690 ok_(__FILE__, line)(col != NULL, "get_cells returned NULL\n");
6691
6692 hres = IHTMLElementCollection_get_length(col, &lval);
6693 ok_(__FILE__, line)(hres == S_OK, "get length failed: %08x\n", hres);
6694 ok_(__FILE__, line)(lval == len, "expected len = %d, got %d\n", len, lval);
6695
6696 V_VT(&var) = VT_BSTR;
6697 V_BSTR(&var) = a2bstr(id);
6698 hres = IHTMLElementCollection_tags(col, var, &disp);
6699 ok_(__FILE__, line)(hres == S_OK, "search by tags(%s) failed: %08x\n", id, hres);
6700 ok_(__FILE__, line)(disp != NULL, "disp == NULL\n");
6701
6702 VariantClear(&var);
6703 IDispatch_Release(disp);
6704 IHTMLElementCollection_Release(col);
6705 }
6706
6707 static void test_tr_modify(IHTMLElement *elem, IHTMLTableRow *row)
6708 {
6709 HRESULT hres;
6710 IDispatch *disp;
6711 IHTMLTableCell *cell;
6712
6713 hres = IHTMLTableRow_deleteCell(row, 0);
6714 ok(hres == S_OK, "deleteCell failed: %08x\n", hres);
6715 test_tr_possess(elem, row, 1, "td2");
6716
6717 hres = IHTMLTableRow_insertCell(row, 0, &disp);
6718 ok(hres == S_OK, "insertCell failed: %08x\n", hres);
6719 ok(disp != NULL, "disp == NULL\n");
6720 hres = IDispatch_QueryInterface(disp, &IID_IHTMLTableCell, (void **)&cell);
6721 ok(hres == S_OK, "Could not get IID_IHTMLTableCell interface: %08x\n", hres);
6722 ok(cell != NULL, "cell == NULL\n");
6723 if (SUCCEEDED(hres))
6724 IHTMLTableCell_Release(cell);
6725 test_tr_possess(elem, row, 2, "td2");
6726 IDispatch_Release(disp);
6727 }
6728
6729 static void test_tr_elem(IHTMLElement *elem)
6730 {
6731 IHTMLElementCollection *col;
6732 IHTMLTableRow *row;
6733 HRESULT hres;
6734 BSTR bstr;
6735 LONG lval;
6736 VARIANT vbg, vDefaultbg;
6737
6738 static const elem_type_t cell_types[] = {ET_TD,ET_TD};
6739
6740 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLTableRow, (void**)&row);
6741 ok(hres == S_OK, "Could not get IHTMLTableRow iface: %08x\n", hres);
6742 if(FAILED(hres))
6743 return;
6744
6745 col = NULL;
6746 hres = IHTMLTableRow_get_cells(row, &col);
6747 ok(hres == S_OK, "get_cells failed: %08x\n", hres);
6748 ok(col != NULL, "get_cells returned NULL\n");
6749
6750 test_elem_collection((IUnknown*)col, cell_types, sizeof(cell_types)/sizeof(*cell_types));
6751 IHTMLElementCollection_Release(col);
6752
6753 bstr = a2bstr("left");
6754 hres = IHTMLTableRow_put_align(row, bstr);
6755 ok(hres == S_OK, "set_align failed: %08x\n", hres);
6756 SysFreeString(bstr);
6757
6758 bstr = NULL;
6759 hres = IHTMLTableRow_get_align(row, &bstr);
6760 ok(hres == S_OK, "get_align failed: %08x\n", hres);
6761 ok(bstr != NULL, "get_align returned NULL\n");
6762 ok(!strcmp_wa(bstr, "left"), "get_align returned %s\n", wine_dbgstr_w(bstr));
6763 SysFreeString(bstr);
6764
6765 bstr = a2bstr("top");
6766 hres = IHTMLTableRow_put_vAlign(row, bstr);
6767 ok(hres == S_OK, "set_valign failed: %08x\n", hres);
6768 SysFreeString(bstr);
6769
6770 bstr = NULL;
6771 hres = IHTMLTableRow_get_vAlign(row, &bstr);
6772 ok(hres == S_OK, "get_valign failed: %08x\n", hres);
6773 ok(bstr != NULL, "get_valign returned NULL\n");
6774 ok(!strcmp_wa(bstr, "top"), "get_valign returned %s\n", wine_dbgstr_w(bstr));
6775 SysFreeString(bstr);
6776
6777 lval = 0xdeadbeef;
6778 hres = IHTMLTableRow_get_rowIndex(row, &lval);
6779 ok(hres == S_OK, "get_rowIndex failed: %08x\n", hres);
6780 ok(lval == 1, "get_rowIndex returned %d\n", lval);
6781
6782 lval = 0xdeadbeef;
6783 hres = IHTMLTableRow_get_sectionRowIndex(row, &lval);
6784 ok(hres == S_OK, "get_sectionRowIndex failed: %08x\n", hres);
6785 ok(lval == 1, "get_sectionRowIndex returned %d\n", lval);
6786
6787 hres = IHTMLTableRow_get_bgColor(row, &vDefaultbg);
6788 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6789 ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n");
6790 ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg)));
6791
6792 V_VT(&vbg) = VT_BSTR;
6793 V_BSTR(&vbg) = a2bstr("red");
6794 hres = IHTMLTableRow_put_bgColor(row, vbg);
6795 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6796 VariantClear(&vbg);
6797
6798 hres = IHTMLTableRow_get_bgColor(row, &vbg);
6799 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6800 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
6801 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
6802 VariantClear(&vbg);
6803
6804 V_VT(&vbg) = VT_I4;
6805 V_I4(&vbg) = 0xff0000;
6806 hres = IHTMLTableRow_put_bgColor(row, vbg);
6807 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6808 VariantClear(&vbg);
6809
6810 hres = IHTMLTableRow_get_bgColor(row, &vbg);
6811 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6812 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
6813 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
6814 VariantClear(&vbg);
6815
6816 /* Restore Originial */
6817 hres = IHTMLTableRow_put_bgColor(row, vDefaultbg);
6818 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6819 VariantClear(&vDefaultbg);
6820
6821 test_tr_modify(elem, row);
6822
6823 IHTMLTableRow_Release(row);
6824 }
6825
6826 static void test_td_elem(IHTMLElement *elem)
6827 {
6828 IHTMLTableCell *cell;
6829 HRESULT hres;
6830 LONG lval;
6831 BSTR str;
6832 VARIANT vbg, vDefaultbg;
6833
6834 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLTableCell, (void**)&cell);
6835 ok(hres == S_OK, "Could not get IHTMLTableRow iface: %08x\n", hres);
6836 if(FAILED(hres))
6837 return;
6838
6839 lval = 0xdeadbeef;
6840 hres = IHTMLTableCell_get_cellIndex(cell, &lval);
6841 ok(hres == S_OK, "get cellIndex failed: %08x\n", hres);
6842 ok(lval == 1, "Expected 1, got %d\n", lval);
6843
6844 str = a2bstr("left");
6845 hres = IHTMLTableCell_put_align(cell, str);
6846 ok(hres == S_OK, "put_align failed: %08x\n", hres);
6847 SysFreeString(str);
6848
6849 str = NULL;
6850 hres = IHTMLTableCell_get_align(cell, &str);
6851 ok(hres == S_OK, "get_align failed: %08x\n", hres);
6852 ok(str != NULL, "str is NULL\n");
6853 if (str != NULL && hres == S_OK) {
6854 ok(!strcmp_wa(str, "left"), "got %s\n", wine_dbgstr_w(str));
6855 SysFreeString(str);
6856 }
6857
6858 hres = IHTMLTableCell_get_bgColor(cell, &vDefaultbg);
6859 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6860 ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n");
6861 ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg)));
6862
6863 V_VT(&vbg) = VT_BSTR;
6864 V_BSTR(&vbg) = a2bstr("red");
6865 hres = IHTMLTableCell_put_bgColor(cell, vbg);
6866 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6867 VariantClear(&vbg);
6868
6869 hres = IHTMLTableCell_get_bgColor(cell, &vbg);
6870 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6871 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
6872 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
6873 VariantClear(&vbg);
6874
6875 V_VT(&vbg) = VT_I4;
6876 V_I4(&vbg) = 0xff0000;
6877 hres = IHTMLTableCell_put_bgColor(cell, vbg);
6878 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6879 VariantClear(&vbg);
6880
6881 hres = IHTMLTableCell_get_bgColor(cell, &vbg);
6882 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
6883 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
6884 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
6885 VariantClear(&vbg);
6886
6887 /* Restore Originial */
6888 hres = IHTMLTableCell_put_bgColor(cell, vDefaultbg);
6889 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
6890 VariantClear(&vDefaultbg);
6891
6892 IHTMLTableCell_Release(cell);
6893 }
6894
6895 static void test_label_elem(IHTMLElement *elem)
6896 {
6897 IHTMLLabelElement *label;
6898 BSTR str;
6899 HRESULT hres;
6900
6901 label = get_label_iface((IUnknown*)elem);
6902
6903 str = NULL;
6904 hres = IHTMLLabelElement_get_htmlFor(label, &str);
6905 ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres);
6906 ok(!strcmp_wa(str, "in"), "htmlFor = %s\n", wine_dbgstr_w(str));
6907 SysFreeString(str);
6908
6909 str = a2bstr("");
6910 hres = IHTMLLabelElement_put_htmlFor(label, str);
6911 ok(hres == S_OK, "put_htmlFor failed: %08x\n", hres);
6912 SysFreeString(str);
6913
6914 str = (void*)0xdeadbeef;
6915 hres = IHTMLLabelElement_get_htmlFor(label, &str);
6916 ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres);
6917 ok(!strcmp_wa(str, ""), "htmlFor = %s\n", wine_dbgstr_w(str));
6918
6919 str = a2bstr("abc");
6920 hres = IHTMLLabelElement_put_htmlFor(label, str);
6921 ok(hres == S_OK, "put_htmlFor failed: %08x\n", hres);
6922 SysFreeString(str);
6923
6924 str = NULL;
6925 hres = IHTMLLabelElement_get_htmlFor(label, &str);
6926 ok(hres == S_OK, "get_htmlFor failed: %08x\n", hres);
6927 ok(!strcmp_wa(str, "abc"), "htmlFor = %s\n", wine_dbgstr_w(str));
6928 SysFreeString(str);
6929
6930 IHTMLLabelElement_Release(label);
6931 }
6932
6933 #define test_table_cell_spacing(a,b) _test_table_cell_spacing(__LINE__,a,b)
6934 static void _test_table_cell_spacing(unsigned line, IHTMLTable *table, const char *exstr)
6935 {
6936 VARIANT v;
6937 HRESULT hres;
6938
6939 V_VT(&v) = VT_ERROR;
6940 hres = IHTMLTable_get_cellSpacing(table, &v);
6941 ok_(__FILE__,line)(hres == S_OK, "get_cellSpacing failed: %08x\n", hres);
6942 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
6943 if(exstr)
6944 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exstr), "cellSpacing = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exstr);
6945 else
6946 ok_(__FILE__,line)(!V_BSTR(&v), "cellSpacing = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
6947 VariantClear(&v);
6948 }
6949
6950 #define test_table_cell_padding(a,b) _test_table_cell_padding(__LINE__,a,b)
6951 static void _test_table_cell_padding(unsigned line, IHTMLTable *table, const char *exstr)
6952 {
6953 VARIANT v;
6954 HRESULT hres;
6955
6956 V_VT(&v) = VT_ERROR;
6957 hres = IHTMLTable_get_cellPadding(table, &v);
6958 ok_(__FILE__,line)(hres == S_OK, "get_cellPadding failed: %08x\n", hres);
6959 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
6960 if(exstr)
6961 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exstr), "cellPadding = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exstr);
6962 else
6963 ok_(__FILE__,line)(!V_BSTR(&v), "cellPadding = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
6964 VariantClear(&v);
6965 }
6966
6967 static void test_table_modify(IHTMLTable *table)
6968 {
6969 IDispatch *disp;
6970 IHTMLTableRow *row;
6971 HRESULT hres;
6972 LONG index;
6973
6974 test_table_length(table, 2);
6975
6976 hres = IHTMLTable_insertRow(table, 0, &disp);
6977 ok(hres == S_OK, "insertRow failed: %08x\n", hres);
6978 ok(disp != NULL, "disp == NULL\n");
6979 test_table_length(table, 3);
6980 if (hres != S_OK || disp == NULL)
6981 return;
6982
6983 hres = IDispatch_QueryInterface(disp, &IID_IHTMLTableRow, (void**)&row);
6984 IDispatch_Release(disp);
6985
6986 ok(hres == S_OK, "QueryInterface failed: %08x\n", hres);
6987 ok(row != NULL, "row == NULL\n");
6988
6989 index = 0xdeadbeef;
6990 hres = IHTMLTableRow_get_rowIndex(row, &index);
6991 ok(hres == S_OK, "get_rowIndex failed: %08x\n", hres);
6992 ok(index == 0, "index = %d, expected 0\n", index);
6993
6994 IHTMLTableRow_Release(row);
6995
6996 hres = IHTMLTable_deleteRow(table, 0);
6997 ok(hres == S_OK, "deleteRow failed: %08x\n", hres);
6998 test_table_length(table, 2);
6999 }
7000
7001 static void test_table_elem(IHTMLElement *elem)
7002 {
7003 IHTMLElementCollection *col;
7004 IHTMLTable *table;
7005 IHTMLTable3 *table3;
7006 IHTMLDOMNode *node;
7007 VARIANT v;
7008 HRESULT hres;
7009 BSTR bstr;
7010 VARIANT vbg, vDefaultbg;
7011
7012 static const elem_type_t row_types[] = {ET_TR,ET_TR};
7013 static const elem_type_t all_types[] = {ET_TBODY,ET_TR,ET_TR,ET_TD,ET_TD};
7014 static const elem_type_t tbodies_types[] = {ET_TBODY};
7015
7016 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLTable, (void**)&table);
7017 ok(hres == S_OK, "Could not get IHTMLTable iface: %08x\n", hres);
7018 if(FAILED(hres))
7019 return;
7020
7021 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLTable3, (void**)&table3);
7022 ok(hres == S_OK, "Could not get IHTMLTable3 iface: %08x\n", hres);
7023 if(FAILED(hres))
7024 return;
7025
7026 col = NULL;
7027 hres = IHTMLTable_get_rows(table, &col);
7028 ok(hres == S_OK, "get_rows failed: %08x\n", hres);
7029 ok(col != NULL, "get_rows returned NULL\n");
7030
7031 test_elem_collection((IUnknown*)col, row_types, sizeof(row_types)/sizeof(*row_types));
7032 IHTMLElementCollection_Release(col);
7033
7034 test_elem_all((IUnknown*)table, all_types, sizeof(all_types)/sizeof(*all_types));
7035
7036 node = clone_node((IUnknown*)table, VARIANT_TRUE);
7037 test_elem_tag((IUnknown*)node, "TABLE");
7038 test_elem_all((IUnknown*)node, all_types, sizeof(all_types)/sizeof(*all_types));
7039 IHTMLDOMNode_Release(node);
7040
7041 node = clone_node((IUnknown*)table, VARIANT_FALSE);
7042 test_elem_tag((IUnknown*)node, "TABLE");
7043 test_elem_all((IUnknown*)node, NULL, 0);
7044 IHTMLDOMNode_Release(node);
7045
7046 col = NULL;
7047 hres = IHTMLTable_get_tBodies(table, &col);
7048 ok(hres == S_OK, "get_tBodies failed: %08x\n", hres);
7049 ok(col != NULL, "get_tBodies returned NULL\n");
7050
7051 test_elem_collection((IUnknown*)col, tbodies_types, sizeof(tbodies_types)/sizeof(*tbodies_types));
7052 IHTMLElementCollection_Release(col);
7053
7054 test_table_cell_spacing(table, NULL);
7055
7056 V_VT(&v) = VT_I4;
7057 V_I4(&v) = 10;
7058 hres = IHTMLTable_put_cellSpacing(table, v);
7059 ok(hres == S_OK, "put_cellSpacing = %08x\n", hres);
7060 test_table_cell_spacing(table, "10");
7061
7062 V_VT(&v) = VT_BSTR;
7063 V_BSTR(&v) = a2bstr("11");
7064 hres = IHTMLTable_put_cellSpacing(table, v);
7065 ok(hres == S_OK, "put_cellSpacing = %08x\n", hres);
7066 test_table_cell_spacing(table, "11");
7067 VariantClear(&v);
7068
7069 test_table_cell_padding(table, NULL);
7070
7071 V_VT(&v) = VT_I4;
7072 V_I4(&v) = 10;
7073 hres = IHTMLTable_put_cellPadding(table, v);
7074 ok(hres == S_OK, "put_cellPadding = %08x\n", hres);
7075 test_table_cell_padding(table, "10");
7076
7077 V_VT(&v) = VT_BSTR;
7078 V_BSTR(&v) = a2bstr("11");
7079 hres = IHTMLTable_put_cellPadding(table, v);
7080 ok(hres == S_OK, "put_cellPadding = %08x\n", hres);
7081 test_table_cell_padding(table, "11");
7082 VariantClear(&v);
7083
7084 V_VT(&v) = VT_R8;
7085 V_R8(&v) = 5;
7086 hres = IHTMLTable_put_cellPadding(table, v);
7087 ok(hres == S_OK, "put_cellPadding = %08x\n", hres);
7088 test_table_cell_padding(table, "5");
7089
7090 bstr = a2bstr("left");
7091 hres = IHTMLTable_put_align(table, bstr);
7092 ok(hres == S_OK, "set_align failed: %08x\n", hres);
7093 SysFreeString(bstr);
7094
7095 bstr = NULL;
7096 hres = IHTMLTable_get_align(table, &bstr);
7097 ok(hres == S_OK, "get_align failed: %08x\n", hres);
7098 ok(bstr != NULL, "get_align returned NULL\n");
7099 ok(!strcmp_wa(bstr, "left"), "get_align returned %s\n", wine_dbgstr_w(bstr));
7100 SysFreeString(bstr);
7101
7102 hres = IHTMLTable_get_bgColor(table, &vDefaultbg);
7103 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
7104 ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n");
7105 ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg)));
7106
7107 V_VT(&vbg) = VT_BSTR;
7108 V_BSTR(&vbg) = a2bstr("red");
7109 hres = IHTMLTable_put_bgColor(table, vbg);
7110 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
7111 VariantClear(&vbg);
7112
7113 hres = IHTMLTable_get_bgColor(table, &vbg);
7114 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
7115 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
7116 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
7117 VariantClear(&vbg);
7118
7119 V_VT(&vbg) = VT_I4;
7120 V_I4(&vbg) = 0xff0000;
7121 hres = IHTMLTable_put_bgColor(table, vbg);
7122 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
7123 VariantClear(&vbg);
7124
7125 hres = IHTMLTable_get_bgColor(table, &vbg);
7126 ok(hres == S_OK, "get_bgColor failed: %08x\n", hres);
7127 ok(V_VT(&vbg) == VT_BSTR, "V_VT(&vbg) != VT_BSTR\n");
7128 ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg)));
7129 VariantClear(&vbg);
7130
7131 /* Restore Originial */
7132 hres = IHTMLTable_put_bgColor(table, vDefaultbg);
7133 ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
7134 VariantClear(&vDefaultbg);
7135
7136 V_VT(&v) = VT_BSTR;
7137 V_BSTR(&v) = a2bstr("11");
7138 hres = IHTMLTable_put_width(table, v);
7139 ok(hres == S_OK, "put_width = %08x\n", hres);
7140 VariantClear(&v);
7141 hres = IHTMLTable_get_width(table, &v);
7142 ok(hres == S_OK, "get_width = %08x\n", hres);
7143 ok(!strcmp_wa(V_BSTR(&v), "11"), "Expected 11, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
7144 VariantClear(&v);
7145
7146 V_VT(&v) = VT_BSTR;
7147 V_BSTR(&v) = a2bstr("11.9");
7148 hres = IHTMLTable_put_width(table, v);
7149 ok(hres == S_OK, "put_width = %08x\n", hres);
7150 VariantClear(&v);
7151 hres = IHTMLTable_get_width(table, &v);
7152 ok(hres == S_OK, "get_width = %08x\n", hres);
7153 ok(!strcmp_wa(V_BSTR(&v), "11"), "Expected 11, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
7154 VariantClear(&v);
7155
7156 V_VT(&v) = VT_BSTR;
7157 V_BSTR(&v) = a2bstr("40.2%");
7158 hres = IHTMLTable_put_width(table, v);
7159 ok(hres == S_OK, "put_width = %08x\n", hres);
7160 VariantClear(&v);
7161 hres = IHTMLTable_get_width(table, &v);
7162 ok(hres == S_OK, "get_width = %08x\n", hres);
7163 ok(!strcmp_wa(V_BSTR(&v), "40.2%"), "Expected 40.2%%, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
7164 VariantClear(&v);
7165
7166 V_VT(&v) = VT_I4;
7167 V_I4(&v) = 11;
7168 hres = IHTMLTable_put_width(table, v);
7169 ok(hres == S_OK, "put_width = %08x\n", hres);
7170 hres = IHTMLTable_get_width(table, &v);
7171 ok(hres == S_OK, "get_width = %08x\n", hres);
7172 ok(!strcmp_wa(V_BSTR(&v), "11"), "Expected 11, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
7173 VariantClear(&v);
7174
7175 V_VT(&v) = VT_R8;
7176 V_R8(&v) = 11.9;
7177 hres = IHTMLTable_put_width(table, v);
7178 ok(hres == S_OK, "put_width = %08x\n", hres);
7179 hres = IHTMLTable_get_width(table, &v);
7180 ok(hres == S_OK, "get_width = %08x\n", hres);
7181 ok(!strcmp_wa(V_BSTR(&v), "11"), "Expected 11, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
7182 VariantClear(&v);
7183
7184 bstr = a2bstr("box");
7185 hres = IHTMLTable_put_frame(table, bstr);
7186 ok(hres == S_OK, "put_frame = %08x\n", hres);
7187 SysFreeString(bstr);
7188 hres = IHTMLTable_get_frame(table, &bstr);
7189 ok(hres == S_OK, "get_frame = %08x\n", hres);
7190 ok(!strcmp_wa(bstr, "box"), "Expected box, got %s\n", wine_dbgstr_w(bstr));
7191 SysFreeString(bstr);
7192
7193 test_table_modify(table);
7194 bstr = a2bstr("summary");
7195 hres = IHTMLTable3_put_summary(table3, bstr);
7196 ok(hres == S_OK, "put_summary = %08x\n", hres);
7197 SysFreeString(bstr);
7198
7199 hres = IHTMLTable3_get_summary(table3, &bstr);
7200 ok(hres == S_OK, "get_summary = %08x\n", hres);
7201 ok(!strcmp_wa(bstr, "summary"), "Expected summary, got %s\n", wine_dbgstr_w(bstr));
7202 SysFreeString(bstr);
7203
7204 IHTMLTable3_Release(table3);
7205 IHTMLTable_Release(table);
7206 }
7207
7208 static void doc_write(IHTMLDocument2 *doc, BOOL ln, const char *text)
7209 {
7210 SAFEARRAYBOUND dim;
7211 SAFEARRAY *sa;
7212 VARIANT *var;
7213 HRESULT hres;
7214
7215 dim.lLbound = 0;
7216 dim.cElements = 1;
7217 sa = SafeArrayCreate(VT_VARIANT, 1, &dim);
7218 SafeArrayAccessData(sa, (void**)&var);
7219 V_VT(var) = VT_BSTR;
7220 V_BSTR(var) = a2bstr(text);
7221 SafeArrayUnaccessData(sa);
7222
7223 if(ln)
7224 hres = IHTMLDocument2_writeln(doc, sa);
7225 else
7226 hres = IHTMLDocument2_write(doc, sa);
7227 ok(hres == S_OK, "write failed: %08x\n", hres);
7228
7229 SafeArrayDestroy(sa);
7230 }
7231
7232 static void doc_complex_write(IHTMLDocument2 *doc)
7233 {
7234 SAFEARRAYBOUND dim = {5, 0};
7235 SAFEARRAY *sa;
7236 VARIANT *args;
7237 HRESULT hres;
7238
7239 sa = SafeArrayCreate(VT_VARIANT, 1, &dim);
7240 SafeArrayAccessData(sa, (void**)&args);
7241
7242 V_VT(args) = VT_BSTR;
7243 V_BSTR(args) = a2bstr("<body i4val=\"");
7244 V_VT(args+1) = VT_I4;
7245 V_I4(args+1) = 4;
7246 V_VT(args+2) = VT_BSTR;
7247 V_BSTR(args+2) = a2bstr("\" r8val=\"");
7248 V_VT(args+3) = VT_R8;
7249 V_R8(args+3) = 3.14;
7250 V_VT(args+4) = VT_BSTR;
7251 V_BSTR(args+4) = a2bstr("\">");
7252 SafeArrayUnaccessData(sa);
7253
7254 hres = IHTMLDocument2_write(doc, sa);
7255 ok(hres == S_OK, "write failed: %08x\n", hres);
7256
7257 SafeArrayDestroy(sa);
7258 }
7259
7260 static void test_frame_doc(IUnknown *frame_elem, BOOL iframe)
7261 {
7262 IHTMLDocument2 *window_doc, *elem_doc;
7263 IHTMLFrameElement3 *frame_elem3;
7264 IHTMLWindow2 *content_window;
7265 HRESULT hres;
7266
7267 content_window = get_frame_content_window(frame_elem);
7268 test_ifaces((IUnknown*)content_window, window_iids);
7269 window_doc = get_window_doc(content_window);
7270 IHTMLWindow2_Release(content_window);
7271
7272 elem_doc = get_elem_doc(frame_elem);
7273 ok(iface_cmp((IUnknown*)window_doc, (IUnknown*)elem_doc), "content_doc != elem_doc\n");
7274
7275 if(!iframe) {
7276 hres = IUnknown_QueryInterface(frame_elem, &IID_IHTMLFrameElement3, (void**)&frame_elem3);
7277 if(SUCCEEDED(hres)) {
7278 IDispatch *disp = NULL;
7279
7280 hres = IHTMLFrameElement3_get_contentDocument(frame_elem3, &disp);
7281 ok(hres == S_OK, "get_contentDocument failed: %08x\n", hres);
7282 ok(disp != NULL, "contentDocument == NULL\n");
7283 ok(iface_cmp((IUnknown*)disp, (IUnknown*)window_doc), "contentDocument != contentWindow.document\n");
7284
7285 IDispatch_Release(disp);
7286 IHTMLFrameElement3_Release(frame_elem3);
7287 }else {
7288 win_skip("IHTMLFrameElement3 not supported\n");
7289 }
7290 }
7291
7292 IHTMLDocument2_Release(elem_doc);
7293 IHTMLDocument2_Release(window_doc);
7294 }
7295
7296 #define test_iframe_height(a,b) _test_iframe_height(__LINE__,a,b)
7297 static void _test_iframe_height(unsigned line, IHTMLElement *elem, const char *exval)
7298 {
7299 IHTMLIFrameElement2 *iframe = _get_iframe2_iface(line, (IUnknown*)elem);
7300 VARIANT v;
7301 HRESULT hres;
7302
7303 hres = IHTMLIFrameElement2_get_height(iframe, &v);
7304 ok_(__FILE__,line)(hres == S_OK, "get_height failed: %08x\n", hres);
7305 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(height) = %d\n", V_VT(&v));
7306 if(exval)
7307 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exval), "height = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exval);
7308 else
7309 ok_(__FILE__,line)(!V_BSTR(&v), "height = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
7310 VariantClear(&v);
7311 IHTMLIFrameElement2_Release(iframe);
7312 }
7313
7314 #define set_iframe_height(a,b) _set_iframe_height(__LINE__,a,b)
7315 static void _set_iframe_height(unsigned line, IHTMLElement *elem, const char *val)
7316 {
7317 IHTMLIFrameElement2 *iframe = _get_iframe2_iface(line, (IUnknown*)elem);
7318 VARIANT v;
7319 HRESULT hres;
7320
7321 V_VT(&v) = VT_BSTR;
7322 V_BSTR(&v) = a2bstr(val);
7323 hres = IHTMLIFrameElement2_put_height(iframe, v);
7324 ok_(__FILE__,line)(hres == S_OK, "put_height failed: %08x\n", hres);
7325 VariantClear(&v);
7326 IHTMLIFrameElement2_Release(iframe);
7327 }
7328
7329 #define test_iframe_width(a,b) _test_iframe_width(__LINE__,a,b)
7330 static void _test_iframe_width(unsigned line, IHTMLElement *elem, const char *exval)
7331 {
7332 IHTMLIFrameElement2 *iframe = _get_iframe2_iface(line, (IUnknown*)elem);
7333 VARIANT v;
7334 HRESULT hres;
7335
7336 hres = IHTMLIFrameElement2_get_width(iframe, &v);
7337 ok_(__FILE__,line)(hres == S_OK, "get_width failed: %08x\n", hres);
7338 ok_(__FILE__,line)(V_VT(&v) == VT_BSTR, "V_VT(width) = %d\n", V_VT(&v));
7339 if(exval)
7340 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&v), exval), "width = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), exval);
7341 else
7342 ok_(__FILE__,line)(!V_BSTR(&v), "width = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
7343 VariantClear(&v);
7344 IHTMLIFrameElement2_Release(iframe);
7345 }
7346
7347 #define set_iframe_width(a,b) _set_iframe_width(__LINE__,a,b)
7348 static void _set_iframe_width(unsigned line, IHTMLElement *elem, const char *val)
7349 {
7350 IHTMLIFrameElement2 *iframe = _get_iframe2_iface(line, (IUnknown*)elem);
7351 VARIANT v;
7352 HRESULT hres;
7353
7354 V_VT(&v) = VT_BSTR;
7355 V_BSTR(&v) = a2bstr(val);
7356 hres = IHTMLIFrameElement2_put_width(iframe, v);
7357 ok_(__FILE__,line)(hres == S_OK, "put_width failed: %08x\n", hres);
7358 VariantClear(&v);
7359 IHTMLIFrameElement2_Release(iframe);
7360 }
7361
7362 static void test_iframe_elem(IHTMLElement *elem)
7363 {
7364 IHTMLDocument2 *content_doc, *owner_doc;
7365 IHTMLIFrameElement3 *iframe3;
7366 IHTMLElementCollection *col;
7367 IHTMLWindow2 *content_window;
7368 IHTMLElement *body;
7369 IDispatch *disp;
7370 VARIANT errv;
7371 BSTR str;
7372 HRESULT hres;
7373
7374 static const elem_type_t all_types[] = {
7375 ET_HTML,
7376 ET_HEAD,
7377 ET_TITLE,
7378 ET_BODY,
7379 ET_BR
7380 };
7381
7382 test_frame_doc((IUnknown*)elem, TRUE);
7383 test_framebase((IUnknown*)elem);
7384
7385 content_window = get_frame_content_window((IUnknown*)elem);
7386 test_ifaces((IUnknown*)content_window, window_iids);
7387 test_window_length(content_window, 0);
7388
7389 content_doc = get_window_doc(content_window);
7390 IHTMLWindow2_Release(content_window);
7391
7392 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLIFrameElement3, (void**)&iframe3);
7393 if(SUCCEEDED(hres)) {
7394 hres = IHTMLIFrameElement3_get_contentDocument(iframe3, &disp);
7395 ok(hres == S_OK, "get_contentDocument failed: %08x\n", hres);
7396 ok(iface_cmp((IUnknown*)content_doc, (IUnknown*)disp), "content_doc != disp\n");
7397 IDispatch_Release(disp);
7398
7399 IHTMLIFrameElement3_Release(iframe3);
7400 }else {
7401 win_skip("IHTMLIFrameElement3 not supported\n");
7402 }
7403
7404 test_iframe_height(elem, NULL);
7405 set_iframe_height(elem, "100px");
7406 set_iframe_height(elem, "50%");
7407 test_iframe_height(elem, "50%");
7408
7409 test_iframe_width(elem, NULL);
7410 set_iframe_width(elem, "150px");
7411 set_iframe_width(elem, "70%");
7412 test_iframe_width(elem, "70%");
7413 test_framebase_src(elem, "about:blank");
7414
7415 str = a2bstr("text/html");
7416 V_VT(&errv) = VT_ERROR;
7417 disp = NULL;
7418 hres = IHTMLDocument2_open(content_doc, str, errv, errv, errv, &disp);
7419 SysFreeString(str);
7420 ok(hres == S_OK, "open failed: %08x\n", hres);
7421 ok(disp != NULL, "disp == NULL\n");
7422 ok(iface_cmp((IUnknown*)disp, (IUnknown*)content_window), "disp != content_window\n");
7423 IDispatch_Release(disp);
7424
7425 doc_write(content_doc, FALSE, "<html><head><title>test</title></head>");
7426 doc_complex_write(content_doc);
7427 doc_write(content_doc, TRUE, "<br />");
7428 doc_write(content_doc, TRUE, "</html>");
7429
7430 hres = IHTMLDocument2_get_all(content_doc, &col);
7431 ok(hres == S_OK, "get_all failed: %08x\n", hres);
7432 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
7433 IHTMLElementCollection_Release(col);
7434
7435 body = doc_get_body(content_doc);
7436 test_elem_attr(body, "i4val", "4");
7437 test_elem_attr(body, "r8val", "3.14");
7438 IHTMLElement_Release(body);
7439
7440 hres = IHTMLDocument2_close(content_doc);
7441 ok(hres == S_OK, "close failed: %08x\n", hres);
7442
7443 owner_doc = get_owner_doc((IUnknown*)content_doc);
7444 ok(!owner_doc, "owner_doc = %p\n", owner_doc);
7445
7446 IHTMLDocument2_Release(content_doc);
7447 }
7448
7449 #define test_stylesheet_csstext(a,b,c) _test_stylesheet_csstext(__LINE__,a,b,c)
7450 static void _test_stylesheet_csstext(unsigned line, IHTMLStyleSheet *stylesheet, const char *exstr, BOOL is_todo)
7451 {
7452 BSTR str;
7453 HRESULT hres;
7454
7455 hres = IHTMLStyleSheet_get_cssText(stylesheet, &str);
7456 ok_(__FILE__,line)(hres == S_OK, "get_cssText failed: %08x\n", hres);
7457 if(!is_todo) {
7458 if(exstr)
7459 ok_(__FILE__,line)(is_prefix_wa(str, exstr), "cssText = %s\n", wine_dbgstr_w(str));
7460 else
7461 ok_(__FILE__,line)(!str, "cssText = %s\n", wine_dbgstr_w(str));
7462 }else todo_wine {
7463 if(exstr)
7464 ok_(__FILE__,line)(is_prefix_wa(str, exstr), "cssText = %s\n", wine_dbgstr_w(str));
7465 else
7466 ok_(__FILE__,line)(!str, "cssText = %s\n", wine_dbgstr_w(str));
7467 }
7468
7469 SysFreeString(str);
7470 }
7471
7472 #define set_stylesheet_csstext(a,b,c) _set_stylesheet_csstext(__LINE__,a,b,c)
7473 static void _set_stylesheet_csstext(unsigned line, IHTMLStyleSheet *stylesheet, const char *csstext, BOOL is_todo)
7474 {
7475 BSTR str = a2bstr(csstext);
7476 HRESULT hres;
7477
7478 hres = IHTMLStyleSheet_put_cssText(stylesheet, str);
7479 if(!is_todo)
7480 ok_(__FILE__,line)(hres == S_OK, "put_cssText failed: %08x\n", hres);
7481 else
7482 todo_wine ok_(__FILE__,line)(hres == S_OK, "put_cssText failed: %08x\n", hres);
7483 SysFreeString(str);
7484 }
7485
7486 static void test_stylesheet(IDispatch *disp)
7487 {
7488 IHTMLStyleSheetRulesCollection *col = NULL;
7489 IHTMLStyleSheet *stylesheet;
7490 HRESULT hres;
7491 BSTR href;
7492
7493 test_disp2((IUnknown*)disp, &DIID_DispHTMLStyleSheet, &IID_IHTMLStyleSheet, "[object]");
7494
7495 hres = IDispatch_QueryInterface(disp, &IID_IHTMLStyleSheet, (void**)&stylesheet);
7496 ok(hres == S_OK, "Could not get IHTMLStyleSheet: %08x\n", hres);
7497
7498 hres = IHTMLStyleSheet_get_rules(stylesheet, &col);
7499 ok(hres == S_OK, "get_rules failed: %08x\n", hres);
7500 ok(col != NULL, "col == NULL\n");
7501
7502 test_disp2((IUnknown*)col, &DIID_DispHTMLStyleSheetRulesCollection, &IID_IHTMLStyleSheetRulesCollection, "[object]");
7503 IHTMLStyleSheetRulesCollection_Release(col);
7504
7505 href = (void*)0xdeadbeef;
7506 hres = IHTMLStyleSheet_get_href(stylesheet, &href);
7507 ok(hres == S_OK, "get_href failed: %08x\n", hres);
7508 ok(href == NULL, "got href != NULL\n");
7509 SysFreeString(href);
7510
7511 test_stylesheet_csstext(stylesheet, ".body {", FALSE);
7512 set_stylesheet_csstext(stylesheet, ".div { margin-right: 1px; }\n.body { margin-right: 2px; }", TRUE);
7513 test_stylesheet_csstext(stylesheet, ".div {", TRUE);
7514 set_stylesheet_csstext(stylesheet, "", FALSE);
7515 test_stylesheet_csstext(stylesheet, NULL, FALSE);
7516 set_stylesheet_csstext(stylesheet, ".div { margin-right: 1px; }", FALSE);
7517 test_stylesheet_csstext(stylesheet, ".div {", FALSE);
7518
7519 IHTMLStyleSheet_Release(stylesheet);
7520 }
7521
7522 static void test_stylesheets(IHTMLDocument2 *doc)
7523 {
7524 IHTMLStyleSheetsCollection *col = NULL;
7525 VARIANT idx, res;
7526 LONG len = 0;
7527 HRESULT hres;
7528
7529 hres = IHTMLDocument2_get_styleSheets(doc, &col);
7530 ok(hres == S_OK, "get_styleSheets failed: %08x\n", hres);
7531 ok(col != NULL, "col == NULL\n");
7532
7533 test_disp2((IUnknown*)col, &DIID_DispHTMLStyleSheetsCollection, &IID_IHTMLStyleSheetsCollection, "[object]");
7534
7535 hres = IHTMLStyleSheetsCollection_get_length(col, &len);
7536 ok(hres == S_OK, "get_length failed: %08x\n", hres);
7537 ok(len == 1, "len=%d\n", len);
7538
7539 VariantInit(&res);
7540 V_VT(&idx) = VT_I4;
7541 V_I4(&idx) = 0;
7542
7543 hres = IHTMLStyleSheetsCollection_item(col, &idx, &res);
7544 ok(hres == S_OK, "item failed: %08x\n", hres);
7545 ok(V_VT(&res) == VT_DISPATCH, "V_VT(res) = %d\n", V_VT(&res));
7546 ok(V_DISPATCH(&res) != NULL, "V_DISPATCH(&res) == NULL\n");
7547 test_stylesheet(V_DISPATCH(&res));
7548 VariantClear(&res);
7549
7550 V_VT(&res) = VT_I4;
7551 V_VT(&idx) = VT_I4;
7552 V_I4(&idx) = 1;
7553
7554 hres = IHTMLStyleSheetsCollection_item(col, &idx, &res);
7555 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
7556 ok(V_VT(&res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(&res));
7557 VariantClear(&res);
7558
7559 IHTMLStyleSheetsCollection_Release(col);
7560 }
7561
7562 static void test_child_col_disp(IHTMLDOMChildrenCollection *col)
7563 {
7564 IDispatchEx *dispex;
7565 IHTMLDOMNode *node;
7566 DISPPARAMS dp = {NULL, NULL, 0, 0};
7567 VARIANT var;
7568 EXCEPINFO ei;
7569 LONG type;
7570 DISPID id;
7571 BSTR bstr;
7572 HRESULT hres;
7573
7574 static const WCHAR w0[] = {'0',0};
7575 static const WCHAR w100[] = {'1','0','0',0};
7576
7577 hres = IHTMLDOMChildrenCollection_QueryInterface(col, &IID_IDispatchEx, (void**)&dispex);
7578 ok(hres == S_OK, "Could not get IDispatchEx: %08x\n", hres);
7579
7580 bstr = SysAllocString(w0);
7581 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id);
7582 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
7583 SysFreeString(bstr);
7584
7585 VariantInit(&var);
7586 hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
7587 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
7588 ok(V_VT(&var) == VT_DISPATCH, "V_VT(var)=%d\n", V_VT(&var));
7589 ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(var) == NULL\n");
7590 node = get_node_iface((IUnknown*)V_DISPATCH(&var));
7591 type = get_node_type((IUnknown*)node);
7592 ok(type == 3, "type=%d\n", type);
7593 IHTMLDOMNode_Release(node);
7594 VariantClear(&var);
7595
7596 bstr = SysAllocString(w100);
7597 hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id);
7598 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
7599 SysFreeString(bstr);
7600
7601 IDispatchEx_Release(dispex);
7602 }
7603
7604 static void test_enum_children(IUnknown *unk, unsigned len)
7605 {
7606 IEnumVARIANT *enum_var;
7607 ULONG i, fetched;
7608 VARIANT v;
7609 HRESULT hres;
7610
7611 hres = IUnknown_QueryInterface(unk, &IID_IEnumVARIANT, (void**)&enum_var);
7612 ok(hres == S_OK, "Could not get IEnumVARIANT iface: %08x\n", hres);
7613
7614 for(i=0; i<len; i++) {
7615 fetched = 0;
7616 V_VT(&v) = VT_ERROR;
7617 hres = IEnumVARIANT_Next(enum_var, 1, &v, i ? &fetched : NULL);
7618 ok(hres == S_OK, "Next failed: %08x\n", hres);
7619 if(i)
7620 ok(fetched == 1, "fetched = %d\n", fetched);
7621 ok(V_VT(&v) == VT_DISPATCH && V_DISPATCH(&v), "V_VT(v) = %d\n", V_VT(&v));
7622 IDispatch_Release(V_DISPATCH(&v));
7623 }
7624
7625 fetched = 0xdeadbeef;
7626 V_VT(&v) = VT_BOOL;
7627 hres = IEnumVARIANT_Next(enum_var, 1, &v, &fetched);
7628 ok(hres == S_FALSE, "Next returned %08x, expected S_FALSE\n", hres);
7629 ok(fetched == 0, "fetched = %d\n", fetched);
7630 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
7631
7632 hres = IEnumVARIANT_Reset(enum_var);
7633 ok(hres == S_OK, "Reset failed: %08x\n", hres);
7634
7635 fetched = 0xdeadbeef;
7636 V_VT(&v) = VT_BOOL;
7637 hres = IEnumVARIANT_Next(enum_var, 0, &v, &fetched);
7638 ok(hres == S_OK, "Next returned %08x, expected S_FALSE\n", hres);
7639 ok(fetched == 0, "fetched = %d\n", fetched);
7640 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
7641
7642 hres = IEnumVARIANT_Skip(enum_var, len > 2 ? len-2 : 0);
7643 ok(hres == S_OK, "Skip failed: %08x\n", hres);
7644
7645 hres = IEnumVARIANT_Reset(enum_var);
7646 ok(hres == S_OK, "Reset failed: %08x\n", hres);
7647
7648 hres = IEnumVARIANT_Skip(enum_var, len+1);
7649 ok(hres == S_FALSE, "Skip failed: %08x\n", hres);
7650
7651 IEnumVARIANT_Release(enum_var);
7652 }
7653
7654 static void test_elems(IHTMLDocument2 *doc)
7655 {
7656 IHTMLElementCollection *col;
7657 IHTMLDOMChildrenCollection *child_col;
7658 IHTMLElement *elem, *elem2, *elem3;
7659 IHTMLDOMNode *node, *node2;
7660 IHTMLWindow2 *window;
7661 IDispatch *disp;
7662 LONG type;
7663 HRESULT hres;
7664 IHTMLElementCollection *collection;
7665 IHTMLDocument3 *doc3;
7666 BSTR str;
7667
7668 static const elem_type_t all_types[] = {
7669 ET_HTML,
7670 ET_HEAD,
7671 ET_TITLE,
7672 ET_STYLE,
7673 ET_META,
7674 ET_LINK,
7675 ET_BODY,
7676 ET_COMMENT,
7677 ET_A,
7678 ET_LABEL,
7679 ET_INPUT,
7680 ET_BUTTON,
7681 ET_SELECT,
7682 ET_OPTION,
7683 ET_OPTION,
7684 ET_TEXTAREA,
7685 ET_TABLE,
7686 ET_TBODY,
7687 ET_TR,
7688 ET_TR,
7689 ET_TD,
7690 ET_TD,
7691 ET_SCRIPT,
7692 ET_TEST,
7693 ET_OBJECT,
7694 ET_EMBED,
7695 ET_IMG,
7696 ET_IFRAME,
7697 ET_FORM,
7698 ET_DIV
7699 };
7700
7701 static const elem_type_t item_types[] = {
7702 ET_A,
7703 ET_OPTION,
7704 ET_TEXTAREA
7705 };
7706
7707 hres = IHTMLDocument2_get_all(doc, &col);
7708 ok(hres == S_OK, "get_all failed: %08x\n", hres);
7709 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
7710 test_elem_col_item(col, "x", item_types, sizeof(item_types)/sizeof(item_types[0]));
7711
7712 elem = get_elem_col_item_idx(col, 0);
7713 test_elem_source_index(elem, 0);
7714 IHTMLElement_Release(elem);
7715
7716 elem = get_elem_col_item_idx(col, 3);
7717 test_elem_source_index(elem, 3);
7718 IHTMLElement_Release(elem);
7719
7720 IHTMLElementCollection_Release(col);
7721
7722 hres = IHTMLDocument2_get_images(doc, &collection);
7723 ok(hres == S_OK, "get_images failed: %08x\n", hres);
7724 if(hres == S_OK)
7725 {
7726 static const elem_type_t images_types[] = {ET_IMG};
7727 test_elem_collection((IUnknown*)collection, images_types, 1);
7728
7729 IHTMLElementCollection_Release(collection);
7730 }
7731
7732 hres = IHTMLDocument2_get_links(doc, &collection);
7733 ok(hres == S_OK, "get_links failed: %08x\n", hres);
7734 if(hres == S_OK)
7735 {
7736 static const elem_type_t images_types[] = {ET_A};
7737 test_elem_collection((IUnknown*)collection, images_types, 1);
7738
7739 IHTMLElementCollection_Release(collection);
7740 }
7741
7742 hres = IHTMLDocument2_get_anchors(doc, &collection);
7743 ok(hres == S_OK, "get_anchors failed: %08x\n", hres);
7744 if(hres == S_OK)
7745 {
7746 static const elem_type_t anchor_types[] = {ET_A};
7747 test_elem_collection((IUnknown*)collection, anchor_types, 1);
7748
7749 IHTMLElementCollection_Release(collection);
7750 }
7751
7752 hres = IHTMLDocument2_get_scripts(doc, &collection);
7753 ok(hres == S_OK, "get_scripts failed: %08x\n", hres);
7754 if(hres == S_OK) {
7755 static const elem_type_t script_types[] = {ET_SCRIPT};
7756 test_elem_collection((IUnknown*)collection, script_types, 1);
7757 IHTMLElementCollection_Release(collection);
7758 }
7759
7760 test_plugins_col(doc);
7761
7762 elem = get_doc_elem(doc);
7763 test_elem_istextedit(elem, VARIANT_FALSE);
7764 test_elem_all((IUnknown*)elem, all_types+1, sizeof(all_types)/sizeof(all_types[0])-1);
7765 IHTMLElement_Release(elem);
7766
7767 get_elem_by_id(doc, "xxx", FALSE);
7768 elem = get_doc_elem_by_id(doc, "xxx");
7769 ok(!elem, "elem != NULL\n");
7770
7771 elem = get_doc_elem_by_id(doc, "s");
7772 ok(elem != NULL, "elem == NULL\n");
7773 if(elem) {
7774 test_elem_type((IUnknown*)elem, ET_SELECT);
7775 test_elem_attr(elem, "xxx", NULL);
7776 test_elem_attr(elem, "id", "s");
7777 test_elem_class((IUnknown*)elem, NULL);
7778 test_elem_set_class((IUnknown*)elem, "cl");
7779 test_elem_set_class((IUnknown*)elem, NULL);
7780 test_elem_tabindex((IUnknown*)elem, 0);
7781 test_elem_set_tabindex((IUnknown*)elem, 1);
7782 test_elem_filters((IUnknown*)elem);
7783 test_elem_istextedit(elem, VARIANT_FALSE);
7784
7785 node = test_node_get_parent((IUnknown*)elem);
7786 ok(node != NULL, "node == NULL\n");
7787 test_node_name((IUnknown*)node, "BODY");
7788 node2 = test_node_get_parent((IUnknown*)node);
7789 IHTMLDOMNode_Release(node);
7790 ok(node2 != NULL, "node == NULL\n");
7791 test_node_name((IUnknown*)node2, "HTML");
7792 node = test_node_get_parent((IUnknown*)node2);
7793 IHTMLDOMNode_Release(node2);
7794 ok(node != NULL, "node == NULL\n");
7795 if (node)
7796 {
7797 test_node_name((IUnknown*)node, "#document");
7798 type = get_node_type((IUnknown*)node);
7799 ok(type == 9, "type=%d, expected 9\n", type);
7800 node2 = test_node_get_parent((IUnknown*)node);
7801 IHTMLDOMNode_Release(node);
7802 ok(node2 == NULL, "node != NULL\n");
7803 }
7804
7805 elem2 = test_elem_get_parent((IUnknown*)elem);
7806 ok(elem2 != NULL, "elem2 == NULL\n");
7807 test_node_name((IUnknown*)elem2, "BODY");
7808
7809 elem3 = test_elem_get_parent((IUnknown*)elem2);
7810 ok(elem3 != NULL, "elem3 == NULL\n");
7811 test_node_name((IUnknown*)elem3, "HTML");
7812
7813 test_elem_contains(elem3, elem2, VARIANT_TRUE);
7814 test_elem_contains(elem3, elem, VARIANT_TRUE);
7815 test_elem_contains(elem2, elem, VARIANT_TRUE);
7816 test_elem_contains(elem2, elem3, VARIANT_FALSE);
7817 test_elem_contains(elem, elem3, VARIANT_FALSE);
7818 test_elem_contains(elem, elem2, VARIANT_FALSE);
7819 test_elem_contains(elem, elem, VARIANT_TRUE);
7820 test_elem_contains(elem, NULL, VARIANT_FALSE);
7821 IHTMLElement_Release(elem2);
7822
7823 elem2 = test_elem_get_parent((IUnknown*)elem3);
7824 ok(elem2 == NULL, "elem2 != NULL\n");
7825 test_elem_source_index(elem3, 0);
7826 IHTMLElement_Release(elem3);
7827
7828 test_elem_getelembytag((IUnknown*)elem, ET_OPTION, 2, NULL);
7829 test_elem_getelembytag((IUnknown*)elem, ET_SELECT, 0, NULL);
7830 test_elem_getelembytag((IUnknown*)elem, ET_HTML, 0, NULL);
7831
7832 test_elem_innertext(elem, "opt1opt2");
7833
7834 IHTMLElement_Release(elem);
7835 }
7836
7837 elem = get_elem_by_id(doc, "s", TRUE);
7838 if(elem) {
7839 IHTMLSelectElement *select = get_select_iface((IUnknown*)elem);
7840 IHTMLDocument2 *doc_node, *elem_doc;
7841
7842 test_select_elem(select);
7843
7844 test_elem_istextedit(elem, VARIANT_FALSE);
7845 test_elem_title((IUnknown*)select, NULL);
7846 test_elem_set_title((IUnknown*)select, "Title");
7847 test_elem_title((IUnknown*)select, "Title");
7848 test_elem_offset((IUnknown*)select, "BODY");
7849 test_elem_bounding_client_rect((IUnknown*)select);
7850
7851 node = get_first_child((IUnknown*)select);
7852 ok(node != NULL, "node == NULL\n");
7853 if(node) {
7854 test_elem_type((IUnknown*)node, ET_OPTION);
7855 IHTMLDOMNode_Release(node);
7856 }
7857
7858 type = get_node_type((IUnknown*)select);
7859 ok(type == 1, "type=%d\n", type);
7860
7861 IHTMLSelectElement_Release(select);
7862
7863 elem_doc = get_elem_doc((IUnknown*)elem);
7864
7865 doc_node = get_doc_node(doc);
7866 ok(iface_cmp((IUnknown*)elem_doc, (IUnknown*)doc_node), "disp != doc\n");
7867 IHTMLDocument2_Release(doc_node);
7868 IHTMLDocument2_Release(elem_doc);
7869
7870 IHTMLElement_Release(elem);
7871 }
7872
7873 elem = get_elem_by_id(doc, "sc", TRUE);
7874 if(elem) {
7875 IHTMLScriptElement *script;
7876 BSTR type;
7877
7878 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLScriptElement, (void**)&script);
7879 ok(hres == S_OK, "Could not get IHTMLScriptElement interface: %08x\n", hres);
7880
7881 test_elem_language(elem, NULL);
7882 test_elem_istextedit(elem, VARIANT_FALSE);
7883
7884 if(hres == S_OK)
7885 {
7886 VARIANT_BOOL vb;
7887
7888 hres = IHTMLScriptElement_put_type (script, NULL);
7889 ok(hres == S_OK, "put_type failed: %08x\n", hres);
7890 hres = IHTMLScriptElement_get_type(script, &type);
7891 ok(hres == S_OK, "get_type failed: %08x\n", hres);
7892 ok(type == NULL, "Unexpected type %s\n", wine_dbgstr_w(type));
7893
7894 type = a2bstr("text/javascript");
7895 hres = IHTMLScriptElement_put_type (script, type);
7896 ok(hres == S_OK, "put_type failed: %08x\n", hres);
7897 SysFreeString(type);
7898 hres = IHTMLScriptElement_get_type(script, &type);
7899 ok(hres == S_OK, "get_type failed: %08x\n", hres);
7900 ok(!strcmp_wa(type, "text/javascript"), "Unexpected type %s\n", wine_dbgstr_w(type));
7901 SysFreeString(type);
7902
7903 test_script_text(script, "<!--\nfunction Testing() {}\n// -->\n");
7904
7905 /* test defer */
7906 hres = IHTMLScriptElement_put_defer(script, VARIANT_TRUE);
7907 ok(hres == S_OK, "put_defer failed: %08x\n", hres);
7908
7909 hres = IHTMLScriptElement_get_defer(script, &vb);
7910 ok(hres == S_OK, "get_defer failed: %08x\n", hres);
7911 ok(vb == VARIANT_TRUE, "get_defer result is %08x\n", hres);
7912
7913 hres = IHTMLScriptElement_put_defer(script, VARIANT_FALSE);
7914 ok(hres == S_OK, "put_defer failed: %08x\n", hres);
7915
7916 str = (BSTR)0xdeadbeef;
7917 hres = IHTMLScriptElement_get_src(script, &str);
7918 ok(hres == S_OK, "get_src failed: %08x\n", hres);
7919 ok(!str, "src = %s\n", wine_dbgstr_w(str));
7920 }
7921
7922 IHTMLScriptElement_Release(script);
7923
7924 set_elem_language(elem, "vbscript");
7925 set_elem_language(elem, "xxx");
7926 }
7927
7928 elem = get_elem_by_id(doc, "in", TRUE);
7929 if(elem) {
7930 IHTMLInputElement *input;
7931
7932 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLInputElement, (void**)&input);
7933 ok(hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
7934
7935 test_elem_id((IUnknown*)elem, "in");
7936 test_elem_put_id((IUnknown*)elem, "newin");
7937 test_input_get_disabled(input, VARIANT_FALSE);
7938 test_input_set_disabled(input, VARIANT_TRUE);
7939 test_input_set_disabled(input, VARIANT_FALSE);
7940 test_elem3_set_disabled((IUnknown*)input, VARIANT_TRUE);
7941 test_input_get_disabled(input, VARIANT_TRUE);
7942 test_elem3_set_disabled((IUnknown*)input, VARIANT_FALSE);
7943 test_input_get_disabled(input, VARIANT_FALSE);
7944 test_elem_client_size((IUnknown*)elem);
7945 test_input_type(input, "text");
7946 test_elem_istextedit(elem, VARIANT_TRUE);
7947
7948 test_node_get_value_str((IUnknown*)elem, NULL);
7949 test_node_put_value_str((IUnknown*)elem, "test");
7950 test_node_get_value_str((IUnknown*)elem, NULL);
7951 test_input_value((IUnknown*)elem, NULL);
7952 test_input_defaultValue((IUnknown*)elem, NULL);
7953 test_input_put_value((IUnknown*)elem, "test");
7954 test_input_defaultValue((IUnknown*)elem, NULL);
7955 test_elem_class((IUnknown*)elem, "testclass");
7956 test_elem_tabindex((IUnknown*)elem, 2);
7957 test_elem_set_tabindex((IUnknown*)elem, 3);
7958 test_elem_title((IUnknown*)elem, "test title");
7959
7960 test_input_get_defaultchecked(input, VARIANT_FALSE);
7961 test_input_set_defaultchecked(input, VARIANT_TRUE);
7962 test_input_set_defaultchecked(input, VARIANT_FALSE);
7963
7964 test_input_get_checked(input, VARIANT_FALSE);
7965 test_input_set_checked(input, VARIANT_TRUE);
7966 test_input_set_checked(input, VARIANT_FALSE);
7967
7968 test_input_maxlength(input, 0x7fffffff);
7969 test_input_set_maxlength(input, 30);
7970
7971 test_input_name(input, NULL);
7972 test_input_set_name(input, "test");
7973
7974 test_input_src(input, NULL);
7975 test_input_set_src(input, "about:blank");
7976
7977 test_input_set_size(input, 15, S_OK);
7978 test_input_get_size(input, 15);
7979 test_input_set_size(input, -100, CTL_E_INVALIDPROPERTYVALUE);
7980 test_input_get_size(input, 15);
7981 test_input_set_size(input, 0, CTL_E_INVALIDPROPERTYVALUE);
7982 test_input_get_size(input, 15);
7983
7984 test_input_readOnly(input, VARIANT_TRUE);
7985 test_input_readOnly(input, VARIANT_FALSE);
7986
7987 IHTMLInputElement_Release(input);
7988 IHTMLElement_Release(elem);
7989 }
7990
7991 elem = get_elem_by_id(doc, "imgid", TRUE);
7992 if(elem) {
7993 test_img_align((IUnknown*)elem, "left");
7994 test_img_name((IUnknown*)elem, "WineImg");
7995 test_img_src((IUnknown*)elem, "", NULL);
7996 test_img_set_src((IUnknown*)elem, "about:blank");
7997 test_img_src((IUnknown*)elem, "about:blank", NULL);
7998 test_img_alt((IUnknown*)elem, NULL);
7999 test_img_set_alt((IUnknown*)elem, "alt test");
8000 test_img_name((IUnknown*)elem, "WineImg");
8001 test_img_complete(elem, VARIANT_FALSE);
8002 test_img_isMap((IUnknown*)elem, VARIANT_TRUE);
8003 test_img_isMap((IUnknown*)elem, VARIANT_FALSE);
8004 IHTMLElement_Release(elem);
8005 }
8006
8007 elem = get_elem_by_id(doc, "attr", TRUE);
8008 if(elem) {
8009 test_dynamic_properties(elem);
8010 test_attr_collection(elem);
8011 test_contenteditable((IUnknown*)elem);
8012 IHTMLElement_Release(elem);
8013 }
8014
8015 elem = get_elem_by_id(doc, "styleid", TRUE);
8016 if(elem) {
8017 test_style_media((IUnknown*)elem, NULL);
8018 test_style_put_media((IUnknown*)elem, "screen");
8019 test_style_type((IUnknown*)elem, NULL);
8020 test_style_put_type((IUnknown*)elem, "text/css");
8021 IHTMLElement_Release(elem);
8022 }
8023
8024 elem = get_doc_elem_by_id(doc, "tbl");
8025 ok(elem != NULL, "elem == NULL\n");
8026 if(elem) {
8027 test_table_elem(elem);
8028 IHTMLElement_Release(elem);
8029 }
8030
8031 elem = get_doc_elem_by_id(doc, "labelid");
8032 ok(elem != NULL, "elem == NULL\n");
8033 if(elem) {
8034 test_label_elem(elem);
8035 IHTMLElement_Release(elem);
8036 }
8037
8038 elem = get_doc_elem_by_id(doc, "td2");
8039 ok(elem != NULL, "elem == NULL\n");
8040 if(elem) {
8041 test_td_elem(elem);
8042 IHTMLElement_Release(elem);
8043 }
8044
8045 elem = get_doc_elem_by_id(doc, "row2");
8046 ok(elem != NULL, "elem == NULL\n");
8047 if(elem) {
8048 test_tr_elem(elem);
8049 IHTMLElement_Release(elem);
8050 }
8051
8052 elem = get_doc_elem_by_id(doc, "ifr");
8053 ok(elem != NULL, "elem == NULL\n");
8054 if(elem) {
8055 test_iframe_elem(elem);
8056 IHTMLElement_Release(elem);
8057 }
8058
8059 elem = get_doc_elem_by_id(doc, "btnid");
8060 ok(elem != NULL, "elem == NULL\n");
8061 if(elem) {
8062 test_button_elem(elem);
8063 test_button_get_disabled(elem, VARIANT_FALSE);
8064 test_button_set_disabled(elem, VARIANT_TRUE);
8065 test_elem3_set_disabled((IUnknown*)elem, VARIANT_FALSE);
8066 test_button_get_disabled(elem, VARIANT_FALSE);
8067 IHTMLElement_Release(elem);
8068 }
8069
8070 elem = get_doc_elem_by_id(doc, "objid");
8071 ok(elem != NULL, "elem == NULL\n");
8072 if(elem) {
8073 test_object_vspace((IUnknown*)elem, 100);
8074 test_object_name(elem, "objname");
8075 set_object_name(elem, "test");
8076 set_object_name(elem, NULL);
8077 IHTMLElement_Release(elem);
8078 }
8079
8080 elem = get_elem_by_id(doc, "a", TRUE);
8081 if(elem) {
8082 test_anchor_href((IUnknown*)elem, "http://test/");
8083
8084 /* Change the href */
8085 test_anchor_put_href((IUnknown*)elem, "http://test1/");
8086 test_anchor_href((IUnknown*)elem, "http://test1/");
8087 test_anchor_hostname((IUnknown*)elem, "test1");
8088
8089 /* Restore the href */
8090 test_anchor_put_href((IUnknown*)elem, "http://test/");
8091 test_anchor_href((IUnknown*)elem, "http://test/");
8092 test_anchor_hostname((IUnknown*)elem, "test");
8093 test_anchor_hash(elem, NULL);
8094
8095 /* target */
8096 test_anchor_get_target((IUnknown*)elem, NULL);
8097
8098 test_anchor_rel((IUnknown*)elem, NULL);
8099 test_anchor_put_rel((IUnknown*)elem, "Next");
8100 test_anchor_rel((IUnknown*)elem, "Next");
8101
8102 /* Change the target */
8103 test_anchor_put_target((IUnknown*)elem, "wine");
8104 test_anchor_get_target((IUnknown*)elem, "wine");
8105
8106 /* Restore the target */
8107 test_anchor_put_target((IUnknown*)elem, NULL);
8108 test_anchor_get_target((IUnknown*)elem, NULL);
8109
8110 test_anchor_name((IUnknown*)elem, "x");
8111 test_anchor_put_name((IUnknown*)elem, "anchor name");
8112 test_anchor_put_name((IUnknown*)elem, NULL);
8113 test_anchor_put_name((IUnknown*)elem, "x");
8114
8115 test_anchor_put_href((IUnknown*)elem, "http://test/?how#hash");
8116 test_anchor_hash(elem, "#hash");
8117 test_anchor_search((IUnknown*)elem, "?how", FALSE);
8118
8119 test_anchor_put_search((IUnknown*)elem, "?word=press");
8120 test_anchor_search((IUnknown*)elem, "?word=press", FALSE);
8121 test_anchor_put_search((IUnknown*)elem, "?????word???press");
8122 test_anchor_search((IUnknown*)elem, "?????word???press", FALSE);
8123
8124 test_anchor_put_search((IUnknown*)elem, "?q=%E4%BD%A0%E5%A5%BD"); /* encoded cjk characters */
8125 test_anchor_search((IUnknown*)elem, "?q=%E4%BD%A0%E5%A5%BD", FALSE);
8126
8127 test_anchor_put_search((IUnknown*)elem, "?how?old=are");
8128 test_anchor_search((IUnknown*)elem, "?how?old=are", FALSE);
8129
8130 /* due to incorrect behavior of ie6, search string without leading "?" is interpreted
8131 as part of the pathname, and cannot be accessed by get_search. */
8132 test_anchor_put_search((IUnknown*)elem, "word=abc");
8133 test_anchor_search((IUnknown*)elem, "?word=abc", TRUE);
8134
8135 IHTMLElement_Release(elem);
8136 }
8137
8138 elem = get_doc_elem_by_id(doc, "metaid");
8139 if(elem) {
8140 test_meta_name((IUnknown*)elem, "meta name");
8141 test_meta_content((IUnknown*)elem, "text/html; charset=utf-8");
8142 test_meta_httpequiv((IUnknown*)elem, "Content-Type");
8143 test_meta_charset((IUnknown*)elem, NULL);
8144 set_meta_charset((IUnknown*)elem, "utf-8");
8145 IHTMLElement_Release(elem);
8146 }
8147
8148 elem = doc_get_body(doc);
8149
8150 node = get_first_child((IUnknown*)elem);
8151 ok(node != NULL, "node == NULL\n");
8152 if(node) {
8153 test_ifaces((IUnknown*)node, text_iids);
8154 test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode, "[object]");
8155
8156 node2 = get_first_child((IUnknown*)node);
8157 ok(!node2, "node2 != NULL\n");
8158
8159 type = get_node_type((IUnknown*)node);
8160 ok(type == 3, "type=%d\n", type);
8161
8162 test_node_get_value_str((IUnknown*)node, "text test");
8163 test_node_put_value_str((IUnknown*)elem, "test text");
8164 test_node_get_value_str((IUnknown*)node, "text test");
8165
8166 hres = IHTMLDOMNode_get_attributes(node, &disp);
8167 ok(hres == S_OK, "get_attributes failed: %08x\n", hres);
8168 ok(!disp, "disp != NULL\n");
8169
8170 IHTMLDOMNode_Release(node);
8171 }
8172
8173 child_col = get_child_nodes((IUnknown*)elem);
8174 ok(child_col != NULL, "child_coll == NULL\n");
8175 if(child_col) {
8176 IUnknown *enum_unk;
8177 LONG length = 0;
8178
8179 test_disp((IUnknown*)child_col, &DIID_DispDOMChildrenCollection, "[object]");
8180
8181 hres = IHTMLDOMChildrenCollection_get_length(child_col, &length);
8182 ok(hres == S_OK, "get_length failed: %08x\n", hres);
8183 ok(length, "length=0\n");
8184
8185 node2 = NULL;
8186 node = get_child_item(child_col, 0);
8187 ok(node != NULL, "node == NULL\n");
8188 if(node) {
8189 IHTMLDOMNode *prev;
8190
8191 type = get_node_type((IUnknown*)node);
8192 ok(type == 3, "type=%d\n", type);
8193 node2 = node_get_next((IUnknown*)node);
8194
8195 prev = node_get_prev((IUnknown*)node2);
8196 ok(iface_cmp((IUnknown*)node, (IUnknown*)prev), "node != prev\n");
8197 IHTMLDOMNode_Release(prev);
8198
8199 IHTMLDOMNode_Release(node);
8200 }
8201
8202 node = get_child_item(child_col, 1);
8203 ok(node != NULL, "node == NULL\n");
8204 if(node) {
8205 type = get_node_type((IUnknown*)node);
8206 ok(type == 8, "type=%d\n", type);
8207
8208 test_elem_id((IUnknown*)node, NULL);
8209 ok(iface_cmp((IUnknown*)node2, (IUnknown*)node), "node2 != node\n");
8210 IHTMLDOMNode_Release(node2);
8211 IHTMLDOMNode_Release(node);
8212 }
8213
8214 hres = IHTMLDOMChildrenCollection_item(child_col, length - 1, NULL);
8215 ok(hres == E_POINTER, "item failed: %08x, expected E_POINTER\n", hres);
8216
8217 hres = IHTMLDOMChildrenCollection_item(child_col, length, NULL);
8218 ok(hres == E_POINTER, "item failed: %08x, expected E_POINTER\n", hres);
8219
8220 hres = IHTMLDOMChildrenCollection_item(child_col, 6000, &disp);
8221 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
8222
8223 hres = IHTMLDOMChildrenCollection_item(child_col, length, &disp);
8224 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
8225
8226 test_child_col_disp(child_col);
8227
8228 hres = IHTMLDOMChildrenCollection_get__newEnum(child_col, &enum_unk);
8229 ok(hres == S_OK, "get__newEnum failed: %08x\n", hres);
8230
8231 test_enum_children(enum_unk, length);
8232
8233 IUnknown_Release(enum_unk);
8234
8235 IHTMLDOMChildrenCollection_Release(child_col);
8236 }
8237
8238 test_elem3_get_disabled((IUnknown*)elem, VARIANT_FALSE);
8239 test_elem3_set_disabled((IUnknown*)elem, VARIANT_TRUE);
8240 test_elem3_set_disabled((IUnknown*)elem, VARIANT_FALSE);
8241
8242 IHTMLElement_Release(elem);
8243
8244 elem = get_doc_elem_by_id(doc, "frm");
8245 ok(elem != NULL, "elem == NULL\n");
8246 if(elem) {
8247 test_form_length((IUnknown*)elem, 0);
8248 test_form_elements((IUnknown*)elem);
8249 IHTMLElement_Release(elem);
8250 }
8251
8252 test_stylesheets(doc);
8253 test_create_option_elem(doc);
8254 test_create_img_elem(doc);
8255
8256 elem = get_doc_elem_by_id(doc, "tbl");
8257 ok(elem != NULL, "elem = NULL\n");
8258 test_elem_set_innertext(elem, "inner text");
8259 IHTMLElement_Release(elem);
8260
8261 test_doc_title(doc, "test");
8262 test_doc_set_title(doc, "test title");
8263 test_doc_title(doc, "test title");
8264
8265 disp = NULL;
8266 hres = IHTMLDocument2_get_Script(doc, &disp);
8267 ok(hres == S_OK, "get_Script failed: %08x\n", hres);
8268 if(hres == S_OK)
8269 {
8270 IDispatchEx *dispex;
8271 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
8272 ok(hres == S_OK, "IDispatch_QueryInterface failed: %08x\n", hres);
8273 if(hres == S_OK)
8274 {
8275 DISPID pid = -1;
8276 BSTR str = a2bstr("Testing");
8277 hres = IDispatchEx_GetDispID(dispex, str, 1, &pid);
8278 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
8279 ok(pid != -1, "pid == -1\n");
8280 SysFreeString(str);
8281 IDispatchEx_Release(dispex);
8282 }
8283 }
8284 IDispatch_Release(disp);
8285
8286 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
8287 ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
8288
8289 str = a2bstr("Img");
8290 hres = IHTMLDocument3_getElementsByTagName(doc3, str, &col);
8291 ok(hres == S_OK, "getElementsByTagName(%s) failed: %08x\n", wine_dbgstr_w(str), hres);
8292 SysFreeString(str);
8293 if(hres == S_OK)
8294 {
8295 static const elem_type_t img_types[] = { ET_IMG };
8296
8297 test_elem_collection((IUnknown*)col, img_types, sizeof(img_types)/sizeof(img_types[0]));
8298 IHTMLElementCollection_Release(col);
8299 }
8300
8301 elem = get_doc_elem_by_id(doc, "y");
8302 test_elem_set_innerhtml((IUnknown*)elem, "inner html");
8303 test_elem_innerhtml((IUnknown*)elem, "inner html");
8304 test_elem_set_innerhtml((IUnknown*)elem, "");
8305 test_elem_innerhtml((IUnknown*)elem, NULL);
8306 node = node_get_next((IUnknown*)elem);
8307 ok(!node, "node = %p\n", node);
8308
8309 elem2 = get_doc_elem_by_id(doc, "x");
8310 test_elem_tag((IUnknown*)elem2, "A");
8311 node = node_get_next((IUnknown*)elem2);
8312 IHTMLDOMNode_Release(node);
8313 IHTMLElement_Release(elem2);
8314 IHTMLElement_Release(elem);
8315
8316 hres = IHTMLDocument3_recalc(doc3, VARIANT_TRUE);
8317 ok(hres == S_OK, "recalc failed: %08x\n", hres);
8318
8319 IHTMLDocument3_Release(doc3);
8320
8321 elem = get_elem_by_id(doc, "s", TRUE);
8322 if(elem) {
8323 static const elem_type_t select_types[] = { ET_OPTION, ET_OPTION, ET_OPTION };
8324
8325 test_select_put_length((IUnknown*)elem, 3);
8326 test_elem_all((IUnknown*)elem, select_types, sizeof(select_types)/sizeof(*select_types));
8327 test_select_put_length((IUnknown*)elem, 1);
8328 test_elem_all((IUnknown*)elem, select_types, 1);
8329 IHTMLElement_Release(elem);
8330 }
8331
8332 window = get_doc_window(doc);
8333 test_window_name(window, NULL);
8334 set_window_name(window, "test name");
8335 test_window_length(window, 1);
8336 IHTMLWindow2_Release(window);
8337 }
8338
8339 static void test_attr(IHTMLElement *elem)
8340 {
8341 IHTMLDOMAttribute *attr, *attr2;
8342 VARIANT v;
8343
8344 get_elem_attr_node((IUnknown*)elem, "noattr", FALSE);
8345
8346 attr = get_elem_attr_node((IUnknown*)elem, "id", TRUE);
8347
8348 test_disp((IUnknown*)attr, &DIID_DispHTMLDOMAttribute, "[object]");
8349 test_ifaces((IUnknown*)attr, attr_iids);
8350 test_no_iface((IUnknown*)attr, &IID_IHTMLDOMNode);
8351 test_attr_specified(attr, VARIANT_TRUE);
8352
8353 attr2 = get_elem_attr_node((IUnknown*)elem, "id", TRUE);
8354 ok(iface_cmp((IUnknown*)attr, (IUnknown*)attr2), "attr != attr2\n");
8355 IHTMLDOMAttribute_Release(attr2);
8356
8357 get_attr_node_value(attr, &v, VT_BSTR);
8358 ok(!strcmp_wa(V_BSTR(&v), "divid"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
8359 VariantClear(&v);
8360
8361 V_VT(&v) = VT_BSTR;
8362 V_BSTR(&v) = a2bstr("divid2");
8363 put_attr_node_value(attr, v);
8364
8365 get_attr_node_value(attr, &v, VT_BSTR);
8366 ok(!strcmp_wa(V_BSTR(&v), "divid2"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
8367 VariantClear(&v);
8368
8369 IHTMLDOMAttribute_Release(attr);
8370
8371 attr = get_elem_attr_node((IUnknown*)elem, "emptyattr", TRUE);
8372 get_attr_node_value(attr, &v, VT_BSTR);
8373 ok(!V_BSTR(&v), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
8374 VariantClear(&v);
8375
8376 V_VT(&v) = VT_BSTR;
8377 V_BSTR(&v) = a2bstr("newvalue");
8378 put_attr_node_value(attr, v);
8379 VariantClear(&v);
8380
8381 attr = get_elem_attr_node((IUnknown*)elem, "emptyattr", TRUE);
8382 get_attr_node_value(attr, &v, VT_BSTR);
8383 ok(!strcmp_wa(V_BSTR(&v), "newvalue"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
8384 VariantClear(&v);
8385
8386 test_attr_specified(attr, VARIANT_TRUE);
8387 IHTMLDOMAttribute_Release(attr);
8388
8389 V_VT(&v) = VT_I4;
8390 V_I4(&v) = 100;
8391 set_dispex_value((IUnknown*)elem, "dispprop", &v);
8392 attr = get_elem_attr_node((IUnknown*)elem, "dispprop", TRUE);
8393 get_attr_node_value(attr, &v, VT_I4);
8394 ok(V_I4(&v) == 100, "V_I4(v) = %d\n", V_I4(&v));
8395 test_attr_specified(attr, VARIANT_TRUE);
8396
8397 V_VT(&v) = VT_I4;
8398 V_I4(&v) = 150;
8399 put_attr_node_value(attr, v);
8400
8401 get_attr_node_value(attr, &v, VT_I4);
8402 ok(V_I4(&v) == 150, "V_I4(v) = %d\n", V_I4(&v));
8403
8404 IHTMLDOMAttribute_Release(attr);
8405
8406 attr = get_elem_attr_node((IUnknown*)elem, "tabIndex", TRUE);
8407 test_attr_specified(attr, VARIANT_FALSE);
8408 test_attr_expando(attr, VARIANT_FALSE);
8409 IHTMLDOMAttribute_Release(attr);
8410 }
8411
8412 static void test_blocked(IHTMLDocument2 *doc, IHTMLElement *outer_elem)
8413 {
8414 IHTMLElement *elem;
8415
8416 test_elem_set_innerhtml((IUnknown*)outer_elem,
8417 "<img id=\"imgid\" src=\"BLOCKED::http://www.winehq.org/img.png\" />");
8418 elem = get_elem_by_id(doc, "imgid", TRUE);
8419 if(elem) {
8420 test_img_src((IUnknown*)elem, "BLOCKED::", "blocked::http://www.winehq.org/img.png");
8421 IHTMLElement_Release(elem);
8422 }
8423
8424 test_elem_set_innerhtml((IUnknown*)outer_elem,
8425 "<img id=\"imgid\" src=\"BLOCKE::http://www.winehq.org/img.png\" />");
8426 elem = get_elem_by_id(doc, "imgid", TRUE);
8427 if(elem) {
8428 test_img_src((IUnknown*)elem, "blocke::http://www.winehq.org/img.png", NULL);
8429 test_img_set_src((IUnknown*)elem, "BLOCKED:http://www.winehq.org/img.png");
8430 test_img_src((IUnknown*)elem, "blocked:http://www.winehq.org/img.png", NULL);
8431 test_img_set_src((IUnknown*)elem, "blocked::http://www.winehq.org/img.png");
8432 test_img_src((IUnknown*)elem, "BLOCKED::", "blocked::http://www.winehq.org/img.png");
8433 IHTMLElement_Release(elem);
8434 }
8435 }
8436
8437 #define doc_get_elems_by_name(a,b) _doc_get_elems_by_name(__LINE__,a,b)
8438 static IHTMLElementCollection *_doc_get_elems_by_name(unsigned line, IHTMLDocument2 *doc, const char *name)
8439 {
8440 IHTMLDocument3 *doc3 = _get_doc3_iface(line, doc);
8441 IHTMLElementCollection *col;
8442 BSTR str = a2bstr(name);
8443 HRESULT hres;
8444
8445 hres = IHTMLDocument3_getElementsByName(doc3, str, &col);
8446 ok_(__FILE__,line)(hres == S_OK, "getElementsByName failed: %08x\n", hres);
8447 ok_(__FILE__,line)(col != NULL, "col = NULL\n");
8448
8449 IHTMLDocument3_Release(doc3);
8450 SysFreeString(str);
8451 return col;
8452 }
8453
8454 static void test_elem_names(IHTMLDocument2 *doc)
8455 {
8456 IHTMLElementCollection *col;
8457 IHTMLElement *body;
8458 LONG len;
8459 HRESULT hres;
8460
8461 static const elem_type_t test1_types[] = {ET_INPUT, ET_A, ET_DIV};
8462
8463 body = doc_get_body(doc);
8464
8465 test_elem_set_innerhtml((IUnknown*)body,
8466 "<input name=\"test\"><a name=\"test\"></a><a name=\"xxx\"></a><div id=\"test\"></div>");
8467 col = doc_get_elems_by_name(doc, "test");
8468 test_elem_collection((IUnknown*)col, test1_types, sizeof(test1_types)/sizeof(*test1_types));
8469 IHTMLElementCollection_Release(col);
8470
8471 col = doc_get_elems_by_name(doc, "yyy");
8472 test_elem_collection((IUnknown*)col, NULL, 0);
8473 IHTMLElementCollection_Release(col);
8474
8475 /* case insensivity test */
8476 col = doc_get_elems_by_name(doc, "Xxx");
8477 hres = IHTMLElementCollection_get_length(col, &len);
8478 ok(hres == S_OK, "get_length failed: %08x\n", hres);
8479 todo_wine ok(len == 1, "len = %d\n", len);
8480 IHTMLElementCollection_Release(col);
8481
8482 IHTMLElement_Release(body);
8483 }
8484
8485 static void test_elems2(IHTMLDocument2 *doc)
8486 {
8487 IHTMLElement *elem, *elem2, *div;
8488
8489 static const elem_type_t outer_types[] = {
8490 ET_BR,
8491 ET_A
8492 };
8493
8494 div = get_doc_elem_by_id(doc, "divid");
8495
8496 elem = get_elem_by_id(doc, "linkid", TRUE);
8497 if(elem) {
8498 test_link_disabled(elem, VARIANT_FALSE);
8499 test_link_rel(elem, "stylesheet");
8500 test_link_rev(elem, NULL);
8501 test_link_type(elem, "text/css");
8502 test_link_href(elem, "about:blank");
8503 test_link_media(elem, "all");
8504 link_put_disabled(elem, VARIANT_TRUE);
8505 link_put_rel(elem, "prev");
8506 link_put_rev(elem, "next");
8507 link_put_type(elem, "text/plain");
8508 link_put_href(elem, "about:prev");
8509 IHTMLElement_Release(elem);
8510 }
8511
8512 test_elem_set_innerhtml((IUnknown*)div, "<div id=\"innerid\"></div>");
8513 elem2 = get_doc_elem_by_id(doc, "innerid");
8514 ok(elem2 != NULL, "elem2 == NULL\n");
8515 test_elem_set_outerhtml((IUnknown*)elem2, "<br><a href=\"about:blank\" id=\"aid\">a</a>");
8516 test_elem_all((IUnknown*)div, outer_types, sizeof(outer_types)/sizeof(*outer_types));
8517 IHTMLElement_Release(elem2);
8518
8519 elem2 = get_doc_elem_by_id(doc, "aid");
8520 ok(elem2 != NULL, "elem2 == NULL\n");
8521 test_elem_set_outerhtml((IUnknown*)elem2, "");
8522 test_elem_all((IUnknown*)div, outer_types, 1);
8523 IHTMLElement_Release(elem2);
8524
8525 test_elem_set_innerhtml((IUnknown*)div, "<textarea id=\"ta\"></textarea>");
8526 elem = get_elem_by_id(doc, "ta", TRUE);
8527 if(elem) {
8528 IHTMLFormElement *form;
8529
8530 test_textarea_value((IUnknown*)elem, NULL);
8531 test_textarea_put_value((IUnknown*)elem, "test");
8532 test_textarea_defaultvalue((IUnknown*)elem, NULL);
8533 test_textarea_put_defaultvalue((IUnknown*)elem, "defval text");
8534 test_textarea_put_value((IUnknown*)elem, "test");
8535 test_textarea_readonly((IUnknown*)elem, VARIANT_FALSE);
8536 test_textarea_put_readonly((IUnknown*)elem, VARIANT_TRUE);
8537 test_textarea_put_readonly((IUnknown*)elem, VARIANT_FALSE);
8538 test_textarea_type((IUnknown*)elem);
8539
8540 form = get_textarea_form((IUnknown*)elem);
8541 ok(!form, "form = %p\n", form);
8542
8543 test_elem_istextedit(elem, VARIANT_TRUE);
8544
8545 IHTMLElement_Release(elem);
8546 }
8547
8548 test_elem_set_innerhtml((IUnknown*)div, "<textarea id=\"ta\">default text</textarea>");
8549 elem = get_elem_by_id(doc, "ta", TRUE);
8550 if(elem) {
8551 test_textarea_defaultvalue((IUnknown*)elem, "default text");
8552 IHTMLElement_Release(elem);
8553 }
8554
8555 test_elem_set_innerhtml((IUnknown*)div, "<form id=\"fid\"><textarea id=\"ta\"></textarea></form>");
8556 elem = get_elem_by_id(doc, "ta", TRUE);
8557 if(elem) {
8558 IHTMLFormElement *form;
8559
8560 elem2 = get_elem_by_id(doc, "fid", TRUE);
8561 ok(elem2 != NULL, "elem2 == NULL\n");
8562
8563 form = get_textarea_form((IUnknown*)elem);
8564 ok(form != NULL, "form = NULL\n");
8565 ok(iface_cmp((IUnknown*)form, (IUnknown*)elem2), "form != elem2\n");
8566
8567 IHTMLFormElement_Release(form);
8568 IHTMLElement_Release(elem2);
8569 IHTMLElement_Release(elem);
8570 }
8571
8572 test_elem_set_innerhtml((IUnknown*)div,
8573 "<input value=\"val\" id =\"inputid\" />");
8574 elem = get_elem_by_id(doc, "inputid", TRUE);
8575 if(elem) {
8576 test_input_defaultValue((IUnknown*)elem, "val");
8577 test_input_put_value((IUnknown*)elem, "test");
8578 test_input_put_defaultValue((IUnknown*)elem, "new val");
8579 test_input_value((IUnknown*)elem, "test");
8580 IHTMLElement_Release(elem);
8581 }
8582
8583 test_elem_set_innerhtml((IUnknown*)div, "");
8584 test_insert_adjacent_elems(doc, div);
8585
8586 test_elem_set_innerhtml((IUnknown*)div,
8587 "<form id=\"form\"><input type=\"button\" /><div><input type=\"text\" id=\"inputid\"/></div></textarea>");
8588 elem = get_elem_by_id(doc, "form", TRUE);
8589 if(elem) {
8590 test_form_length((IUnknown*)elem, 2);
8591 test_form_item(elem);
8592 test_form_action((IUnknown*)elem, NULL);
8593 test_form_put_action((IUnknown*)elem, "about:blank");
8594 test_form_method((IUnknown*)elem, "get");
8595 test_form_put_method((IUnknown*)elem, S_OK, "post");
8596 test_form_put_method((IUnknown*)elem, E_INVALIDARG, "put");
8597 test_form_method((IUnknown*)elem, "post");
8598 test_form_name((IUnknown*)elem, NULL);
8599 test_form_put_name((IUnknown*)elem, "Name");
8600 test_form_encoding((IUnknown*)elem, "application/x-www-form-urlencoded");
8601 test_form_put_encoding((IUnknown*)elem, S_OK, "text/plain");
8602 test_form_put_encoding((IUnknown*)elem, S_OK, "multipart/form-data");
8603 test_form_put_encoding((IUnknown*)elem, E_INVALIDARG, "image/png");
8604 test_form_encoding((IUnknown*)elem, "multipart/form-data");
8605 test_form_elements((IUnknown*)elem);
8606 test_form_reset((IUnknown*)elem);
8607 test_form_target((IUnknown*)elem);
8608 IHTMLElement_Release(elem);
8609
8610 elem = get_elem_by_id(doc, "inputid", TRUE);
8611 test_input_get_form((IUnknown*)elem, "form");
8612 IHTMLElement_Release(elem);
8613 }
8614
8615 test_elem_set_innerhtml((IUnknown*)div,
8616 "<form id=\"form\" name=\"form_name\"><select id=\"sform\"><option id=\"oform\"></option></select></form>");
8617 elem = get_elem_by_id(doc, "sform", TRUE);
8618 elem2 = get_elem_by_id(doc, "form", TRUE);
8619 if(elem && elem2) {
8620 test_select_form((IUnknown*)elem, (IUnknown*)elem2);
8621 IHTMLElement_Release(elem);
8622
8623 elem = get_elem_by_id(doc, "oform", TRUE);
8624 if(elem) {
8625 test_option_form((IUnknown*)elem, (IUnknown*)elem2);
8626 IHTMLElement_Release(elem);
8627 }
8628 IHTMLElement_Release(elem2);
8629 }
8630
8631 test_attr(div);
8632 test_blocked(doc, div);
8633 test_elem_names(doc);
8634
8635 IHTMLElement_Release(div);
8636 }
8637
8638 static void test_create_elems(IHTMLDocument2 *doc)
8639 {
8640 IHTMLElement *elem, *body, *elem2;
8641 IHTMLDOMNode *node, *node2, *node3, *comment;
8642 IHTMLDOMAttribute *attr;
8643 IHTMLDocument5 *doc5;
8644 IDispatch *disp;
8645 VARIANT var;
8646 LONG type;
8647 HRESULT hres;
8648 BSTR str;
8649
8650 static const elem_type_t types1[] = { ET_TESTG };
8651
8652 elem = test_create_elem(doc, "TEST");
8653 test_elem_tag((IUnknown*)elem, "TEST");
8654 type = get_node_type((IUnknown*)elem);
8655 ok(type == 1, "type=%d\n", type);
8656 test_ifaces((IUnknown*)elem, elem_iids);
8657 test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement, "[object]");
8658 test_elem_source_index(elem, -1);
8659
8660 body = doc_get_body(doc);
8661 test_node_has_child((IUnknown*)body, VARIANT_FALSE);
8662
8663 node = test_node_append_child((IUnknown*)body, (IUnknown*)elem);
8664 test_node_has_child((IUnknown*)body, VARIANT_TRUE);
8665 elem2 = get_elem_iface((IUnknown*)node);
8666 IHTMLElement_Release(elem2);
8667
8668 hres = IHTMLElement_get_all(body, &disp);
8669 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8670 test_elem_collection((IUnknown*)disp, types1, sizeof(types1)/sizeof(types1[0]));
8671 IDispatch_Release(disp);
8672
8673 test_node_remove_child((IUnknown*)body, node);
8674
8675 hres = IHTMLElement_get_all(body, &disp);
8676 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8677 test_elem_collection((IUnknown*)disp, NULL, 0);
8678 IDispatch_Release(disp);
8679 test_node_has_child((IUnknown*)body, VARIANT_FALSE);
8680
8681 IHTMLElement_Release(elem);
8682 IHTMLDOMNode_Release(node);
8683
8684 node = test_create_text(doc, "abc");
8685 test_ifaces((IUnknown*)node, text_iids);
8686 test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode, "[object]");
8687 test_text_length((IUnknown*)node, 3);
8688 test_text_data((IUnknown*)node, "abc");
8689 set_text_data((IUnknown*)node, "test");
8690 test_text_data((IUnknown*)node, "test");
8691 text_append_data((IUnknown*)node, " append");
8692 test_text_data((IUnknown*)node, "test append");
8693 text_append_data((IUnknown*)node, NULL);
8694 test_text_data((IUnknown*)node, "test append");
8695 set_text_data((IUnknown*)node, "test");
8696
8697 V_VT(&var) = VT_NULL;
8698 node2 = test_node_insertbefore((IUnknown*)body, node, &var);
8699 IHTMLDOMNode_Release(node);
8700
8701 node = test_create_text(doc, "insert ");
8702
8703 V_VT(&var) = VT_DISPATCH;
8704 V_DISPATCH(&var) = (IDispatch*)node2;
8705 node3 = test_node_insertbefore((IUnknown*)body, node, &var);
8706 IHTMLDOMNode_Release(node);
8707 IHTMLDOMNode_Release(node2);
8708 IHTMLDOMNode_Release(node3);
8709
8710 test_elem_innertext(body, "insert test");
8711 test_elem_innerhtml((IUnknown*)body, "insert test");
8712
8713 node = test_create_text(doc, " Test");
8714 V_VT(&var) = VT_DISPATCH;
8715 V_DISPATCH(&var) = NULL;
8716 test_node_insertbefore((IUnknown*)body, node, &var);
8717 test_elem_innertext(body, "insert test Test");
8718 IHTMLDOMNode_Release(node);
8719
8720 doc5 = get_htmldoc5_iface((IUnknown*)doc);
8721 if(doc5) {
8722 str = a2bstr("testing");
8723 hres = IHTMLDocument5_createComment(doc5, str, &comment);
8724 SysFreeString(str);
8725 ok(hres == S_OK, "createComment failed: %08x\n", hres);
8726 if(hres == S_OK)
8727 {
8728 type = get_node_type((IUnknown*)comment);
8729 ok(type == 8, "type=%d, expected 8\n", type);
8730
8731 test_node_get_value_str((IUnknown*)comment, "testing");
8732 test_elem_title((IUnknown*)comment, NULL);
8733 test_elem_set_title((IUnknown*)comment, "comment title");
8734 test_elem_title((IUnknown*)comment, "comment title");
8735 test_comment_text((IUnknown*)comment, "<!--testing-->");
8736 test_elem_outerhtml((IUnknown*)comment, "<!--testing-->");
8737 test_comment_attrs((IUnknown*)comment);
8738
8739 IHTMLDOMNode_Release(comment);
8740 }
8741
8742 str = a2bstr("Test");
8743 hres = IHTMLDocument5_createAttribute(doc5, str, &attr);
8744 ok(hres == S_OK, "createAttribute dailed: %08x\n", hres);
8745 SysFreeString(str);
8746 if(SUCCEEDED(hres)) {
8747 test_disp((IUnknown*)attr, &DIID_DispHTMLDOMAttribute, "[object]");
8748 test_ifaces((IUnknown*)attr, attr_iids);
8749 test_no_iface((IUnknown*)attr, &IID_IHTMLDOMNode);
8750
8751 test_attr_node_name(attr, "Test");
8752
8753 IHTMLDOMAttribute_Release(attr);
8754 }
8755
8756 IHTMLDocument5_Release(doc5);
8757 }
8758
8759 IHTMLElement_Release(body);
8760 }
8761
8762 static void test_replacechild_elems(IHTMLDocument2 *doc)
8763 {
8764 IHTMLElement *body;
8765 IHTMLDOMNode *node, *node2, *node3;
8766 IHTMLDOMNode *nodeBody, *nodeNew;
8767 HRESULT hres;
8768 VARIANT var;
8769
8770 body = doc_get_body(doc);
8771
8772 node = test_create_text(doc, "insert");
8773
8774 V_VT(&var) = VT_NULL;
8775 V_DISPATCH(&var) = NULL;
8776 node2 = test_node_insertbefore((IUnknown*)body, node, &var);
8777 IHTMLDOMNode_Release(node);
8778
8779 test_elem_innertext(body, "insert");
8780
8781 node3 = test_create_text(doc, "replaced");
8782
8783 nodeBody = _get_node_iface(__LINE__, (IUnknown *)body);
8784
8785 hres = IHTMLDOMNode_replaceChild(nodeBody, node3, node2, &nodeNew);
8786 ok(hres == S_OK, "Expected S_OK, got 0x%08x\n", hres);
8787
8788 test_elem_innertext(body, "replaced");
8789
8790 IHTMLDOMNode_Release(node2);
8791 IHTMLDOMNode_Release(node3);
8792 IHTMLDOMNode_Release(nodeBody);
8793
8794 IHTMLElement_Release(body);
8795 }
8796
8797 static void test_noscript(IHTMLDocument2 *doc)
8798 {
8799 IHTMLElementCollection *col;
8800 IHTMLElement *body;
8801 HRESULT hres;
8802
8803 static const elem_type_t all_types[] = {
8804 ET_HTML,
8805 ET_HEAD,
8806 ET_TITLE,
8807 ET_NOSCRIPT,
8808 ET_BODY,
8809 ET_NOSCRIPT
8810 };
8811
8812 static const elem_type_t body_all_types[] = {
8813 ET_DIV,
8814 ET_NOSCRIPT
8815 };
8816
8817 hres = IHTMLDocument2_get_all(doc, &col);
8818 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8819 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
8820 IHTMLElementCollection_Release(col);
8821
8822 body = doc_get_body(doc);
8823 test_elem_set_innerhtml((IUnknown*)body, "<div>test</div><noscript><a href=\"about:blank\">A</a></noscript>");
8824 test_elem_all((IUnknown*)body, body_all_types, sizeof(body_all_types)/sizeof(*body_all_types));
8825 IHTMLElement_Release(body);
8826 }
8827
8828 static void test_doctype(IHTMLDocument2 *doc)
8829 {
8830 IHTMLDocument2 *doc_node;
8831 IHTMLDOMNode *doctype;
8832 int type;
8833
8834 doc_node = get_doc_node(doc);
8835 doctype = get_first_child((IUnknown*)doc_node);
8836 IHTMLDocument2_Release(doc_node);
8837
8838 type = get_node_type((IUnknown*)doctype);
8839 ok(type == 8, "type = %d\n", type);
8840
8841 test_comment_text((IUnknown*)doctype, "<!DOCTYPE html>");
8842 test_elem_type((IUnknown*)doctype, ET_COMMENT);
8843 IHTMLDOMNode_Release(doctype);
8844 }
8845
8846 static void test_null_write(IHTMLDocument2 *doc)
8847 {
8848 HRESULT hres;
8849
8850 doc_write(doc, FALSE, NULL);
8851 doc_write(doc, TRUE, NULL);
8852
8853 hres = IHTMLDocument2_write(doc, NULL);
8854 ok(hres == S_OK,
8855 "Expected IHTMLDocument2::write to return S_OK, got 0x%08x\n", hres);
8856
8857 hres = IHTMLDocument2_writeln(doc, NULL);
8858 ok(hres == S_OK,
8859 "Expected IHTMLDocument2::writeln to return S_OK, got 0x%08x\n", hres);
8860 }
8861
8862 static void test_create_stylesheet(IHTMLDocument2 *doc)
8863 {
8864 IHTMLStyleSheet *stylesheet, *stylesheet2;
8865 IHTMLStyleElement *style_elem;
8866 IHTMLElement *doc_elem, *elem;
8867 HRESULT hres;
8868
8869 static const elem_type_t all_types[] = {
8870 ET_HTML,
8871 ET_HEAD,
8872 ET_TITLE,
8873 ET_BODY,
8874 ET_DIV
8875 };
8876
8877 static const elem_type_t all_types2[] = {
8878 ET_HTML,
8879 ET_HEAD,
8880 ET_TITLE,
8881 ET_STYLE,
8882 ET_BODY,
8883 ET_DIV
8884 };
8885
8886 test_doc_all(doc, all_types, sizeof(all_types)/sizeof(*all_types));
8887
8888 hres = IHTMLDocument2_createStyleSheet(doc, NULL, -1, &stylesheet);
8889 ok(hres == S_OK, "createStyleSheet failed: %08x\n", hres);
8890
8891 test_doc_all(doc, all_types2, sizeof(all_types2)/sizeof(*all_types2));
8892
8893 doc_elem = get_doc_elem(doc);
8894
8895 test_elem_getelembytag((IUnknown*)doc_elem, ET_STYLE, 1, &elem);
8896 IHTMLElement_Release(doc_elem);
8897
8898 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLStyleElement, (void**)&style_elem);
8899 IHTMLElement_Release(elem);
8900 ok(hres == S_OK, "Could not get IHTMLStyleElement iface: %08x\n", hres);
8901
8902 stylesheet2 = NULL;
8903 hres = IHTMLStyleElement_get_styleSheet(style_elem, &stylesheet2);
8904 ok(hres == S_OK, "get_styleSheet failed: %08x\n", hres);
8905 ok(stylesheet2 != NULL, "stylesheet2 == NULL\n");
8906 ok(iface_cmp((IUnknown*)stylesheet, (IUnknown*)stylesheet2), "stylesheet != stylesheet2\n");
8907
8908 IHTMLStyleSheet_Release(stylesheet2);
8909 IHTMLStyleSheet_Release(stylesheet);
8910
8911 IHTMLStyleElement_Release(style_elem);
8912 }
8913
8914 static void test_exec(IUnknown *unk, const GUID *grpid, DWORD cmdid, VARIANT *in, VARIANT *out)
8915 {
8916 IOleCommandTarget *cmdtrg;
8917 HRESULT hres;
8918
8919 hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
8920 ok(hres == S_OK, "Could not get IOleCommandTarget interface: %08x\n", hres);
8921
8922 hres = IOleCommandTarget_Exec(cmdtrg, grpid, cmdid, 0, in, out);
8923 ok(hres == S_OK, "Exec failed: %08x\n", hres);
8924
8925 IOleCommandTarget_Release(cmdtrg);
8926 }
8927
8928 static void test_indent(IHTMLDocument2 *doc)
8929 {
8930 IHTMLElementCollection *col;
8931 IHTMLTxtRange *range;
8932 HRESULT hres;
8933
8934 static const elem_type_t all_types[] = {
8935 ET_HTML,
8936 ET_HEAD,
8937 ET_TITLE,
8938 ET_BODY,
8939 ET_BR,
8940 ET_A,
8941 };
8942
8943 static const elem_type_t indent_types[] = {
8944 ET_HTML,
8945 ET_HEAD,
8946 ET_TITLE,
8947 ET_BODY,
8948 ET_BLOCKQUOTE,
8949 ET_P,
8950 ET_BR,
8951 ET_A,
8952 };
8953
8954 hres = IHTMLDocument2_get_all(doc, &col);
8955 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8956 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
8957 IHTMLElementCollection_Release(col);
8958
8959 range = test_create_body_range(doc);
8960 test_exec((IUnknown*)range, &CGID_MSHTML, IDM_INDENT, NULL, NULL);
8961 IHTMLTxtRange_Release(range);
8962
8963 hres = IHTMLDocument2_get_all(doc, &col);
8964 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8965 test_elem_collection((IUnknown*)col, indent_types, sizeof(indent_types)/sizeof(indent_types[0]));
8966 IHTMLElementCollection_Release(col);
8967 }
8968
8969 static void test_cond_comment(IHTMLDocument2 *doc)
8970 {
8971 IHTMLElementCollection *col;
8972 HRESULT hres;
8973
8974 static const elem_type_t all_types[] = {
8975 ET_HTML,
8976 ET_HEAD,
8977 ET_TITLE,
8978 ET_BODY,
8979 ET_BR
8980 };
8981
8982 hres = IHTMLDocument2_get_all(doc, &col);
8983 ok(hres == S_OK, "get_all failed: %08x\n", hres);
8984 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
8985 IHTMLElementCollection_Release(col);
8986 }
8987
8988 static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
8989 {
8990 ok(IsEqualGUID(riid, &IID_IServiceProvider), "riid = %s\n", wine_dbgstr_guid(riid));
8991 return E_NOINTERFACE;
8992 }
8993
8994 static ULONG WINAPI Unknown_AddRef(IUnknown *iface)
8995 {
8996 return 2;
8997 }
8998
8999 static ULONG WINAPI Unknown_Release(IUnknown *iface)
9000 {
9001 return 1;
9002 }
9003
9004 static const IUnknownVtbl UnknownVtbl = {
9005 Unknown_QueryInterface,
9006 Unknown_AddRef,
9007 Unknown_Release,
9008 };
9009 static IUnknown obj_ident_test = { &UnknownVtbl };
9010
9011 static void test_frame(IDispatch *disp, const char *exp_id)
9012 {
9013 IHTMLWindow2 *frame2, *parent, *top;
9014 IHTMLDocument2 *parent_doc, *top_doc;
9015 IHTMLWindow4 *frame;
9016 IHTMLFrameBase *frame_elem;
9017 IObjectIdentity *obj_ident;
9018 ITravelLogClient *tlc;
9019 HRESULT hres;
9020
9021 hres = IDispatch_QueryInterface(disp, &IID_IHTMLWindow4, (void**)&frame);
9022 ok(hres == S_OK, "Could not get IHTMLWindow4 interface: 0x%08x\n", hres);
9023 if(FAILED(hres))
9024 return;
9025
9026 hres = IHTMLWindow4_get_frameElement(frame, &frame_elem);
9027 ok(hres == S_OK, "IHTMLWindow4_get_frameElement failed: 0x%08x\n", hres);
9028 IHTMLWindow4_Release(frame);
9029 if(FAILED(hres))
9030 return;
9031
9032 test_elem_type((IUnknown*)frame_elem, ET_FRAME);
9033 test_frame_doc((IUnknown*)frame_elem, FALSE);
9034 test_elem_id((IUnknown*)frame_elem, exp_id);
9035 IHTMLFrameBase_Release(frame_elem);
9036
9037 hres = IDispatch_QueryInterface(disp, &IID_IHTMLWindow2, (void**)&frame2);
9038 ok(hres == S_OK, "Could not get IHTMLWindow2 interface: 0x%08x\n", hres);
9039 if(FAILED(hres))
9040 return;
9041
9042 hres = IHTMLWindow2_get_parent(frame2, &parent);
9043 ok(hres == S_OK, "IHTMLWindow2_get_parent failed: 0x%08x\n", hres);
9044 if(FAILED(hres)){
9045 IHTMLWindow2_Release(frame2);
9046 return;
9047 }
9048
9049 hres = IHTMLWindow2_QueryInterface(frame2, &IID_IObjectIdentity, (void**)&obj_ident);
9050 ok(hres == S_OK, "Could not get IObjectIdentity interface: %08x\n", hres);
9051 hres = IHTMLWindow2_QueryInterface(frame2, &IID_ITravelLogClient, (void**)&tlc);
9052 if(hres == E_NOINTERFACE) {
9053 win_skip("IID_ITravelLogClient not available\n");
9054 tlc = NULL;
9055 }else {
9056 ok(hres == S_OK, "Could not get ITravelLogClient interface: %08x\n", hres);
9057
9058 hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)tlc);
9059 ok(hres == S_OK, "IsEqualObject returned: 0x%08x\n", hres);
9060 ITravelLogClient_Release(tlc);
9061 }
9062
9063 hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)obj_ident);
9064 ok(hres == S_OK, "IsEqualObject returned: 0x%08x\n", hres);
9065 hres = IObjectIdentity_IsEqualObject(obj_ident, (IUnknown*)parent);
9066 ok(hres == S_FALSE, "IsEqualObject returned: 0x%08x\n", hres);
9067 hres = IObjectIdentity_IsEqualObject(obj_ident, &obj_ident_test);
9068 ok(hres == E_NOINTERFACE, "IsEqualObject returned: 0x%08x\n", hres);
9069
9070 IObjectIdentity_Release(obj_ident);
9071
9072 hres = IHTMLWindow2_get_document(parent, &parent_doc);
9073 ok(hres == S_OK, "IHTMLWindow2_get_document failed: 0x%08x\n", hres);
9074 IHTMLWindow2_Release(parent);
9075 if(FAILED(hres)){
9076 IHTMLWindow2_Release(frame2);
9077 return;
9078 }
9079
9080 test_doc_title(parent_doc, "frameset test");
9081 IHTMLDocument2_Release(parent_doc);
9082
9083 /* test get_top */
9084 hres = IHTMLWindow2_get_top(frame2, &top);
9085 ok(hres == S_OK, "IHTMLWindow2_get_top failed: 0x%08x\n", hres);
9086 IHTMLWindow2_Release(frame2);
9087 if(FAILED(hres))
9088 return;
9089
9090 hres = IHTMLWindow2_get_document(top, &top_doc);
9091 ok(hres == S_OK, "IHTMLWindow2_get_document failed: 0x%08x\n", hres);
9092 IHTMLWindow2_Release(top);
9093 if(FAILED(hres))
9094 return;
9095
9096 test_doc_title(top_doc, "frameset test");
9097 IHTMLDocument2_Release(top_doc);
9098 }
9099
9100 static void test_frames_collection(IHTMLFramesCollection2 *frames, const char *frid)
9101 {
9102 VARIANT index_var, result_var;
9103 LONG length;
9104 HRESULT hres;
9105
9106 /* test result length */
9107 hres = IHTMLFramesCollection2_get_length(frames, &length);
9108 ok(hres == S_OK, "IHTMLFramesCollection2_get_length failed: 0x%08x\n", hres);
9109 ok(length == 3, "IHTMLFramesCollection2_get_length should have been 3, was: %d\n", length);
9110
9111 /* test first frame */
9112 V_VT(&index_var) = VT_I4;
9113 V_I4(&index_var) = 0;
9114 hres = IHTMLFramesCollection2_item(frames, &index_var, &result_var);
9115 ok(hres == S_OK, "IHTMLFramesCollection2_item failed: 0x%08x\n", hres);
9116 if(SUCCEEDED(hres)) {
9117 ok(V_VT(&result_var) == VT_DISPATCH, "result type should have been VT_DISPATCH, was: 0x%x\n", V_VT(&result_var));
9118 test_frame((IDispatch*)V_DISPATCH(&result_var), "fr1");
9119 }
9120 VariantClear(&result_var);
9121
9122 /* test second frame */
9123 V_I4(&index_var) = 1;
9124 hres = IHTMLFramesCollection2_item(frames, &index_var, &result_var);
9125 ok(hres == S_OK, "IHTMLFramesCollection2_item failed: 0x%08x\n", hres);
9126 if(SUCCEEDED(hres)) {
9127 ok(V_VT(&result_var) == VT_DISPATCH, "result type should have been VT_DISPATCH, was: 0x%x\n", V_VT(&result_var));
9128 test_frame((IDispatch*)V_DISPATCH(&result_var), "fr2");
9129 }
9130 VariantClear(&result_var);
9131
9132 /* fail on next frame */
9133 V_I4(&index_var) = 3;
9134 hres = IHTMLFramesCollection2_item(frames, &index_var, &result_var);
9135 ok(hres == DISP_E_MEMBERNOTFOUND, "IHTMLFramesCollection2_item should have"
9136 "failed with DISP_E_MEMBERNOTFOUND, instead: 0x%08x\n", hres);
9137 VariantClear(&result_var);
9138
9139 /* string argument (element id lookup) */
9140 V_VT(&index_var) = VT_BSTR;
9141 V_BSTR(&index_var) = a2bstr(frid);
9142 hres = IHTMLFramesCollection2_item(frames, &index_var, &result_var);
9143 ok(hres == S_OK, "IHTMLFramesCollection2_item failed: 0x%08x\n", hres);
9144 if(SUCCEEDED(hres)) {
9145 ok(V_VT(&result_var) == VT_DISPATCH, "result type should have been VT_DISPATCH, was: 0x%x\n", V_VT(&result_var));
9146 test_frame(V_DISPATCH(&result_var), frid);
9147 }
9148 VariantClear(&result_var);
9149 VariantClear(&index_var);
9150
9151 /* invalid argument */
9152 V_VT(&index_var) = VT_BOOL;
9153 V_BOOL(&index_var) = VARIANT_TRUE;
9154 hres = IHTMLFramesCollection2_item(frames, &index_var, &result_var);
9155 ok(hres == E_INVALIDARG, "IHTMLFramesCollection2_item should have"
9156 "failed with E_INVALIDARG, instead: 0x%08x\n", hres);
9157 VariantClear(&result_var);
9158 }
9159
9160 static void test_frameset(IHTMLDocument2 *doc)
9161 {
9162 IHTMLWindow2 *window;
9163 IHTMLFramesCollection2 *frames;
9164 IHTMLElement *elem;
9165 HRESULT hres;
9166
9167 window = get_doc_window(doc);
9168
9169 /* test using IHTMLFramesCollection object */
9170
9171 hres = IHTMLWindow2_get_frames(window, &frames);
9172 ok(hres == S_OK, "IHTMLWindow2_get_frames failed: 0x%08x\n", hres);
9173 if(FAILED(hres))
9174 return;
9175
9176 test_frames_collection(frames, "fr1");
9177 IHTMLFramesCollection2_Release(frames);
9178
9179 hres = IHTMLDocument2_get_frames(doc, &frames);
9180 ok(hres == S_OK, "IHTMLDocument2_get_frames failed: 0x%08x\n", hres);
9181 if(FAILED(hres))
9182 return;
9183
9184 test_frames_collection(frames, "fr1");
9185 IHTMLFramesCollection2_Release(frames);
9186
9187 /* test using IHTMLWindow2 inheritance */
9188 test_frames_collection((IHTMLFramesCollection2*)window, "fr2");
9189
9190 /* getElementById with node name attributes */
9191 elem = get_doc_elem_by_id(doc, "nm1");
9192 test_elem_id((IUnknown*)elem, "fr1");
9193
9194 test_framebase((IUnknown*)elem);
9195 test_framebase_name(elem, "nm1");
9196 test_framebase_put_name(elem, "frame name");
9197 test_framebase_put_name(elem, NULL);
9198 test_framebase_put_name(elem, "nm1");
9199 test_framebase_src(elem, "about:blank");
9200 IHTMLElement_Release(elem);
9201
9202 /* get_name with no name attr */
9203 elem = get_doc_elem_by_id(doc, "fr3");
9204 test_framebase_name(elem, NULL);
9205 test_framebase_put_name(elem, "frame name");
9206 test_framebase_put_name(elem, NULL);
9207 IHTMLElement_Release(elem);
9208
9209 IHTMLWindow2_Release(window);
9210 }
9211
9212 static IHTMLDocument2 *create_docfrag(IHTMLDocument2 *doc)
9213 {
9214 IHTMLDocument2 *frag;
9215 IHTMLDocument3 *doc3;
9216 HRESULT hres;
9217
9218 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
9219 ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
9220
9221 hres = IHTMLDocument3_createDocumentFragment(doc3, &frag);
9222 IHTMLDocument3_Release(doc3);
9223 ok(hres == S_OK, "createDocumentFragment failed: %08x\n", hres);
9224 ok(frag != NULL, "frag == NULL\n");
9225
9226 return frag;
9227 }
9228
9229 static void test_docfrag(IHTMLDocument2 *doc)
9230 {
9231 IHTMLDocument2 *frag, *owner_doc, *doc_node;
9232 IHTMLElement *div, *body, *br;
9233 IHTMLElementCollection *col;
9234 IHTMLLocation *location;
9235 HRESULT hres;
9236
9237 static const elem_type_t all_types[] = {
9238 ET_HTML,
9239 ET_HEAD,
9240 ET_TITLE,
9241 ET_BODY,
9242 ET_DIV,
9243 ET_BR
9244 };
9245
9246 frag = create_docfrag(doc);
9247
9248 test_disp((IUnknown*)frag, &DIID_DispHTMLDocument, "[object]");
9249
9250 body = (void*)0xdeadbeef;
9251 hres = IHTMLDocument2_get_body(frag, &body);
9252 ok(hres == S_OK, "get_body failed: %08x\n", hres);
9253 ok(!body, "body != NULL\n");
9254
9255 location = (void*)0xdeadbeef;
9256 hres = IHTMLDocument2_get_location(frag, &location);
9257 ok(hres == E_UNEXPECTED, "get_location failed: %08x\n", hres);
9258 ok(location == (void*)0xdeadbeef, "location changed\n");
9259
9260 br = test_create_elem(doc, "BR");
9261 test_elem_source_index(br, -1);
9262 test_node_append_child((IUnknown*)frag, (IUnknown*)br);
9263 test_elem_source_index(br, 0);
9264 IHTMLElement_Release(br);
9265
9266 div = get_elem_by_id(doc, "divid", TRUE);
9267 test_node_append_child((IUnknown*)div, (IUnknown*)frag);
9268 IHTMLElement_Release(div);
9269
9270 hres = IHTMLDocument2_get_all(doc, &col);
9271 ok(hres == S_OK, "get_all failed: %08x\n", hres);
9272 test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
9273 IHTMLElementCollection_Release(col);
9274
9275 div = test_create_elem(frag, "div");
9276 owner_doc = get_owner_doc((IUnknown*)div);
9277 doc_node = get_doc_node(doc);
9278 ok(iface_cmp((IUnknown*)owner_doc, (IUnknown*)doc_node), "owner_doc != doc_node\n");
9279 IHTMLDocument2_Release(doc_node);
9280 IHTMLDocument2_Release(owner_doc);
9281 IHTMLElement_Release(div);
9282
9283 IHTMLDocument2_Release(frag);
9284 }
9285
9286 static void check_quirks_mode(IHTMLDocument2 *doc)
9287 {
9288 test_compatmode(doc, "BackCompat");
9289 }
9290
9291 static void check_strict_mode(IHTMLDocument2 *doc)
9292 {
9293 test_compatmode(doc, "CSS1Compat");
9294 }
9295
9296 static void test_quirks_mode_offsetHeight(IHTMLDocument2 *doc)
9297 {
9298 IHTMLElement *elem;
9299 HRESULT hres;
9300 LONG oh;
9301
9302 hres = IHTMLDocument2_get_body(doc, &elem);
9303 ok(hres == S_OK, "get_body fauled: %08x\n", hres);
9304
9305 /* body.offsetHeight value depends on window size in quirks mode */
9306 hres = IHTMLElement_get_offsetHeight(elem, &oh);
9307 ok(hres == S_OK, "get_offsetHeight failed: %08x\n", hres);
9308 todo_wine ok(oh == 500, "offsetHeight = %d\n", oh);
9309 IHTMLElement_Release(elem);
9310 }
9311
9312 static IHTMLDocument2 *notif_doc;
9313 static BOOL doc_complete;
9314
9315 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
9316 REFIID riid, void**ppv)
9317 {
9318 if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
9319 *ppv = iface;
9320 return S_OK;
9321 }
9322
9323 ok(0, "unexpected call\n");
9324 return E_NOINTERFACE;
9325 }
9326
9327 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
9328 {
9329 return 2;
9330 }
9331
9332 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
9333 {
9334 return 1;
9335 }
9336
9337 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
9338 {
9339 if(dispID == DISPID_READYSTATE){
9340 BSTR state;
9341 HRESULT hres;
9342
9343 hres = IHTMLDocument2_get_readyState(notif_doc, &state);
9344 ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
9345
9346 if(!strcmp_wa(state, "complete"))
9347 doc_complete = TRUE;
9348
9349 SysFreeString(state);
9350 }
9351
9352 return S_OK;
9353 }
9354
9355 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
9356 {
9357 ok(0, "unexpected call\n");
9358 return E_NOTIMPL;
9359 }
9360
9361 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
9362 PropertyNotifySink_QueryInterface,
9363 PropertyNotifySink_AddRef,
9364 PropertyNotifySink_Release,
9365 PropertyNotifySink_OnChanged,
9366 PropertyNotifySink_OnRequestEdit
9367 };
9368
9369 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
9370
9371 static HRESULT cs_qi(REFIID,void **);
9372 static IOleDocumentView *view;
9373 static HWND container_hwnd;
9374
9375 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
9376 {
9377 static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}};
9378
9379 if(!IsEqualGUID(&undocumented_frame_iid, riid))
9380 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
9381
9382 *ppv = NULL;
9383 return E_NOINTERFACE;
9384 }
9385
9386 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
9387 {
9388 return 2;
9389 }
9390
9391 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
9392 {
9393 return 1;
9394 }
9395
9396 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
9397 {
9398 return E_NOTIMPL;
9399 }
9400
9401 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
9402 {
9403 return E_NOTIMPL;
9404 }
9405
9406 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
9407 {
9408 return E_NOTIMPL;
9409 }
9410
9411 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
9412 LPCBORDERWIDTHS pborderwidths)
9413 {
9414 return E_NOTIMPL;
9415 }
9416
9417 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
9418 LPCBORDERWIDTHS pborderwidths)
9419 {
9420 return S_OK;
9421 }
9422
9423 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
9424 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
9425 {
9426 return S_OK;
9427 }
9428
9429 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
9430 LPOLEMENUGROUPWIDTHS lpMenuWidths)
9431 {
9432 return E_NOTIMPL;
9433 }
9434
9435 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
9436 HOLEMENU holemenu, HWND hwndActiveObject)
9437 {
9438 ok(0, "unexpected call\n");
9439 return E_NOTIMPL;
9440 }
9441
9442 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
9443 {
9444 ok(0, "unexpected call\n");
9445 return E_NOTIMPL;
9446 }
9447
9448 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
9449 {
9450 return S_OK;
9451 }
9452
9453 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
9454 {
9455 return E_NOTIMPL;
9456 }
9457
9458 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
9459 {
9460 ok(0, "unexpected call\n");
9461 return E_NOTIMPL;
9462 }
9463
9464 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
9465 InPlaceFrame_QueryInterface,
9466 InPlaceFrame_AddRef,
9467 InPlaceFrame_Release,
9468 InPlaceFrame_GetWindow,
9469 InPlaceFrame_ContextSensitiveHelp,
9470 InPlaceFrame_GetBorder,
9471 InPlaceFrame_RequestBorderSpace,
9472 InPlaceFrame_SetBorderSpace,
9473 InPlaceFrame_SetActiveObject,
9474 InPlaceFrame_InsertMenus,
9475 InPlaceFrame_SetMenu,
9476 InPlaceFrame_RemoveMenus,
9477 InPlaceFrame_SetStatusText,
9478 InPlaceFrame_EnableModeless,
9479 InPlaceFrame_TranslateAccelerator
9480 };
9481
9482 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
9483
9484 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
9485 {
9486 return cs_qi(riid, ppv);
9487 }
9488
9489 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
9490 {
9491 return 2;
9492 }
9493
9494 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
9495 {
9496 return 1;
9497 }
9498
9499 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
9500 {
9501 *phwnd = container_hwnd;
9502 return S_OK;
9503 }
9504
9505 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
9506 {
9507 ok(0, "unexpected call\n");
9508 return E_NOTIMPL;
9509 }
9510
9511 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
9512 {
9513 return S_OK;
9514 }
9515
9516 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
9517 {
9518 return S_OK;
9519 }
9520
9521 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
9522 {
9523 return S_OK;
9524 }
9525
9526 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
9527 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
9528 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
9529 {
9530 static const RECT rect = {0,0,500,500};
9531
9532 *ppFrame = &InPlaceFrame;
9533 *ppDoc = NULL;
9534 *lprcPosRect = rect;
9535 *lprcClipRect = rect;
9536
9537 lpFrameInfo->fMDIApp = FALSE;
9538 lpFrameInfo->hwndFrame = container_hwnd;
9539 lpFrameInfo->haccel = NULL;
9540 lpFrameInfo->cAccelEntries = 0;
9541
9542 return S_OK;
9543 }
9544
9545 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtant)
9546 {
9547 return E_NOTIMPL;
9548 }
9549
9550 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
9551 {
9552 return S_OK;
9553 }
9554
9555 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
9556 {
9557 return S_OK;
9558 }
9559
9560 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
9561 {
9562 return E_NOTIMPL;
9563 }
9564
9565 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
9566 {
9567 return E_NOTIMPL;
9568 }
9569
9570 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
9571 {
9572 return E_NOTIMPL;
9573 }
9574
9575 static const IOleInPlaceSiteVtbl InPlaceSiteVtbl = {
9576 InPlaceSite_QueryInterface,
9577 InPlaceSite_AddRef,
9578 InPlaceSite_Release,
9579 InPlaceSite_GetWindow,
9580 InPlaceSite_ContextSensitiveHelp,
9581 InPlaceSite_CanInPlaceActivate,
9582 InPlaceSite_OnInPlaceActivate,
9583 InPlaceSite_OnUIActivate,
9584 InPlaceSite_GetWindowContext,
9585 InPlaceSite_Scroll,
9586 InPlaceSite_OnUIDeactivate,
9587 InPlaceSite_OnInPlaceDeactivate,
9588 InPlaceSite_DiscardUndoState,
9589 InPlaceSite_DeactivateAndUndo,
9590 InPlaceSite_OnPosRectChange,
9591 };
9592
9593 static IOleInPlaceSite InPlaceSite = { &InPlaceSiteVtbl };
9594
9595 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
9596 {
9597 return cs_qi(riid, ppv);
9598 }
9599
9600 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
9601 {
9602 return 2;
9603 }
9604
9605 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
9606 {
9607 return 1;
9608 }
9609
9610 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
9611 {
9612 ok(0, "unexpected call\n");
9613 return E_NOTIMPL;
9614 }
9615
9616 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
9617 IMoniker **ppmon)
9618 {
9619 ok(0, "unexpected call\n");
9620 return E_NOTIMPL;
9621 }
9622
9623 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
9624 {
9625 return E_NOTIMPL;
9626 }
9627
9628 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
9629 {
9630 ok(0, "unexpected call\n");
9631 return E_NOTIMPL;
9632 }
9633
9634 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
9635 {
9636 ok(0, "unexpected call\n");
9637 return E_NOTIMPL;
9638 }
9639
9640 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
9641 {
9642 ok(0, "unexpected call\n");
9643 return E_NOTIMPL;
9644 }
9645
9646 static const IOleClientSiteVtbl ClientSiteVtbl = {
9647 ClientSite_QueryInterface,
9648 ClientSite_AddRef,
9649 ClientSite_Release,
9650 ClientSite_SaveObject,
9651 ClientSite_GetMoniker,
9652 ClientSite_GetContainer,
9653 ClientSite_ShowObject,
9654 ClientSite_OnShowWindow,
9655 ClientSite_RequestNewObjectLayout
9656 };
9657
9658 static IOleClientSite ClientSite = { &ClientSiteVtbl };
9659
9660 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
9661 {
9662 return cs_qi(riid, ppv);
9663 }
9664
9665 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
9666 {
9667 return 2;
9668 }
9669
9670 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
9671 {
9672 return 1;
9673 }
9674
9675 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
9676 {
9677 RECT rect = {0,0,500,500};
9678 IOleDocument *document;
9679 HRESULT hres;
9680
9681 hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
9682 ok(hres == S_OK, "could not get IOleDocument: %08x\n", hres);
9683
9684 hres = IOleDocument_CreateView(document, &InPlaceSite, NULL, 0, &view);
9685 IOleDocument_Release(document);
9686 ok(hres == S_OK, "CreateView failed: %08x\n", hres);
9687
9688 hres = IOleDocumentView_SetInPlaceSite(view, &InPlaceSite);
9689 ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
9690
9691 hres = IOleDocumentView_UIActivate(view, TRUE);
9692 ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
9693
9694 hres = IOleDocumentView_SetRect(view, &rect);
9695 ok(hres == S_OK, "SetRect failed: %08x\n", hres);
9696
9697 hres = IOleDocumentView_Show(view, TRUE);
9698 ok(hres == S_OK, "Show failed: %08x\n", hres);
9699
9700 return S_OK;
9701 }
9702
9703 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
9704 DocumentSite_QueryInterface,
9705 DocumentSite_AddRef,
9706 DocumentSite_Release,
9707 DocumentSite_ActivateMe
9708 };
9709
9710 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
9711
9712 static HRESULT cs_qi(REFIID riid, void **ppv)
9713 {
9714 *ppv = NULL;
9715
9716 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
9717 *ppv = &ClientSite;
9718 else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
9719 *ppv = &DocumentSite;
9720 else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
9721 *ppv = &InPlaceSite;
9722
9723 return *ppv ? S_OK : E_NOINTERFACE;
9724 }
9725
9726 static void set_client_site(IHTMLDocument2 *doc, BOOL set)
9727 {
9728 IOleObject *oleobj;
9729 HRESULT hres;
9730
9731 if(!set && view) {
9732 IOleDocumentView_Show(view, FALSE);
9733 IOleDocumentView_CloseView(view, 0);
9734 IOleDocumentView_SetInPlaceSite(view, NULL);
9735 IOleDocumentView_Release(view);
9736 view = NULL;
9737 }
9738
9739 hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
9740 ok(hres == S_OK, "Could not et IOleObject: %08x\n", hres);
9741
9742 hres = IOleObject_SetClientSite(oleobj, set ? &ClientSite : NULL);
9743 ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
9744
9745 if(set) {
9746 IHlinkTarget *hlink;
9747
9748 hres = IOleObject_QueryInterface(oleobj, &IID_IHlinkTarget, (void**)&hlink);
9749 ok(hres == S_OK, "Could not get IHlinkTarget iface: %08x\n", hres);
9750
9751 hres = IHlinkTarget_Navigate(hlink, 0, NULL);
9752 ok(hres == S_OK, "Navgate failed: %08x\n", hres);
9753
9754 IHlinkTarget_Release(hlink);
9755 }
9756
9757 IOleObject_Release(oleobj);
9758 }
9759
9760 static IHTMLDocument2 *create_doc_with_string(const char *str)
9761 {
9762 IPersistStreamInit *init;
9763 IStream *stream;
9764 IHTMLDocument2 *doc;
9765 HGLOBAL mem;
9766 SIZE_T len;
9767
9768 notif_doc = doc = create_document();
9769 if(!doc)
9770 return NULL;
9771
9772 doc_complete = FALSE;
9773 len = strlen(str);
9774 mem = GlobalAlloc(0, len);
9775 memcpy(mem, str, len);
9776 CreateStreamOnHGlobal(mem, TRUE, &stream);
9777
9778 IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
9779
9780 IPersistStreamInit_Load(init, stream);
9781 IPersistStreamInit_Release(init);
9782 IStream_Release(stream);
9783
9784 return doc;
9785 }
9786
9787 static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise)
9788 {
9789 IConnectionPointContainer *container;
9790 IConnectionPoint *cp;
9791 DWORD cookie;
9792 HRESULT hres;
9793
9794 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
9795 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
9796
9797 hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
9798 IConnectionPointContainer_Release(container);
9799 ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
9800
9801 hres = IConnectionPoint_Advise(cp, unk_advise, &cookie);
9802 IConnectionPoint_Release(cp);
9803 ok(hres == S_OK, "Advise failed: %08x\n", hres);
9804 }
9805
9806 typedef void (*domtest_t)(IHTMLDocument2*);
9807
9808 static void run_domtest(const char *str, domtest_t test)
9809 {
9810 IHTMLDocument2 *doc;
9811 ULONG ref;
9812 MSG msg;
9813
9814 doc = create_doc_with_string(str);
9815 if(!doc)
9816 return;
9817
9818 set_client_site(doc, TRUE);
9819 do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
9820
9821 while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) {
9822 TranslateMessage(&msg);
9823 DispatchMessageW(&msg);
9824 }
9825
9826 test(doc);
9827
9828 set_client_site(doc, FALSE);
9829 ref = IHTMLDocument2_Release(doc);
9830 ok(!ref || broken(ref == 1), /* Vista */
9831 "ref = %d\n", ref);
9832 }
9833
9834 static void test_quirks_mode(void)
9835 {
9836 run_domtest("<html></html>", check_quirks_mode);
9837 run_domtest("<!DOCTYPE html>\n<html></html>", check_strict_mode);
9838 run_domtest("<!-- comment --><!DOCTYPE html>\n<html></html>", check_quirks_mode);
9839 run_domtest("<html><body></body></html>", test_quirks_mode_offsetHeight);
9840 }
9841
9842 START_TEST(dom)
9843 {
9844 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
9845 pLCIDToLocaleName = (void*)GetProcAddress(hkernel32, "LCIDToLocaleName");
9846 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
9847
9848 CoInitialize(NULL);
9849 container_hwnd = CreateWindowA("static", NULL, WS_POPUP|WS_VISIBLE,
9850 CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, NULL, NULL);
9851
9852 run_domtest(doc_str1, test_doc_elem);
9853 run_domtest(doc_str1, test_get_set_attr);
9854 run_domtest(range_test_str, test_txtrange);
9855 run_domtest(range_test2_str, test_txtrange2);
9856 if (winetest_interactive || ! is_ie_hardened()) {
9857 run_domtest(elem_test_str, test_elems);
9858 run_domtest(elem_test2_str, test_elems2);
9859 run_domtest(noscript_str, test_noscript);
9860 }else {
9861 skip("IE running in Enhanced Security Configuration\n");
9862 }
9863 run_domtest(doc_blank, test_create_elems);
9864 run_domtest(doc_blank, test_defaults);
9865 run_domtest(doc_blank, test_null_write);
9866 run_domtest(emptydiv_str, test_create_stylesheet);
9867 run_domtest(indent_test_str, test_indent);
9868 run_domtest(cond_comment_str, test_cond_comment);
9869 run_domtest(frameset_str, test_frameset);
9870 run_domtest(emptydiv_str, test_docfrag);
9871 run_domtest(doc_blank, test_replacechild_elems);
9872 run_domtest(doctype_str, test_doctype);
9873
9874 test_quirks_mode();
9875
9876 DestroyWindow(container_hwnd);
9877 CoUninitialize();
9878 }