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