5c7380ed8e4096a32b3d02c9ccfd737971435990
[reactos.git] / rostests / winetests / mshtml / dom.c
1 /*
2 * Copyright 2007-2008 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "ole2.h"
29 #include "mshtml.h"
30 #include "mshtmcid.h"
31 #include "mshtmhst.h"
32 #include "docobj.h"
33 #include "dispex.h"
34 #include "mshtml_test.h"
35
36 static const char doc_blank[] = "<html></html>";
37 static const char doc_str1[] = "<html><body>test</body></html>";
38 static const char range_test_str[] =
39 "<html><body>test \na<font size=\"2\">bc\t123<br /> it's\r\n \t</font>text<br /></body></html>";
40 static const char range_test2_str[] =
41 "<html><body>abc<hr />123<br /><hr />def</body></html>";
42 static const char elem_test_str[] =
43 "<html><head><title>test</title><style>.body { margin-right: 0px; }</style>"
44 "<body onload=\"Testing()\">text test<!-- a comment -->"
45 "<a id=\"a\" href=\"http://test\" name=\"x\">link</a>"
46 "<input id=\"in\" class=\"testclass\" tabIndex=\"2\" title=\"test title\" />"
47 "<select id=\"s\"><option id=\"x\" value=\"val1\">opt1</option><option id=\"y\">opt2</option></select>"
48 "<textarea id=\"X\">text text</textarea>"
49 "<table id=\"tbl\"><tbody><tr></tr><tr id=\"row2\"><td>td1 text</td><td>td2 text</td></tr></tbody></table>"
50 "<script id=\"sc\" type=\"text/javascript\"><!--\nfunction Testing() {}\n// -->\n</script>"
51 "<test />"
52 "<img id=\"imgid\" name=\"WineImg\"/>"
53 "<iframe src=\"about:blank\" id=\"ifr\"></iframe>"
54 "<form id=\"frm\"></form>"
55 "</body></html>";
56 static const char elem_test2_str[] =
57 "<html><head><title>test</title><style>.body { margin-right: 0px; }</style>"
58 "<body><div id=\"divid\"></div></body>"
59 "</html>";
60
61 static const char indent_test_str[] =
62 "<html><head><title>test</title></head><body>abc<br /><a href=\"about:blank\">123</a></body></html>";
63 static const char cond_comment_str[] =
64 "<html><head><title>test</title></head><body>"
65 "<!--[if gte IE 4]> <br> <![endif]-->"
66 "</body></html>";
67 static const char frameset_str[] =
68 "<html><head><title>frameset test</title></head><frameset rows=\"25, 25, *\">"
69 "<frame src=\"about:blank\" name=\"nm1\" id=\"fr1\"><frame src=\"about:blank\" name=\"nm2\" id=\"fr2\">"
70 "<frame src=\"about:blank\" id=\"fr3\">"
71 "</frameset></html>";
72
73 static WCHAR characterW[] = {'c','h','a','r','a','c','t','e','r',0};
74 static WCHAR texteditW[] = {'t','e','x','t','e','d','i','t',0};
75 static WCHAR wordW[] = {'w','o','r','d',0};
76
77 typedef enum {
78 ET_NONE,
79 ET_HTML,
80 ET_HEAD,
81 ET_TITLE,
82 ET_BODY,
83 ET_A,
84 ET_INPUT,
85 ET_SELECT,
86 ET_TEXTAREA,
87 ET_OPTION,
88 ET_STYLE,
89 ET_BLOCKQUOTE,
90 ET_P,
91 ET_BR,
92 ET_TABLE,
93 ET_TBODY,
94 ET_SCRIPT,
95 ET_TEST,
96 ET_TESTG,
97 ET_COMMENT,
98 ET_IMG,
99 ET_TR,
100 ET_TD,
101 ET_IFRAME,
102 ET_FORM
103 } elem_type_t;
104
105 static const IID * const none_iids[] = {
106 &IID_IUnknown,
107 NULL
108 };
109
110 static const IID * const doc_node_iids[] = {
111 &IID_IHTMLDOMNode,
112 &IID_IHTMLDOMNode2,
113 &IID_IHTMLDocument,
114 &IID_IHTMLDocument2,
115 &IID_IHTMLDocument3,
116 &IID_IHTMLDocument4,
117 &IID_IHTMLDocument5,
118 &IID_IDispatchEx,
119 &IID_IConnectionPointContainer,
120 &IID_IInternetHostSecurityManager,
121 NULL
122 };
123
124 static const IID * const doc_obj_iids[] = {
125 &IID_IHTMLDocument,
126 &IID_IHTMLDocument2,
127 &IID_IHTMLDocument3,
128 &IID_IHTMLDocument4,
129 &IID_IHTMLDocument5,
130 &IID_IDispatchEx,
131 &IID_IConnectionPointContainer,
132 &IID_ICustomDoc,
133 NULL
134 };
135
136 static const IID * const elem_iids[] = {
137 &IID_IHTMLDOMNode,
138 &IID_IHTMLDOMNode2,
139 &IID_IHTMLElement,
140 &IID_IHTMLElement2,
141 &IID_IHTMLElement3,
142 &IID_IDispatchEx,
143 &IID_IConnectionPointContainer,
144 NULL
145 };
146
147 static const IID * const body_iids[] = {
148 &IID_IHTMLDOMNode,
149 &IID_IHTMLDOMNode2,
150 &IID_IHTMLElement,
151 &IID_IHTMLElement2,
152 &IID_IHTMLElement3,
153 &IID_IHTMLTextContainer,
154 &IID_IHTMLBodyElement,
155 &IID_IDispatchEx,
156 &IID_IConnectionPointContainer,
157 NULL
158 };
159
160 static const IID * const anchor_iids[] = {
161 &IID_IHTMLDOMNode,
162 &IID_IHTMLDOMNode2,
163 &IID_IHTMLElement,
164 &IID_IHTMLElement2,
165 &IID_IHTMLElement3,
166 &IID_IHTMLAnchorElement,
167 &IID_IDispatchEx,
168 &IID_IConnectionPointContainer,
169 NULL
170 };
171
172 static const IID * const input_iids[] = {
173 &IID_IHTMLDOMNode,
174 &IID_IHTMLDOMNode2,
175 &IID_IHTMLElement,
176 &IID_IHTMLElement2,
177 &IID_IHTMLElement3,
178 &IID_IHTMLInputElement,
179 &IID_IHTMLInputTextElement,
180 &IID_IDispatchEx,
181 &IID_IConnectionPointContainer,
182 NULL
183 };
184
185 static const IID * const select_iids[] = {
186 &IID_IHTMLDOMNode,
187 &IID_IHTMLDOMNode2,
188 &IID_IHTMLElement,
189 &IID_IHTMLElement2,
190 &IID_IHTMLElement3,
191 &IID_IHTMLSelectElement,
192 &IID_IDispatchEx,
193 &IID_IConnectionPointContainer,
194 NULL
195 };
196
197 static const IID * const textarea_iids[] = {
198 &IID_IHTMLDOMNode,
199 &IID_IHTMLDOMNode2,
200 &IID_IHTMLElement,
201 &IID_IHTMLElement2,
202 &IID_IHTMLElement3,
203 &IID_IHTMLTextAreaElement,
204 &IID_IDispatchEx,
205 &IID_IConnectionPointContainer,
206 NULL
207 };
208
209 static const IID * const option_iids[] = {
210 &IID_IHTMLDOMNode,
211 &IID_IHTMLDOMNode2,
212 &IID_IHTMLElement,
213 &IID_IHTMLElement2,
214 &IID_IHTMLElement3,
215 &IID_IHTMLOptionElement,
216 &IID_IDispatchEx,
217 &IID_IConnectionPointContainer,
218 NULL
219 };
220
221 static const IID * const table_iids[] = {
222 &IID_IHTMLDOMNode,
223 &IID_IHTMLDOMNode2,
224 &IID_IHTMLElement,
225 &IID_IHTMLElement2,
226 &IID_IHTMLElement3,
227 &IID_IHTMLTable,
228 &IID_IDispatchEx,
229 &IID_IConnectionPointContainer,
230 NULL
231 };
232
233 static const IID * const script_iids[] = {
234 &IID_IHTMLDOMNode,
235 &IID_IHTMLDOMNode2,
236 &IID_IHTMLElement,
237 &IID_IHTMLElement2,
238 &IID_IHTMLElement3,
239 &IID_IHTMLScriptElement,
240 &IID_IDispatchEx,
241 &IID_IConnectionPointContainer,
242 NULL
243 };
244
245 static const IID * const text_iids[] = {
246 &IID_IHTMLDOMNode,
247 &IID_IHTMLDOMNode2,
248 &IID_IHTMLDOMTextNode,
249 NULL
250 };
251
252 static const IID * const location_iids[] = {
253 &IID_IDispatch,
254 &IID_IHTMLLocation,
255 NULL
256 };
257
258 static const IID * const window_iids[] = {
259 &IID_IDispatch,
260 &IID_IHTMLWindow2,
261 &IID_IHTMLWindow3,
262 &IID_IDispatchEx,
263 NULL
264 };
265
266 static const IID * const comment_iids[] = {
267 &IID_IHTMLDOMNode,
268 &IID_IHTMLDOMNode2,
269 &IID_IHTMLElement,
270 &IID_IHTMLElement2,
271 &IID_IHTMLElement3,
272 &IID_IHTMLCommentElement,
273 &IID_IDispatchEx,
274 &IID_IConnectionPointContainer,
275 NULL
276 };
277
278 static const IID * const img_iids[] = {
279 &IID_IHTMLDOMNode,
280 &IID_IHTMLDOMNode2,
281 &IID_IHTMLElement,
282 &IID_IHTMLElement2,
283 &IID_IHTMLElement3,
284 &IID_IDispatchEx,
285 &IID_IHTMLImgElement,
286 &IID_IConnectionPointContainer,
287 NULL
288 };
289
290 static const IID * const tr_iids[] = {
291 &IID_IHTMLDOMNode,
292 &IID_IHTMLDOMNode2,
293 &IID_IHTMLElement,
294 &IID_IHTMLElement2,
295 &IID_IHTMLElement3,
296 &IID_IDispatchEx,
297 &IID_IHTMLTableRow,
298 &IID_IConnectionPointContainer,
299 NULL
300 };
301
302 static const IID * const td_iids[] = {
303 &IID_IHTMLDOMNode,
304 &IID_IHTMLDOMNode2,
305 &IID_IHTMLElement,
306 &IID_IHTMLElement2,
307 &IID_IHTMLElement3,
308 &IID_IDispatchEx,
309 &IID_IConnectionPointContainer,
310 NULL
311 };
312
313 static const IID * const iframe_iids[] = {
314 &IID_IHTMLDOMNode,
315 &IID_IHTMLDOMNode2,
316 &IID_IHTMLElement,
317 &IID_IHTMLElement2,
318 &IID_IHTMLElement3,
319 &IID_IHTMLFrameBase,
320 &IID_IHTMLFrameBase2,
321 &IID_IDispatchEx,
322 &IID_IConnectionPointContainer,
323 NULL
324 };
325
326 static const IID * const form_iids[] = {
327 &IID_IHTMLDOMNode,
328 &IID_IHTMLDOMNode2,
329 &IID_IHTMLElement,
330 &IID_IHTMLElement2,
331 &IID_IHTMLElement3,
332 &IID_IHTMLFormElement,
333 &IID_IDispatchEx,
334 &IID_IConnectionPointContainer,
335 NULL
336 };
337
338 static const IID * const generic_iids[] = {
339 &IID_IHTMLDOMNode,
340 &IID_IHTMLDOMNode2,
341 &IID_IHTMLElement,
342 &IID_IHTMLElement2,
343 &IID_IHTMLElement3,
344 &IID_IHTMLGenericElement,
345 &IID_IDispatchEx,
346 &IID_IConnectionPointContainer,
347 NULL
348 };
349
350 static const IID * const style_iids[] = {
351 &IID_IUnknown,
352 &IID_IDispatch,
353 &IID_IDispatchEx,
354 &IID_IHTMLStyle,
355 &IID_IHTMLStyle2,
356 &IID_IHTMLStyle3,
357 &IID_IHTMLStyle4,
358 NULL
359 };
360
361 static const IID * const cstyle_iids[] = {
362 &IID_IUnknown,
363 &IID_IDispatch,
364 &IID_IDispatchEx,
365 &IID_IHTMLCurrentStyle,
366 NULL
367 };
368
369 static const IID * const img_factory_iids[] = {
370 &IID_IUnknown,
371 &IID_IDispatch,
372 &IID_IDispatchEx,
373 &IID_IHTMLImageElementFactory,
374 NULL
375 };
376
377 typedef struct {
378 const char *tag;
379 REFIID *iids;
380 const IID *dispiid;
381 } elem_type_info_t;
382
383 static const elem_type_info_t elem_type_infos[] = {
384 {"", none_iids, NULL},
385 {"HTML", elem_iids, NULL},
386 {"HEAD", elem_iids, NULL},
387 {"TITLE", elem_iids, NULL},
388 {"BODY", body_iids, &DIID_DispHTMLBody},
389 {"A", anchor_iids, &DIID_DispHTMLAnchorElement},
390 {"INPUT", input_iids, &DIID_DispHTMLInputElement},
391 {"SELECT", select_iids, &DIID_DispHTMLSelectElement},
392 {"TEXTAREA", textarea_iids, NULL},
393 {"OPTION", option_iids, &DIID_DispHTMLOptionElement},
394 {"STYLE", elem_iids, NULL},
395 {"BLOCKQUOTE",elem_iids, NULL},
396 {"P", elem_iids, NULL},
397 {"BR", elem_iids, NULL},
398 {"TABLE", table_iids, &DIID_DispHTMLTable},
399 {"TBODY", elem_iids, NULL},
400 {"SCRIPT", script_iids, NULL},
401 {"TEST", elem_iids, &DIID_DispHTMLUnknownElement},
402 {"TEST", generic_iids, &DIID_DispHTMLGenericElement},
403 {"!", comment_iids, &DIID_DispHTMLCommentElement},
404 {"IMG", img_iids, &DIID_DispHTMLImg},
405 {"TR", tr_iids, &DIID_DispHTMLTableRow},
406 {"TD", td_iids, NULL},
407 {"IFRAME", iframe_iids, &DIID_DispHTMLIFrame},
408 {"FORM", form_iids, &DIID_DispHTMLFormElement}
409 };
410
411 static const char *dbgstr_guid(REFIID riid)
412 {
413 static char buf[50];
414
415 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
416 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
417 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
418 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
419
420 return buf;
421 }
422
423 static int strcmp_wa(LPCWSTR strw, const char *stra)
424 {
425 CHAR buf[512];
426 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
427 return lstrcmpA(stra, buf);
428 }
429
430 static BSTR a2bstr(const char *str)
431 {
432 BSTR ret;
433 int len;
434
435 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
436 ret = SysAllocStringLen(NULL, len);
437 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
438
439 return ret;
440 }
441
442 static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
443 {
444 IUnknown *unk1, *unk2;
445
446 if(iface1 == iface2)
447 return TRUE;
448
449 IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
450 IUnknown_Release(unk1);
451 IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
452 IUnknown_Release(unk2);
453
454 return unk1 == unk2;
455 }
456
457 static IHTMLDocument2 *create_document(void)
458 {
459 IHTMLDocument2 *doc;
460 IHTMLDocument5 *doc5;
461 HRESULT hres;
462
463 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
464 &IID_IHTMLDocument2, (void**)&doc);
465 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
466 if(FAILED(hres))
467 return NULL;
468
469 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
470 if(FAILED(hres)) {
471 win_skip("Could not get IHTMLDocument5, probably too old IE\n");
472 IHTMLDocument2_Release(doc);
473 return NULL;
474 }
475
476 IHTMLDocument5_Release(doc5);
477 return doc;
478 }
479
480 #define test_ifaces(i,ids) _test_ifaces(__LINE__,i,ids)
481 static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids)
482 {
483 const IID * const *piid;
484 IUnknown *unk;
485 HRESULT hres;
486
487 for(piid = iids; *piid; piid++) {
488 hres = IDispatch_QueryInterface(iface, *piid, (void**)&unk);
489 ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", dbgstr_guid(*piid), hres);
490 if(SUCCEEDED(hres))
491 IUnknown_Release(unk);
492 }
493 }
494
495 #define test_get_dispid(u,id) _test_disp(__LINE__,u,id)
496 static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid)
497 {
498 IDispatchEx *dispex;
499 ITypeInfo *typeinfo;
500 BOOL ret = FALSE;
501 UINT ticnt;
502 HRESULT hres;
503
504 hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
505 ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatchEx: %08x\n", hres);
506 if(FAILED(hres))
507 return FALSE;
508
509 ticnt = 0xdeadbeef;
510 hres = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
511 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfoCount failed: %08x\n", hres);
512 ok_(__FILE__,line) (ticnt == 1, "ticnt=%u\n", ticnt);
513
514 hres = IDispatchEx_GetTypeInfo(dispex, 0, 0, &typeinfo);
515 ok_(__FILE__,line) (hres == S_OK, "GetTypeInfo failed: %08x\n", hres);
516
517 if(SUCCEEDED(hres)) {
518 TYPEATTR *type_attr;
519
520 hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
521 ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08x\n", hres);
522 if(hres == S_OK) {
523 *iid = type_attr->guid;
524 ret = TRUE;
525 }
526
527 ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
528 ITypeInfo_Release(typeinfo);
529 }
530
531 IDispatchEx_Release(dispex);
532 return ret;
533 }
534
535 #define test_disp_value(u) _test_disp_value(__LINE__,u,v)
536 static void _test_disp_value(unsigned line, IUnknown *unk, const char *val)
537 {
538 DISPPARAMS dp = {NULL,NULL,0,0};
539 IDispatchEx *dispex;
540 EXCEPINFO ei;
541 VARIANT var;
542 HRESULT hres;
543
544 hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
545 ok_(__FILE__,line)(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres);
546 if(FAILED(hres))
547 return;
548
549 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL);
550 IDispatchEx_Release(dispex);
551 ok_(__FILE__,line)(hres == S_OK, "InvokeEx(DISPID_VALUE) returned: %08x\n", hres);
552
553 ok_(__FILE__,line)(V_VT(&var) == VT_BSTR, "V_VT(value) = %d\n", V_VT(&var));
554 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&var), val), "value = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&var)), val);
555 VariantClear(&var);
556 }
557
558 #define test_disp(u,id,v) _test_disp(__LINE__,u,id,v)
559 static void _test_disp(unsigned line, IUnknown *unk, const IID *diid, const char *val)
560 {
561 IID iid;
562
563 if(_test_get_dispid(line, unk, &iid))
564 ok_(__FILE__,line) (IsEqualGUID(&iid, diid), "unexpected guid %s\n", dbgstr_guid(&iid));
565
566 if(val)
567 _test_disp_value(line, unk, val);
568 }
569
570 #define test_disp2(u,id,id2,v) _test_disp2(__LINE__,u,id,id2,v)
571 static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID *diid2, const char *val)
572 {
573 IID iid;
574
575 if(_test_get_dispid(line, unk, &iid))
576 ok_(__FILE__,line) (IsEqualGUID(&iid, diid) || broken(IsEqualGUID(&iid, diid2)),
577 "unexpected guid %s\n", dbgstr_guid(&iid));
578
579 if(val)
580 _test_disp_value(line, unk, val);
581 }
582
583 #define get_elem_iface(u) _get_elem_iface(__LINE__,u)
584 static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk)
585 {
586 IHTMLElement *elem;
587 HRESULT hres;
588
589 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement, (void**)&elem);
590 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement: %08x\n", hres);
591 return elem;
592 }
593
594 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
595 static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk)
596 {
597 IHTMLElement2 *elem;
598 HRESULT hres;
599
600 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement2, (void**)&elem);
601 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres);
602 return elem;
603 }
604
605 #define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
606 static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk)
607 {
608 IHTMLElement3 *elem;
609 HRESULT hres;
610
611 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement3, (void**)&elem);
612 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement3: %08x\n", hres);
613 return elem;
614 }
615
616 #define get_node_iface(u) _get_node_iface(__LINE__,u)
617 static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk)
618 {
619 IHTMLDOMNode *node;
620 HRESULT hres;
621
622 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode, (void**)&node);
623 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMNode: %08x\n", hres);
624 return node;
625 }
626
627 #define get_node2_iface(u) _get_node2_iface(__LINE__,u)
628 static IHTMLDOMNode2 *_get_node2_iface(unsigned line, IUnknown *unk)
629 {
630 IHTMLDOMNode2 *node;
631 HRESULT hres;
632
633 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode2, (void**)&node);
634 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMNode2: %08x\n", hres);
635 return node;
636 }
637
638 #define get_img_iface(u) _get_img_iface(__LINE__,u)
639 static IHTMLImgElement *_get_img_iface(unsigned line, IUnknown *unk)
640 {
641 IHTMLImgElement *img;
642 HRESULT hres;
643
644 hres = IUnknown_QueryInterface(unk, &IID_IHTMLImgElement, (void**)&img);
645 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLImgElement: %08x\n", hres);
646 return img;
647 }
648
649 #define get_anchor_iface(u) _get_anchor_iface(__LINE__,u)
650 static IHTMLAnchorElement *_get_anchor_iface(unsigned line, IUnknown *unk)
651 {
652 IHTMLAnchorElement *anchor;
653 HRESULT hres;
654
655 hres = IUnknown_QueryInterface(unk, &IID_IHTMLAnchorElement, (void**)&anchor);
656 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLAnchorElement: %08x\n", hres);
657 return anchor;
658 }
659
660 #define get_text_iface(u) _get_text_iface(__LINE__,u)
661 static IHTMLDOMTextNode *_get_text_iface(unsigned line, IUnknown *unk)
662 {
663 IHTMLDOMTextNode *text;
664 HRESULT hres;
665
666 hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMTextNode, (void**)&text);
667 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMTextNode: %08x\n", hres);
668 return text;
669 }
670
671 #define test_node_name(u,n) _test_node_name(__LINE__,u,n)
672 static void _test_node_name(unsigned line, IUnknown *unk, const char *exname)
673 {
674 IHTMLDOMNode *node = _get_node_iface(line, unk);
675 BSTR name;
676 HRESULT hres;
677
678 hres = IHTMLDOMNode_get_nodeName(node, &name);
679 IHTMLDOMNode_Release(node);
680 ok_(__FILE__, line) (hres == S_OK, "get_nodeName failed: %08x\n", hres);
681 ok_(__FILE__, line) (!strcmp_wa(name, exname), "got name: %s, expected %s\n", wine_dbgstr_w(name), exname);
682
683 SysFreeString(name);
684 }
685
686 #define get_owner_doc(u) _get_owner_doc(__LINE__,u)
687 static IHTMLDocument2 *_get_owner_doc(unsigned line, IUnknown *unk)
688 {
689 IHTMLDOMNode2 *node = _get_node2_iface(line, unk);
690 IDispatch *disp = (void*)0xdeadbeef;
691 IHTMLDocument2 *doc = NULL;
692 HRESULT hres;
693
694 hres = IHTMLDOMNode2_get_ownerDocument(node, &disp);
695 IHTMLDOMNode2_Release(node);
696 ok_(__FILE__,line)(hres == S_OK, "get_ownerDocument failed: %08x\n", hres);
697
698 if(disp) {
699 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&doc);
700 IDispatch_Release(disp);
701 ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument2 iface: %08x\n", hres);
702 }
703
704 return doc;
705 }
706
707 #define get_doc_window(d) _get_doc_window(__LINE__,d)
708 static IHTMLWindow2 *_get_doc_window(unsigned line, IHTMLDocument2 *doc)
709 {
710 IHTMLWindow2 *window;
711 HRESULT hres;
712
713 window = NULL;
714 hres = IHTMLDocument2_get_parentWindow(doc, &window);
715 ok_(__FILE__,line)(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
716 ok_(__FILE__,line)(window != NULL, "window == NULL\n");
717
718 return window;
719 }
720
721 #define clone_node(n,d) _clone_node(__LINE__,n,d)
722 static IHTMLDOMNode *_clone_node(unsigned line, IUnknown *unk, VARIANT_BOOL deep)
723 {
724 IHTMLDOMNode *node = _get_node_iface(line, unk);
725 IHTMLDOMNode *ret = NULL;
726 HRESULT hres;
727
728 hres = IHTMLDOMNode_cloneNode(node, deep, &ret);
729 IHTMLDOMNode_Release(node);
730 ok_(__FILE__,line)(hres == S_OK, "cloneNode failed: %08x\n", hres);
731 ok_(__FILE__,line)(ret != NULL, "ret == NULL\n");
732
733 return ret;
734
735 }
736
737 #define test_elem_tag(u,n) _test_elem_tag(__LINE__,u,n)
738 static void _test_elem_tag(unsigned line, IUnknown *unk, const char *extag)
739 {
740 IHTMLElement *elem = _get_elem_iface(line, unk);
741 BSTR tag;
742 HRESULT hres;
743
744 hres = IHTMLElement_get_tagName(elem, &tag);
745 IHTMLElement_Release(elem);
746 ok_(__FILE__, line) (hres == S_OK, "get_tagName failed: %08x\n", hres);
747 ok_(__FILE__, line) (!strcmp_wa(tag, extag), "got tag: %s, expected %s\n", wine_dbgstr_w(tag), extag);
748
749 SysFreeString(tag);
750 }
751
752 #define test_elem_type(ifc,t) _test_elem_type(__LINE__,ifc,t)
753 static void _test_elem_type(unsigned line, IUnknown *unk, elem_type_t type)
754 {
755 _test_elem_tag(line, unk, elem_type_infos[type].tag);
756 _test_ifaces(line, unk, elem_type_infos[type].iids);
757
758 if(elem_type_infos[type].dispiid && type != ET_A)
759 _test_disp(line, unk, elem_type_infos[type].dispiid, "[object]");
760 }
761
762 #define get_node_type(n) _get_node_type(__LINE__,n)
763 static LONG _get_node_type(unsigned line, IUnknown *unk)
764 {
765 IHTMLDOMNode *node = _get_node_iface(line, unk);
766 LONG type = -1;
767 HRESULT hres;
768
769 hres = IHTMLDOMNode_get_nodeType(node, &type);
770 ok(hres == S_OK, "get_nodeType failed: %08x\n", hres);
771
772 IHTMLDOMNode_Release(node);
773
774 return type;
775 }
776
777 #define get_child_nodes(u) _get_child_nodes(__LINE__,u)
778 static IHTMLDOMChildrenCollection *_get_child_nodes(unsigned line, IUnknown *unk)
779 {
780 IHTMLDOMNode *node = _get_node_iface(line, unk);
781 IHTMLDOMChildrenCollection *col = NULL;
782 IDispatch *disp;
783 HRESULT hres;
784
785 hres = IHTMLDOMNode_get_childNodes(node, &disp);
786 IHTMLDOMNode_Release(node);
787 ok_(__FILE__,line) (hres == S_OK, "get_childNodes failed: %08x\n", hres);
788 if(FAILED(hres))
789 return NULL;
790
791 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDOMChildrenCollection, (void**)&col);
792 IDispatch_Release(disp);
793 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMChildrenCollection: %08x\n", hres);
794
795 return col;
796 }
797
798 #define get_child_item(c,i) _get_child_item(__LINE__,c,i)
799 static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, LONG idx)
800 {
801 IHTMLDOMNode *node = NULL;
802 IDispatch *disp;
803 HRESULT hres;
804
805 hres = IHTMLDOMChildrenCollection_item(col, idx, &disp);
806 ok(hres == S_OK, "item failed: %08x\n", hres);
807
808 node = _get_node_iface(line, (IUnknown*)disp);
809 IDispatch_Release(disp);
810
811 return node;
812 }
813
814 #define test_elem_attr(e,n,v) _test_elem_attr(__LINE__,e,n,v)
815 static void _test_elem_attr(unsigned line, IHTMLElement *elem, const char *name, const char *exval)
816 {
817 VARIANT value;
818 BSTR tmp;
819 HRESULT hres;
820
821 VariantInit(&value);
822
823 tmp = a2bstr(name);
824 hres = IHTMLElement_getAttribute(elem, tmp, 0, &value);
825 SysFreeString(tmp);
826 ok_(__FILE__,line) (hres == S_OK, "getAttribute failed: %08x\n", hres);
827
828 if(exval) {
829 ok_(__FILE__,line) (V_VT(&value) == VT_BSTR, "vt=%d\n", V_VT(&value));
830 ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&value), exval), "unexpected value %s\n", wine_dbgstr_w(V_BSTR(&value)));
831 }else {
832 ok_(__FILE__,line) (V_VT(&value) == VT_NULL, "vt=%d\n", V_VT(&value));
833 }
834
835 VariantClear(&value);
836 }
837
838 #define test_elem_offset(u) _test_elem_offset(__LINE__,u)
839 static void _test_elem_offset(unsigned line, IUnknown *unk)
840 {
841 IHTMLElement *elem = _get_elem_iface(line, unk);
842 LONG l;
843 HRESULT hres;
844
845 hres = IHTMLElement_get_offsetTop(elem, &l);
846 ok_(__FILE__,line) (hres == S_OK, "get_offsetTop failed: %08x\n", hres);
847
848 hres = IHTMLElement_get_offsetHeight(elem, &l);
849 ok_(__FILE__,line) (hres == S_OK, "get_offsetHeight failed: %08x\n", hres);
850
851 hres = IHTMLElement_get_offsetWidth(elem, &l);
852 ok_(__FILE__,line) (hres == S_OK, "get_offsetWidth failed: %08x\n", hres);
853
854 IHTMLElement_Release(elem);
855 }
856
857 #define get_doc_node(d) _get_doc_node(__LINE__,d)
858 static IHTMLDocument2 *_get_doc_node(unsigned line, IHTMLDocument2 *doc)
859 {
860 IHTMLWindow2 *window;
861 IHTMLDocument2 *ret;
862 HRESULT hres;
863
864 hres = IHTMLDocument2_get_parentWindow(doc, &window);
865 ok_(__FILE__,line)(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
866
867 hres = IHTMLWindow2_get_document(window, &ret);
868 ok_(__FILE__,line)(hres == S_OK, "get_document failed: %08x\n", hres);
869 ok_(__FILE__,line)(ret != NULL, "document = NULL\n");
870
871 return ret;
872 }
873
874 #define test_window_name(d,e) _test_window_name(__LINE__,d,e)
875 static void _test_window_name(unsigned line, IHTMLWindow2 *window, const char *exname)
876 {
877 BSTR name;
878 HRESULT hres;
879
880 hres = IHTMLWindow2_get_name(window, &name);
881 ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres);
882 if(exname)
883 ok_(__FILE__,line)(!strcmp_wa(name, exname), "name = %s\n", wine_dbgstr_w(name));
884 else
885 ok_(__FILE__,line)(!name, "name = %s\n", wine_dbgstr_w(name));
886 }
887
888 #define set_window_name(w,n) _set_window_name(__LINE__,w,n)
889 static void _set_window_name(unsigned line, IHTMLWindow2 *window, const char *name)
890 {
891 BSTR str;
892 HRESULT hres;
893
894 str = a2bstr(name);
895 hres = IHTMLWindow2_put_name(window, str);
896 SysFreeString(str);
897 ok_(__FILE__,line)(hres == S_OK, "put_name failed: %08x\n", hres);
898
899 _test_window_name(line, window, name);
900 }
901
902 #define test_window_length(w,l) _test_window_length(__LINE__,w,l)
903 static void _test_window_length(unsigned line, IHTMLWindow2 *window, LONG exlen)
904 {
905 LONG length = -1;
906 HRESULT hres;
907
908 hres = IHTMLWindow2_get_length(window, &length);
909 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
910 ok_(__FILE__,line)(length == exlen, "length = %d, expected %d\n", length, exlen);
911 }
912
913 #define get_frame_content_window(e) _get_frame_content_window(__LINE__,e)
914 static IHTMLWindow2 *_get_frame_content_window(unsigned line, IUnknown *elem)
915 {
916 IHTMLFrameBase2 *base2;
917 IHTMLWindow2 *window;
918 HRESULT hres;
919
920 hres = IUnknown_QueryInterface(elem, &IID_IHTMLFrameBase2, (void**)&base2);
921 ok(hres == S_OK, "Could not get IHTMFrameBase2 iface: %08x\n", hres);
922
923 window = NULL;
924 hres = IHTMLFrameBase2_get_contentWindow(base2, &window);
925 IHTMLFrameBase2_Release(base2);
926 ok(hres == S_OK, "get_contentWindow failed: %08x\n", hres);
927 ok(window != NULL, "contentWindow = NULL\n");
928
929 return window;
930 }
931
932 static void test_get_set_attr(IHTMLDocument2 *doc)
933 {
934 IHTMLElement *elem;
935 IHTMLDocument3 *doc3;
936 HRESULT hres;
937 BSTR bstr;
938 VARIANT val;
939
940 /* grab an element to test with */
941 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
942 ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres);
943
944 hres = IHTMLDocument3_get_documentElement(doc3, &elem);
945 IHTMLDocument3_Release(doc3);
946 ok(hres == S_OK, "get_documentElement failed: %08x\n", hres);
947
948 /* get a non-present attribute */
949 bstr = a2bstr("notAnAttribute");
950 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
951 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
952 ok(V_VT(&val) == VT_NULL, "variant type should have been VT_NULL (0x%x), was: 0x%x\n", VT_NULL, V_VT(&val));
953 VariantClear(&val);
954 SysFreeString(bstr);
955
956 /* get a present attribute */
957 bstr = a2bstr("scrollHeight");
958 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
959 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
960 ok(V_VT(&val) == VT_I4, "variant type should have been VT_I4 (0x%x), was: 0x%x\n", VT_I4, V_VT(&val));
961 VariantClear(&val);
962 SysFreeString(bstr);
963
964 /* create a new BSTR attribute */
965 bstr = a2bstr("newAttribute");
966
967 V_VT(&val) = VT_BSTR;
968 V_BSTR(&val) = a2bstr("the value");
969 hres = IHTMLElement_setAttribute(elem, bstr, val, 0);
970 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
971 VariantClear(&val);
972
973 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
974 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
975 ok(V_VT(&val) == VT_BSTR, "variant type should have been VT_BSTR (0x%x), was: 0x%x\n", VT_BSTR, V_VT(&val));
976 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)));
977 VariantClear(&val);
978
979 /* overwrite the attribute with a BOOL */
980 V_VT(&val) = VT_BOOL;
981 V_BOOL(&val) = VARIANT_TRUE;
982 hres = IHTMLElement_setAttribute(elem, bstr, val, 0);
983 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
984 VariantClear(&val);
985
986 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
987 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
988 ok(V_VT(&val) == VT_BOOL, "variant type should have been VT_BOOL (0x%x), was: 0x%x\n", VT_BOOL, V_VT(&val));
989 ok(V_BOOL(&val) == VARIANT_TRUE, "variant value should have been VARIANT_TRUE (0x%x), was %d\n", VARIANT_TRUE, V_BOOL(&val));
990 VariantClear(&val);
991
992 SysFreeString(bstr);
993
994 /* case-insensitive */
995 bstr = a2bstr("newattribute");
996 hres = IHTMLElement_getAttribute(elem, bstr, 0, &val);
997 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
998 ok(V_VT(&val) == VT_BOOL, "variant type should have been VT_BOOL (0x%x), was: 0x%x\n", VT_BOOL, V_VT(&val));
999 ok(V_BOOL(&val) == VARIANT_TRUE, "variant value should have been VARIANT_TRUE (0x%x), was %d\n", VARIANT_TRUE, V_BOOL(&val));
1000 VariantClear(&val);
1001 SysFreeString(bstr);
1002
1003 IHTMLElement_Release(elem);
1004 }
1005
1006 #define get_doc_elem(d) _get_doc_elem(__LINE__,d)
1007 static IHTMLElement *_get_doc_elem(unsigned line, IHTMLDocument2 *doc)
1008 {
1009 IHTMLElement *elem;
1010 IHTMLDocument3 *doc3;
1011 HRESULT hres;
1012
1013 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
1014 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3 interface: %08x\n", hres);
1015 hres = IHTMLDocument3_get_documentElement(doc3, &elem);
1016 ok_(__FILE__,line) (hres == S_OK, "get_documentElement failed: %08x\n", hres);
1017 IHTMLDocument3_Release(doc3);
1018
1019 return elem;
1020 }
1021
1022 #define test_anchor_href(a,h) _test_anchor_href(__LINE__,a,h)
1023 static void _test_anchor_href(unsigned line, IUnknown *unk, const char *exhref)
1024 {
1025 IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
1026 BSTR str;
1027 HRESULT hres;
1028
1029 hres = IHTMLAnchorElement_get_href(anchor, &str);
1030 ok_(__FILE__,line)(hres == S_OK, "get_href failed: %08x\n", hres);
1031 ok_(__FILE__,line)(!strcmp_wa(str, exhref), "href = %s, expected %s\n", wine_dbgstr_w(str), exhref);
1032 SysFreeString(str);
1033
1034 _test_disp_value(line, unk, exhref);
1035 }
1036
1037 #define test_option_text(o,t) _test_option_text(__LINE__,o,t)
1038 static void _test_option_text(unsigned line, IHTMLOptionElement *option, const char *text)
1039 {
1040 BSTR bstr;
1041 HRESULT hres;
1042
1043 hres = IHTMLOptionElement_get_text(option, &bstr);
1044 ok_(__FILE__,line) (hres == S_OK, "get_text failed: %08x\n", hres);
1045 ok_(__FILE__,line) (!strcmp_wa(bstr, text), "text=%s\n", wine_dbgstr_w(bstr));
1046 SysFreeString(bstr);
1047 }
1048
1049 #define test_option_put_text(o,t) _test_option_put_text(__LINE__,o,t)
1050 static void _test_option_put_text(unsigned line, IHTMLOptionElement *option, const char *text)
1051 {
1052 BSTR bstr;
1053 HRESULT hres;
1054
1055 bstr = a2bstr(text);
1056 hres = IHTMLOptionElement_put_text(option, bstr);
1057 SysFreeString(bstr);
1058 ok(hres == S_OK, "put_text failed: %08x\n", hres);
1059
1060 _test_option_text(line, option, text);
1061 }
1062
1063 #define test_option_value(o,t) _test_option_value(__LINE__,o,t)
1064 static void _test_option_value(unsigned line, IHTMLOptionElement *option, const char *value)
1065 {
1066 BSTR bstr;
1067 HRESULT hres;
1068
1069 hres = IHTMLOptionElement_get_value(option, &bstr);
1070 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
1071 ok_(__FILE__,line) (!strcmp_wa(bstr, value), "value=%s\n", wine_dbgstr_w(bstr));
1072 SysFreeString(bstr);
1073 }
1074
1075 #define test_option_put_value(o,t) _test_option_put_value(__LINE__,o,t)
1076 static void _test_option_put_value(unsigned line, IHTMLOptionElement *option, const char *value)
1077 {
1078 BSTR bstr;
1079 HRESULT hres;
1080
1081 bstr = a2bstr(value);
1082 hres = IHTMLOptionElement_put_value(option, bstr);
1083 SysFreeString(bstr);
1084 ok(hres == S_OK, "put_value failed: %08x\n", hres);
1085
1086 _test_option_value(line, option, value);
1087 }
1088
1089 #define create_option_elem(d,t,v) _create_option_elem(__LINE__,d,t,v)
1090 static IHTMLOptionElement *_create_option_elem(unsigned line, IHTMLDocument2 *doc,
1091 const char *txt, const char *val)
1092 {
1093 IHTMLOptionElementFactory *factory;
1094 IHTMLOptionElement *option;
1095 IHTMLWindow2 *window;
1096 VARIANT text, value, empty;
1097 HRESULT hres;
1098
1099 hres = IHTMLDocument2_get_parentWindow(doc, &window);
1100 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
1101
1102 hres = IHTMLWindow2_get_Option(window, &factory);
1103 IHTMLWindow2_Release(window);
1104 ok_(__FILE__,line) (hres == S_OK, "get_Option failed: %08x\n", hres);
1105
1106 V_VT(&text) = VT_BSTR;
1107 V_BSTR(&text) = a2bstr(txt);
1108 V_VT(&value) = VT_BSTR;
1109 V_BSTR(&value) = a2bstr(val);
1110 V_VT(&empty) = VT_EMPTY;
1111
1112 hres = IHTMLOptionElementFactory_create(factory, text, value, empty, empty, &option);
1113 ok_(__FILE__,line) (hres == S_OK, "create failed: %08x\n", hres);
1114
1115 IHTMLOptionElementFactory_Release(factory);
1116 VariantClear(&text);
1117 VariantClear(&value);
1118
1119 _test_option_text(line, option, txt);
1120 _test_option_value(line, option, val);
1121
1122 return option;
1123 }
1124
1125 #define test_img_width(o,w) _test_img_width(__LINE__,o,w)
1126 static void _test_img_width(unsigned line, IHTMLImgElement *img, const long exp)
1127 {
1128 LONG found = -1;
1129 HRESULT hres;
1130
1131 hres = IHTMLImgElement_get_width(img, &found);
1132 todo_wine ok_(__FILE__,line) (hres == S_OK, "get_width failed: %08x\n", hres);
1133 todo_wine ok_(__FILE__,line) (found == exp, "width=%d\n", found);
1134 }
1135
1136 #define test_img_put_width(o,w) _test_img_put_width(__LINE__,o,w)
1137 static void _test_img_put_width(unsigned line, IHTMLImgElement *img, const long width)
1138 {
1139 HRESULT hres;
1140
1141 hres = IHTMLImgElement_put_width(img, width);
1142 todo_wine ok(hres == S_OK, "put_width failed: %08x\n", hres);
1143
1144 _test_img_width(line, img, width);
1145 }
1146
1147 #define test_img_height(o,h) _test_img_height(__LINE__,o,h)
1148 static void _test_img_height(unsigned line, IHTMLImgElement *img, const long exp)
1149 {
1150 LONG found = -1;
1151 HRESULT hres;
1152
1153 hres = IHTMLImgElement_get_height(img, &found);
1154 todo_wine ok_(__FILE__,line) (hres == S_OK, "get_height failed: %08x\n", hres);
1155 todo_wine ok_(__FILE__,line) (found == exp, "height=%d\n", found);
1156 }
1157
1158 #define test_img_put_height(o,w) _test_img_put_height(__LINE__,o,w)
1159 static void _test_img_put_height(unsigned line, IHTMLImgElement *img, const long height)
1160 {
1161 HRESULT hres;
1162
1163 hres = IHTMLImgElement_put_height(img, height);
1164 todo_wine ok(hres == S_OK, "put_height failed: %08x\n", hres);
1165
1166 _test_img_height(line, img, height);
1167 }
1168
1169 #define create_img_elem(d,t,v) _create_img_elem(__LINE__,d,t,v)
1170 static IHTMLImgElement *_create_img_elem(unsigned line, IHTMLDocument2 *doc,
1171 LONG wdth, LONG hght)
1172 {
1173 IHTMLImageElementFactory *factory;
1174 IHTMLImgElement *img;
1175 IHTMLWindow2 *window;
1176 VARIANT width, height;
1177 char buf[16];
1178 HRESULT hres;
1179
1180 hres = IHTMLDocument2_get_parentWindow(doc, &window);
1181 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
1182
1183 hres = IHTMLWindow2_get_Image(window, &factory);
1184 IHTMLWindow2_Release(window);
1185 ok_(__FILE__,line) (hres == S_OK, "get_Image failed: %08x\n", hres);
1186
1187 test_ifaces((IUnknown*)factory, img_factory_iids);
1188 test_disp((IUnknown*)factory, &IID_IHTMLImageElementFactory, "[object]");
1189
1190 if(wdth >= 0){
1191 snprintf(buf, 16, "%d", wdth);
1192 V_VT(&width) = VT_BSTR;
1193 V_BSTR(&width) = a2bstr(buf);
1194 }else{
1195 V_VT(&width) = VT_EMPTY;
1196 wdth = 0;
1197 }
1198
1199 if(hght >= 0){
1200 snprintf(buf, 16, "%d", hght);
1201 V_VT(&height) = VT_BSTR;
1202 V_BSTR(&height) = a2bstr(buf);
1203 }else{
1204 V_VT(&height) = VT_EMPTY;
1205 hght = 0;
1206 }
1207
1208 hres = IHTMLImageElementFactory_create(factory, width, height, &img);
1209 ok_(__FILE__,line) (hres == S_OK, "create failed: %08x\n", hres);
1210
1211 IHTMLImageElementFactory_Release(factory);
1212 VariantClear(&width);
1213 VariantClear(&height);
1214
1215 if(SUCCEEDED(hres)) {
1216 _test_img_width(line, img, wdth);
1217 _test_img_height(line, img, hght);
1218 return img;
1219 }
1220
1221 return NULL;
1222 }
1223
1224 #define test_select_length(s,l) _test_select_length(__LINE__,s,l)
1225 static void _test_select_length(unsigned line, IHTMLSelectElement *select, LONG length)
1226 {
1227 LONG len = 0xdeadbeef;
1228 HRESULT hres;
1229
1230 hres = IHTMLSelectElement_get_length(select, &len);
1231 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
1232 ok_(__FILE__,line) (len == length, "len=%d, expected %d\n", len, length);
1233 }
1234
1235 #define test_select_selidx(s,i) _test_select_selidx(__LINE__,s,i)
1236 static void _test_select_selidx(unsigned line, IHTMLSelectElement *select, LONG index)
1237 {
1238 LONG idx = 0xdeadbeef;
1239 HRESULT hres;
1240
1241 hres = IHTMLSelectElement_get_selectedIndex(select, &idx);
1242 ok_(__FILE__,line) (hres == S_OK, "get_selectedIndex failed: %08x\n", hres);
1243 ok_(__FILE__,line) (idx == index, "idx=%d, expected %d\n", idx, index);
1244 }
1245
1246 #define test_select_put_selidx(s,i) _test_select_put_selidx(__LINE__,s,i)
1247 static void _test_select_put_selidx(unsigned line, IHTMLSelectElement *select, LONG index)
1248 {
1249 HRESULT hres;
1250
1251 hres = IHTMLSelectElement_put_selectedIndex(select, index);
1252 ok_(__FILE__,line) (hres == S_OK, "get_selectedIndex failed: %08x\n", hres);
1253 _test_select_selidx(line, select, index);
1254 }
1255
1256 #define test_select_value(s,v) _test_select_value(__LINE__,s,v)
1257 static void _test_select_value(unsigned line, IHTMLSelectElement *select, const char *exval)
1258 {
1259 BSTR val;
1260 HRESULT hres;
1261
1262 hres = IHTMLSelectElement_get_value(select, &val);
1263 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
1264 if(exval)
1265 ok_(__FILE__,line) (!strcmp_wa(val, exval), "unexpected value %s\n", wine_dbgstr_w(val));
1266 else
1267 ok_(__FILE__,line) (val == NULL, "val=%s, expected NULL\n", wine_dbgstr_w(val));
1268 }
1269
1270 #define test_select_set_value(s,v) _test_select_set_value(__LINE__,s,v)
1271 static void _test_select_set_value(unsigned line, IHTMLSelectElement *select, const char *val)
1272 {
1273 BSTR bstr;
1274 HRESULT hres;
1275
1276 bstr = a2bstr(val);
1277 hres = IHTMLSelectElement_put_value(select, bstr);
1278 SysFreeString(bstr);
1279 ok_(__FILE__,line) (hres == S_OK, "put_value failed: %08x\n", hres);
1280 }
1281
1282 #define test_select_type(s,t) _test_select_type(__LINE__,s,t)
1283 static void _test_select_type(unsigned line, IHTMLSelectElement *select, const char *extype)
1284 {
1285 BSTR type;
1286 HRESULT hres;
1287
1288 hres = IHTMLSelectElement_get_type(select, &type);
1289 ok_(__FILE__,line) (hres == S_OK, "get_type failed: %08x\n", hres);
1290 ok_(__FILE__,line) (!strcmp_wa(type, extype), "type=%s, expected %s\n", wine_dbgstr_w(type), extype);
1291 }
1292
1293 #define test_range_text(r,t) _test_range_text(__LINE__,r,t)
1294 static void _test_range_text(unsigned line, IHTMLTxtRange *range, const char *extext)
1295 {
1296 BSTR text;
1297 HRESULT hres;
1298
1299 hres = IHTMLTxtRange_get_text(range, &text);
1300 ok_(__FILE__, line) (hres == S_OK, "get_text failed: %08x\n", hres);
1301
1302 if(extext) {
1303 ok_(__FILE__, line) (text != NULL, "text == NULL\n");
1304 ok_(__FILE__, line) (!strcmp_wa(text, extext), "text=%s, expected %s\n", wine_dbgstr_w(text), extext);
1305 }else {
1306 ok_(__FILE__, line) (text == NULL, "text=%s, expected NULL\n", wine_dbgstr_w(text));
1307 }
1308
1309 SysFreeString(text);
1310
1311 }
1312
1313 #define test_range_collapse(r,b) _test_range_collapse(__LINE__,r,b)
1314 static void _test_range_collapse(unsigned line, IHTMLTxtRange *range, BOOL b)
1315 {
1316 HRESULT hres;
1317
1318 hres = IHTMLTxtRange_collapse(range, b);
1319 ok_(__FILE__, line) (hres == S_OK, "collapse failed: %08x\n", hres);
1320 _test_range_text(line, range, NULL);
1321 }
1322
1323 #define test_range_expand(r,u,b,t) _test_range_expand(__LINE__,r,u,b,t)
1324 static void _test_range_expand(unsigned line, IHTMLTxtRange *range, LPWSTR unit,
1325 VARIANT_BOOL exb, const char *extext)
1326 {
1327 VARIANT_BOOL b = 0xe0e0;
1328 HRESULT hres;
1329
1330 hres = IHTMLTxtRange_expand(range, unit, &b);
1331 ok_(__FILE__,line) (hres == S_OK, "expand failed: %08x\n", hres);
1332 ok_(__FILE__,line) (b == exb, "b=%x, expected %x\n", b, exb);
1333 _test_range_text(line, range, extext);
1334 }
1335
1336 #define test_range_move(r,u,c,e) _test_range_move(__LINE__,r,u,c,e)
1337 static void _test_range_move(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt)
1338 {
1339 LONG c = 0xdeadbeef;
1340 HRESULT hres;
1341
1342 hres = IHTMLTxtRange_move(range, unit, cnt, &c);
1343 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
1344 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
1345 _test_range_text(line, range, NULL);
1346 }
1347
1348 #define test_range_movestart(r,u,c,e) _test_range_movestart(__LINE__,r,u,c,e)
1349 static void _test_range_movestart(unsigned line, IHTMLTxtRange *range,
1350 LPWSTR unit, LONG cnt, LONG excnt)
1351 {
1352 LONG c = 0xdeadbeef;
1353 HRESULT hres;
1354
1355 hres = IHTMLTxtRange_moveStart(range, unit, cnt, &c);
1356 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
1357 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
1358 }
1359
1360 #define test_range_moveend(r,u,c,e) _test_range_moveend(__LINE__,r,u,c,e)
1361 static void _test_range_moveend(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt)
1362 {
1363 LONG c = 0xdeadbeef;
1364 HRESULT hres;
1365
1366 hres = IHTMLTxtRange_moveEnd(range, unit, cnt, &c);
1367 ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres);
1368 ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt);
1369 }
1370
1371 #define test_range_put_text(r,t) _test_range_put_text(__LINE__,r,t)
1372 static void _test_range_put_text(unsigned line, IHTMLTxtRange *range, const char *text)
1373 {
1374 HRESULT hres;
1375 BSTR bstr = a2bstr(text);
1376
1377 hres = IHTMLTxtRange_put_text(range, bstr);
1378 ok_(__FILE__,line) (hres == S_OK, "put_text failed: %08x\n", hres);
1379 SysFreeString(bstr);
1380 _test_range_text(line, range, NULL);
1381 }
1382
1383 #define test_range_inrange(r1,r2,b) _test_range_inrange(__LINE__,r1,r2,b)
1384 static void _test_range_inrange(unsigned line, IHTMLTxtRange *range1, IHTMLTxtRange *range2, VARIANT_BOOL exb)
1385 {
1386 VARIANT_BOOL b;
1387 HRESULT hres;
1388
1389 b = 0xe0e0;
1390 hres = IHTMLTxtRange_inRange(range1, range2, &b);
1391 ok_(__FILE__,line) (hres == S_OK, "(1->2) isEqual failed: %08x\n", hres);
1392 ok_(__FILE__,line) (b == exb, "(1->2) b=%x, expected %x\n", b, exb);
1393 }
1394
1395 #define test_range_isequal(r1,r2,b) _test_range_isequal(__LINE__,r1,r2,b)
1396 static void _test_range_isequal(unsigned line, IHTMLTxtRange *range1, IHTMLTxtRange *range2, VARIANT_BOOL exb)
1397 {
1398 VARIANT_BOOL b;
1399 HRESULT hres;
1400
1401 b = 0xe0e0;
1402 hres = IHTMLTxtRange_isEqual(range1, range2, &b);
1403 ok_(__FILE__,line) (hres == S_OK, "(1->2) isEqual failed: %08x\n", hres);
1404 ok_(__FILE__,line) (b == exb, "(1->2) b=%x, expected %x\n", b, exb);
1405
1406 b = 0xe0e0;
1407 hres = IHTMLTxtRange_isEqual(range2, range1, &b);
1408 ok_(__FILE__,line) (hres == S_OK, "(2->1) isEqual failed: %08x\n", hres);
1409 ok_(__FILE__,line) (b == exb, "(2->1) b=%x, expected %x\n", b, exb);
1410
1411 if(exb) {
1412 test_range_inrange(range1, range2, VARIANT_TRUE);
1413 test_range_inrange(range2, range1, VARIANT_TRUE);
1414 }
1415 }
1416
1417 #define test_range_parent(r,t) _test_range_parent(__LINE__,r,t)
1418 static void _test_range_parent(unsigned line, IHTMLTxtRange *range, elem_type_t type)
1419 {
1420 IHTMLElement *elem;
1421 HRESULT hres;
1422
1423 hres = IHTMLTxtRange_parentElement(range, &elem);
1424 ok_(__FILE__,line) (hres == S_OK, "parentElement failed: %08x\n", hres);
1425
1426 _test_elem_type(line, (IUnknown*)elem, type);
1427
1428 IHTMLElement_Release(elem);
1429 }
1430
1431 #define test_elem_collection(c,t,l) _test_elem_collection(__LINE__,c,t,l)
1432 static void _test_elem_collection(unsigned line, IUnknown *unk,
1433 const elem_type_t *elem_types, LONG exlen)
1434 {
1435 IHTMLElementCollection *col;
1436 LONG len;
1437 DWORD i;
1438 VARIANT name, index;
1439 IDispatch *disp, *disp2;
1440 HRESULT hres;
1441
1442 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElementCollection, (void**)&col);
1443 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElementCollection: %08x\n", hres);
1444
1445 test_disp((IUnknown*)col, &DIID_DispHTMLElementCollection, "[object]");
1446
1447 hres = IHTMLElementCollection_get_length(col, &len);
1448 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
1449 ok_(__FILE__,line) (len == exlen, "len=%d, expected %d\n", len, exlen);
1450
1451 if(len > exlen)
1452 len = exlen;
1453
1454 V_VT(&index) = VT_EMPTY;
1455
1456 for(i=0; i<len; i++) {
1457 V_VT(&name) = VT_I4;
1458 V_I4(&name) = i;
1459 disp = (void*)0xdeadbeef;
1460 hres = IHTMLElementCollection_item(col, name, index, &disp);
1461 ok_(__FILE__,line) (hres == S_OK, "item(%d) failed: %08x\n", i, hres);
1462 ok_(__FILE__,line) (disp != NULL, "item returned NULL\n");
1463 if(FAILED(hres) || !disp)
1464 continue;
1465
1466 _test_elem_type(line, (IUnknown*)disp, elem_types[i]);
1467
1468 if(!i) {
1469 V_VT(&name) = VT_UINT;
1470 V_I4(&name) = 0;
1471 disp2 = (void*)0xdeadbeef;
1472 hres = IHTMLElementCollection_item(col, name, index, &disp2);
1473 ok_(__FILE__,line) (hres == S_OK, "item(%d) failed: %08x\n", i, hres);
1474 ok_(__FILE__,line) (iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n");
1475 if(disp2)
1476 IDispatch_Release(disp2);
1477 }
1478
1479 IDispatch_Release(disp);
1480 }
1481
1482 V_VT(&name) = VT_I4;
1483 V_I4(&name) = len;
1484 disp = (void*)0xdeadbeef;
1485 hres = IHTMLElementCollection_item(col, name, index, &disp);
1486 ok_(__FILE__,line) (hres == S_OK, "item failed: %08x\n", hres);
1487 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
1488
1489 V_VT(&name) = VT_I4;
1490 V_I4(&name) = -1;
1491 disp = (void*)0xdeadbeef;
1492 hres = IHTMLElementCollection_item(col, name, index, &disp);
1493 ok_(__FILE__,line) (hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
1494 ok_(__FILE__,line) (disp == NULL, "disp != NULL\n");
1495
1496 IHTMLElementCollection_Release(col);
1497 }
1498
1499 #define test_elem_all(c,t,l) _test_elem_all(__LINE__,c,t,l)
1500 static void _test_elem_all(unsigned line, IUnknown *unk, const elem_type_t *elem_types, LONG exlen)
1501 {
1502 IHTMLElement *elem = _get_elem_iface(line, unk);
1503 IDispatch *disp;
1504 HRESULT hres;
1505
1506 hres = IHTMLElement_get_all(elem, &disp);
1507 IHTMLElement_Release(elem);
1508 ok_(__FILE__,line)(hres == S_OK, "get_all failed: %08x\n", hres);
1509
1510 _test_elem_collection(line, (IUnknown*)disp, elem_types, exlen);
1511 IDispatch_Release(disp);
1512 }
1513
1514 #define test_elem_getelembytag(u,t,l) _test_elem_getelembytag(__LINE__,u,t,l)
1515 static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t type, LONG exlen)
1516 {
1517 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
1518 IHTMLElementCollection *col = NULL;
1519 elem_type_t *types = NULL;
1520 BSTR tmp;
1521 int i;
1522 HRESULT hres;
1523
1524 tmp = a2bstr(elem_type_infos[type].tag);
1525 hres = IHTMLElement2_getElementsByTagName(elem, tmp, &col);
1526 SysFreeString(tmp);
1527 IHTMLElement2_Release(elem);
1528 ok_(__FILE__,line) (hres == S_OK, "getElementByTagName failed: %08x\n", hres);
1529 ok_(__FILE__,line) (col != NULL, "col == NULL\n");
1530
1531 if(exlen) {
1532 types = HeapAlloc(GetProcessHeap(), 0, exlen*sizeof(elem_type_t));
1533 for(i=0; i<exlen; i++)
1534 types[i] = type;
1535 }
1536
1537 _test_elem_collection(line, (IUnknown*)col, types, exlen);
1538
1539 HeapFree(GetProcessHeap(), 0, types);
1540 }
1541
1542 #define test_elem_innertext(e,t) _test_elem_innertext(__LINE__,e,t)
1543 static void _test_elem_innertext(unsigned line, IHTMLElement *elem, const char *extext)
1544 {
1545 BSTR text = NULL;
1546 HRESULT hres;
1547
1548 hres = IHTMLElement_get_innerText(elem, &text);
1549 ok_(__FILE__,line) (hres == S_OK, "get_innerText failed: %08x\n", hres);
1550 ok_(__FILE__,line) (!strcmp_wa(text, extext), "get_innerText returned %s expected %s\n",
1551 wine_dbgstr_w(text), extext);
1552 SysFreeString(text);
1553 }
1554
1555 #define test_elem_set_innertext(e,t) _test_elem_set_innertext(__LINE__,e,t)
1556 static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const char *text)
1557 {
1558 IHTMLDOMChildrenCollection *col;
1559 BSTR str;
1560 HRESULT hres;
1561
1562 str = a2bstr(text);
1563 hres = IHTMLElement_put_innerText(elem, str);
1564 ok_(__FILE__,line) (hres == S_OK, "put_innerText failed: %08x\n", hres);
1565 SysFreeString(str);
1566
1567 _test_elem_innertext(line, elem, text);
1568
1569
1570 col = _get_child_nodes(line, (IUnknown*)elem);
1571 ok(col != NULL, "col == NULL\n");
1572 if(col) {
1573 LONG length = 0, type;
1574 IHTMLDOMNode *node;
1575
1576 hres = IHTMLDOMChildrenCollection_get_length(col, &length);
1577 ok(hres == S_OK, "get_length failed: %08x\n", hres);
1578 ok(length == 1, "length = %d\n", length);
1579
1580 node = _get_child_item(line, col, 0);
1581 ok(node != NULL, "node == NULL\n");
1582 if(node) {
1583 type = _get_node_type(line, (IUnknown*)node);
1584 ok(type == 3, "type=%d\n", type);
1585 IHTMLDOMNode_Release(node);
1586 }
1587
1588 IHTMLDOMChildrenCollection_Release(col);
1589 }
1590
1591 }
1592
1593 #define test_elem_innerhtml(e,t) _test_elem_innerhtml(__LINE__,e,t)
1594 static void _test_elem_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
1595 {
1596 IHTMLElement *elem = _get_elem_iface(line, unk);
1597 BSTR html;
1598 HRESULT hres;
1599
1600 hres = IHTMLElement_get_innerHTML(elem, &html);
1601 ok_(__FILE__,line)(hres == S_OK, "get_innerHTML failed: %08x\n", hres);
1602 if(inner_html)
1603 ok_(__FILE__,line)(!strcmp_wa(html, inner_html), "unexpected innerHTML: %s\n", wine_dbgstr_w(html));
1604 else
1605 ok_(__FILE__,line)(!html, "innerHTML = %s\n", wine_dbgstr_w(html));
1606
1607 IHTMLElement_Release(elem);
1608 SysFreeString(html);
1609 }
1610
1611 #define test_elem_set_innerhtml(e,t) _test_elem_set_innerhtml(__LINE__,e,t)
1612 static void _test_elem_set_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
1613 {
1614 IHTMLElement *elem = _get_elem_iface(line, unk);
1615 BSTR html;
1616 HRESULT hres;
1617
1618 html = a2bstr(inner_html);
1619 hres = IHTMLElement_put_innerHTML(elem, html);
1620 ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08x\n", hres);
1621
1622 IHTMLElement_Release(elem);
1623 SysFreeString(html);
1624 }
1625
1626 #define test_elem_set_outerhtml(e,t) _test_elem_set_outerhtml(__LINE__,e,t)
1627 static void _test_elem_set_outerhtml(unsigned line, IUnknown *unk, const char *outer_html)
1628 {
1629 IHTMLElement *elem = _get_elem_iface(line, unk);
1630 BSTR html;
1631 HRESULT hres;
1632
1633 html = a2bstr(outer_html);
1634 hres = IHTMLElement_put_outerHTML(elem, html);
1635 ok_(__FILE__,line)(hres == S_OK, "put_outerHTML failed: %08x\n", hres);
1636
1637 IHTMLElement_Release(elem);
1638 SysFreeString(html);
1639 }
1640
1641 #define get_first_child(n) _get_first_child(__LINE__,n)
1642 static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk)
1643 {
1644 IHTMLDOMNode *node = _get_node_iface(line, unk);
1645 IHTMLDOMNode *child = NULL;
1646 HRESULT hres;
1647
1648 hres = IHTMLDOMNode_get_firstChild(node, &child);
1649 IHTMLDOMNode_Release(node);
1650 ok_(__FILE__,line) (hres == S_OK, "get_firstChild failed: %08x\n", hres);
1651
1652 return child;
1653 }
1654
1655 #define test_node_has_child(u,b) _test_node_has_child(__LINE__,u,b)
1656 static void _test_node_has_child(unsigned line, IUnknown *unk, VARIANT_BOOL exb)
1657 {
1658 IHTMLDOMNode *node = _get_node_iface(line, unk);
1659 VARIANT_BOOL b = 0xdead;
1660 HRESULT hres;
1661
1662 hres = IHTMLDOMNode_hasChildNodes(node, &b);
1663 ok_(__FILE__,line) (hres == S_OK, "hasChildNodes failed: %08x\n", hres);
1664 ok_(__FILE__,line) (b == exb, "hasChildNodes=%x, expected %x\n", b, exb);
1665
1666 IHTMLDOMNode_Release(node);
1667 }
1668
1669 #define test_node_get_parent(u) _test_node_get_parent(__LINE__,u)
1670 static IHTMLDOMNode *_test_node_get_parent(unsigned line, IUnknown *unk)
1671 {
1672 IHTMLDOMNode *node = _get_node_iface(line, unk);
1673 IHTMLDOMNode *parent;
1674 HRESULT hres;
1675
1676 hres = IHTMLDOMNode_get_parentNode(node, &parent);
1677 IHTMLDOMNode_Release(node);
1678 ok_(__FILE__,line) (hres == S_OK, "get_parentNode failed: %08x\n", hres);
1679
1680 return parent;
1681 }
1682
1683 #define node_get_next(u) _node_get_next(__LINE__,u)
1684 static IHTMLDOMNode *_node_get_next(unsigned line, IUnknown *unk)
1685 {
1686 IHTMLDOMNode *node = _get_node_iface(line, unk);
1687 IHTMLDOMNode *next;
1688 HRESULT hres;
1689
1690 hres = IHTMLDOMNode_get_nextSibling(node, &next);
1691 IHTMLDOMNode_Release(node);
1692 ok_(__FILE__,line) (hres == S_OK, "get_nextSiblibg failed: %08x\n", hres);
1693
1694 return next;
1695 }
1696
1697 #define test_elem_get_parent(u) _test_elem_get_parent(__LINE__,u)
1698 static IHTMLElement *_test_elem_get_parent(unsigned line, IUnknown *unk)
1699 {
1700 IHTMLElement *elem = _get_elem_iface(line, unk);
1701 IHTMLElement *parent;
1702 HRESULT hres;
1703
1704 hres = IHTMLElement_get_parentElement(elem, &parent);
1705 IHTMLElement_Release(elem);
1706 ok_(__FILE__,line) (hres == S_OK, "get_parentElement failed: %08x\n", hres);
1707
1708 return parent;
1709 }
1710
1711 #define test_elem3_get_disabled(i,b) _test_elem3_get_disabled(__LINE__,i,b)
1712 static void _test_elem3_get_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL exb)
1713 {
1714 IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
1715 VARIANT_BOOL disabled = 100;
1716 HRESULT hres;
1717
1718 if (!elem3) return;
1719 hres = IHTMLElement3_get_disabled(elem3, &disabled);
1720 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1721 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
1722 IHTMLElement3_Release(elem3);
1723 }
1724
1725 #define test_elem3_set_disabled(i,b) _test_elem3_set_disabled(__LINE__,i,b)
1726 static void _test_elem3_set_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL b)
1727 {
1728 IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
1729 HRESULT hres;
1730
1731 if (!elem3) return;
1732 hres = IHTMLElement3_put_disabled(elem3, b);
1733 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1734
1735 IHTMLElement3_Release(elem3);
1736 _test_elem3_get_disabled(line, unk, b);
1737 }
1738
1739 #define test_select_get_disabled(i,b) _test_select_get_disabled(__LINE__,i,b)
1740 static void _test_select_get_disabled(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL exb)
1741 {
1742 VARIANT_BOOL disabled = 100;
1743 HRESULT hres;
1744
1745 hres = IHTMLSelectElement_get_disabled(select, &disabled);
1746 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1747 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
1748
1749 _test_elem3_get_disabled(line, (IUnknown*)select, exb);
1750 }
1751
1752 #define test_text_length(u,l) _test_text_length(__LINE__,u,l)
1753 static void _test_text_length(unsigned line, IUnknown *unk, LONG l)
1754 {
1755 IHTMLDOMTextNode *text = _get_text_iface(line, unk);
1756 LONG length;
1757 HRESULT hres;
1758
1759 hres = IHTMLDOMTextNode_get_length(text, &length);
1760 ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
1761 ok_(__FILE__,line)(length == l, "length = %d, expected %d\n", length, l);
1762 IHTMLDOMTextNode_Release(text);
1763 }
1764
1765 #define test_select_set_disabled(i,b) _test_select_set_disabled(__LINE__,i,b)
1766 static void _test_select_set_disabled(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL b)
1767 {
1768 HRESULT hres;
1769
1770 hres = IHTMLSelectElement_put_disabled(select, b);
1771 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1772
1773 _test_select_get_disabled(line, select, b);
1774 }
1775
1776 #define elem_get_scroll_height(u) _elem_get_scroll_height(__LINE__,u)
1777 static LONG _elem_get_scroll_height(unsigned line, IUnknown *unk)
1778 {
1779 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
1780 IHTMLTextContainer *txtcont;
1781 LONG l = -1, l2 = -1;
1782 HRESULT hres;
1783
1784 hres = IHTMLElement2_get_scrollHeight(elem, &l);
1785 ok_(__FILE__,line) (hres == S_OK, "get_scrollHeight failed: %08x\n", hres);
1786 IHTMLElement2_Release(elem);
1787
1788 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
1789 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
1790
1791 hres = IHTMLTextContainer_get_scrollHeight(txtcont, &l2);
1792 IHTMLTextContainer_Release(txtcont);
1793 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollHeight failed: %d\n", l2);
1794 ok_(__FILE__,line) (l == l2, "unexpected height %d, expected %d\n", l2, l);
1795
1796 return l;
1797 }
1798
1799 #define elem_get_scroll_width(u) _elem_get_scroll_width(__LINE__,u)
1800 static LONG _elem_get_scroll_width(unsigned line, IUnknown *unk)
1801 {
1802 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
1803 IHTMLTextContainer *txtcont;
1804 LONG l = -1, l2 = -1;
1805 HRESULT hres;
1806
1807 hres = IHTMLElement2_get_scrollWidth(elem, &l);
1808 ok_(__FILE__,line) (hres == S_OK, "get_scrollWidth failed: %08x\n", hres);
1809 IHTMLElement2_Release(elem);
1810
1811 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
1812 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
1813
1814 hres = IHTMLTextContainer_get_scrollWidth(txtcont, &l2);
1815 IHTMLTextContainer_Release(txtcont);
1816 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollWidth failed: %d\n", l2);
1817 ok_(__FILE__,line) (l == l2, "unexpected width %d, expected %d\n", l2, l);
1818
1819 return l;
1820 }
1821
1822 #define elem_get_scroll_top(u) _elem_get_scroll_top(__LINE__,u)
1823 static LONG _elem_get_scroll_top(unsigned line, IUnknown *unk)
1824 {
1825 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
1826 IHTMLTextContainer *txtcont;
1827 LONG l = -1, l2 = -1;
1828 HRESULT hres;
1829
1830 hres = IHTMLElement2_get_scrollTop(elem, &l);
1831 ok_(__FILE__,line) (hres == S_OK, "get_scrollTop failed: %08x\n", hres);
1832 IHTMLElement2_Release(elem);
1833
1834 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
1835 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
1836
1837 hres = IHTMLTextContainer_get_scrollTop(txtcont, &l2);
1838 IHTMLTextContainer_Release(txtcont);
1839 ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollTop failed: %d\n", l2);
1840 ok_(__FILE__,line) (l == l2, "unexpected top %d, expected %d\n", l2, l);
1841
1842 return l;
1843 }
1844
1845 #define elem_get_scroll_left(u) _elem_get_scroll_left(__LINE__,u)
1846 static void _elem_get_scroll_left(unsigned line, IUnknown *unk)
1847 {
1848 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
1849 IHTMLTextContainer *txtcont;
1850 LONG l = -1, l2 = -1;
1851 HRESULT hres;
1852
1853 hres = IHTMLElement2_get_scrollLeft(elem, NULL);
1854 ok(hres == E_INVALIDARG, "expect E_INVALIDARG got 0x%08x\n", hres);
1855
1856 hres = IHTMLElement2_get_scrollLeft(elem, &l);
1857 ok(hres == S_OK, "get_scrollTop failed: %08x\n", hres);
1858 IHTMLElement2_Release(elem);
1859
1860 hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextContainer, (void**)&txtcont);
1861 ok(hres == S_OK, "Could not get IHTMLTextContainer: %08x\n", hres);
1862
1863 hres = IHTMLTextContainer_get_scrollLeft(txtcont, &l2);
1864 IHTMLTextContainer_Release(txtcont);
1865 ok(hres == S_OK, "IHTMLTextContainer::get_scrollLeft failed: %d\n", l2);
1866 ok(l == l2, "unexpected left %d, expected %d\n", l2, l);
1867 }
1868
1869 #define test_img_src(i,s) _test_img_src(__LINE__,i,s)
1870 static void _test_img_src(unsigned line, IUnknown *unk, const char *exsrc)
1871 {
1872 IHTMLImgElement *img = _get_img_iface(line, unk);
1873 BSTR src;
1874 HRESULT hres;
1875
1876 hres = IHTMLImgElement_get_src(img, &src);
1877 IHTMLImgElement_Release(img);
1878 ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
1879 ok_(__FILE__,line) (!strcmp_wa(src, exsrc), "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
1880 SysFreeString(src);
1881 }
1882
1883 #define test_img_set_src(u,s) _test_img_set_src(__LINE__,u,s)
1884 static void _test_img_set_src(unsigned line, IUnknown *unk, const char *src)
1885 {
1886 IHTMLImgElement *img = _get_img_iface(line, unk);
1887 BSTR tmp;
1888 HRESULT hres;
1889
1890 tmp = a2bstr(src);
1891 hres = IHTMLImgElement_put_src(img, tmp);
1892 IHTMLImgElement_Release(img);
1893 SysFreeString(tmp);
1894 ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
1895
1896 _test_img_src(line, unk, src);
1897 }
1898
1899 #define test_img_alt(u,a) _test_img_alt(__LINE__,u,a)
1900 static void _test_img_alt(unsigned line, IUnknown *unk, const char *exalt)
1901 {
1902 IHTMLImgElement *img = _get_img_iface(line, unk);
1903 BSTR alt;
1904 HRESULT hres;
1905
1906 hres = IHTMLImgElement_get_alt(img, &alt);
1907 ok_(__FILE__,line) (hres == S_OK, "get_alt failed: %08x\n", hres);
1908 if(exalt)
1909 ok_(__FILE__,line) (!strcmp_wa(alt, exalt), "inexopected alt %s\n", wine_dbgstr_w(alt));
1910 else
1911 ok_(__FILE__,line) (!alt, "alt != NULL\n");
1912 SysFreeString(alt);
1913 }
1914
1915 #define test_img_set_alt(u,a) _test_img_set_alt(__LINE__,u,a)
1916 static void _test_img_set_alt(unsigned line, IUnknown *unk, const char *alt)
1917 {
1918 IHTMLImgElement *img = _get_img_iface(line, unk);
1919 BSTR tmp;
1920 HRESULT hres;
1921
1922 tmp = a2bstr(alt);
1923 hres = IHTMLImgElement_put_alt(img, tmp);
1924 ok_(__FILE__,line) (hres == S_OK, "get_alt failed: %08x\n", hres);
1925 SysFreeString(tmp);
1926
1927 _test_img_alt(line, unk, alt);
1928 }
1929
1930 #define test_img_name(u, c) _test_img_name(__LINE__,u, c)
1931 static void _test_img_name(unsigned line, IUnknown *unk, const char *pValue)
1932 {
1933 IHTMLImgElement *img = _get_img_iface(line, unk);
1934 BSTR sName;
1935 HRESULT hres;
1936
1937 hres = IHTMLImgElement_get_name(img, &sName);
1938 ok_(__FILE__,line) (hres == S_OK, "get_Name failed: %08x\n", hres);
1939 ok_(__FILE__,line) (!strcmp_wa (sName, pValue), "expected '%s' got '%s'\n", pValue, wine_dbgstr_w(sName));
1940 SysFreeString(sName);
1941 }
1942
1943
1944 #define test_input_get_disabled(i,b) _test_input_get_disabled(__LINE__,i,b)
1945 static void _test_input_get_disabled(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
1946 {
1947 VARIANT_BOOL disabled = 100;
1948 HRESULT hres;
1949
1950 hres = IHTMLInputElement_get_disabled(input, &disabled);
1951 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1952 ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
1953
1954 _test_elem3_get_disabled(line, (IUnknown*)input, exb);
1955 }
1956
1957 #define test_input_set_disabled(i,b) _test_input_set_disabled(__LINE__,i,b)
1958 static void _test_input_set_disabled(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
1959 {
1960 HRESULT hres;
1961
1962 hres = IHTMLInputElement_put_disabled(input, b);
1963 ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
1964
1965 _test_input_get_disabled(line, input, b);
1966 }
1967
1968 #define test_input_get_defaultchecked(i,b) _test_input_get_defaultchecked(__LINE__,i,b)
1969 static void _test_input_get_defaultchecked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
1970 {
1971 VARIANT_BOOL checked = 100;
1972 HRESULT hres;
1973
1974 hres = IHTMLInputElement_get_defaultChecked(input, &checked);
1975 ok_(__FILE__,line) (hres == S_OK, "get_defaultChecked failed: %08x\n", hres);
1976 ok_(__FILE__,line) (checked == exb, "checked=%x, expected %x\n", checked, exb);
1977 }
1978
1979 #define test_input_set_defaultchecked(i,b) _test_input_set_defaultchecked(__LINE__,i,b)
1980 static void _test_input_set_defaultchecked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
1981 {
1982 HRESULT hres;
1983
1984 hres = IHTMLInputElement_put_defaultChecked(input, b);
1985 ok_(__FILE__,line) (hres == S_OK, "get_defaultChecked failed: %08x\n", hres);
1986
1987 _test_input_get_defaultchecked(line, input, b);
1988 }
1989
1990 #define test_input_get_checked(i,b) _test_input_get_checked(__LINE__,i,b)
1991 static void _test_input_get_checked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb)
1992 {
1993 VARIANT_BOOL checked = 100;
1994 HRESULT hres;
1995
1996 hres = IHTMLInputElement_get_checked(input, &checked);
1997 ok_(__FILE__,line) (hres == S_OK, "get_checked failed: %08x\n", hres);
1998 ok_(__FILE__,line) (checked == exb, "checked=%x, expected %x\n", checked, exb);
1999 }
2000
2001 #define test_input_set_checked(i,b) _test_input_set_checked(__LINE__,i,b)
2002 static void _test_input_set_checked(unsigned line, IHTMLInputElement *input, VARIANT_BOOL b)
2003 {
2004 HRESULT hres;
2005
2006 hres = IHTMLInputElement_put_checked(input, b);
2007 ok_(__FILE__,line) (hres == S_OK, "get_checked failed: %08x\n", hres);
2008
2009 _test_input_get_checked(line, input, b);
2010 }
2011
2012 #define test_input_value(o,t) _test_input_value(__LINE__,o,t)
2013 static void _test_input_value(unsigned line, IUnknown *unk, const char *exval)
2014 {
2015 IHTMLInputElement *input;
2016 BSTR bstr;
2017 HRESULT hres;
2018
2019 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
2020 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
2021 if(FAILED(hres))
2022 return;
2023
2024 hres = IHTMLInputElement_get_value(input, &bstr);
2025 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
2026 if(exval)
2027 ok_(__FILE__,line) (!strcmp_wa(bstr, exval), "value=%s\n", wine_dbgstr_w(bstr));
2028 else
2029 ok_(__FILE__,line) (!exval, "exval != NULL\n");
2030 SysFreeString(bstr);
2031 IHTMLInputElement_Release(input);
2032 }
2033
2034 #define test_input_put_value(o,v) _test_input_put_value(__LINE__,o,v)
2035 static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val)
2036 {
2037 IHTMLInputElement *input;
2038 BSTR bstr;
2039 HRESULT hres;
2040
2041 hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
2042 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
2043 if(FAILED(hres))
2044 return;
2045
2046 bstr = a2bstr(val);
2047 hres = IHTMLInputElement_get_value(input, &bstr);
2048 ok_(__FILE__,line) (hres == S_OK, "get_value failed: %08x\n", hres);
2049 SysFreeString(bstr);
2050 IHTMLInputElement_Release(input);
2051 }
2052
2053 #define test_input_src(i,s) _test_input_src(__LINE__,i,s)
2054 static void _test_input_src(unsigned line, IHTMLInputElement *input, const char *exsrc)
2055 {
2056 BSTR src;
2057 HRESULT hres;
2058
2059 hres = IHTMLInputElement_get_src(input, &src);
2060 ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
2061 if(exsrc)
2062 ok_(__FILE__,line) (!strcmp_wa(src, exsrc), "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
2063 else
2064 ok_(__FILE__,line) (!src, "get_src returned %s expected NULL\n", wine_dbgstr_w(src));
2065 SysFreeString(src);
2066 }
2067
2068 #define test_input_set_src(u,s) _test_input_set_src(__LINE__,u,s)
2069 static void _test_input_set_src(unsigned line, IHTMLInputElement *input, const char *src)
2070 {
2071 BSTR tmp;
2072 HRESULT hres;
2073
2074 tmp = a2bstr(src);
2075 hres = IHTMLInputElement_put_src(input, tmp);
2076 SysFreeString(tmp);
2077 ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
2078
2079 _test_input_src(line, input, src);
2080 }
2081
2082 #define test_elem_class(u,c) _test_elem_class(__LINE__,u,c)
2083 static void _test_elem_class(unsigned line, IUnknown *unk, const char *exclass)
2084 {
2085 IHTMLElement *elem = _get_elem_iface(line, unk);
2086 BSTR class = (void*)0xdeadbeef;
2087 HRESULT hres;
2088
2089 hres = IHTMLElement_get_className(elem, &class);
2090 IHTMLElement_Release(elem);
2091 ok_(__FILE__,line) (hres == S_OK, "get_className failed: %08x\n", hres);
2092 if(exclass)
2093 ok_(__FILE__,line) (!strcmp_wa(class, exclass), "unexpected className %s\n", wine_dbgstr_w(class));
2094 else
2095 ok_(__FILE__,line) (!class, "class != NULL\n");
2096 SysFreeString(class);
2097 }
2098
2099 #define test_elem_tabindex(u,i) _test_elem_tabindex(__LINE__,u,i)
2100 static void _test_elem_tabindex(unsigned line, IUnknown *unk, short exindex)
2101 {
2102 IHTMLElement2 *elem2 = _get_elem2_iface(line, unk);
2103 short index = -3;
2104 HRESULT hres;
2105
2106 hres = IHTMLElement2_get_tabIndex(elem2, &index);
2107 IHTMLElement2_Release(elem2);
2108 ok_(__FILE__,line) (hres == S_OK, "get_tabIndex failed: %08x\n", hres);
2109 ok_(__FILE__,line) (index == exindex, "unexpected index %d\n", index);
2110 }
2111
2112 #define test_elem_set_tabindex(u,i) _test_elem_set_tabindex(__LINE__,u,i)
2113 static void _test_elem_set_tabindex(unsigned line, IUnknown *unk, short index)
2114 {
2115 IHTMLElement2 *elem2 = _get_elem2_iface(line, unk);
2116 HRESULT hres;
2117
2118 hres = IHTMLElement2_put_tabIndex(elem2, index);
2119 IHTMLElement2_Release(elem2);
2120 ok_(__FILE__,line) (hres == S_OK, "get_tabIndex failed: %08x\n", hres);
2121
2122 _test_elem_tabindex(line, unk, index);
2123 }
2124
2125 #define test_elem_filters(u) _test_elem_filters(__LINE__,u)
2126 static void _test_elem_filters(unsigned line, IUnknown *unk)
2127 {
2128 IHTMLElement *elem = _get_elem_iface(line, unk);
2129 HRESULT hres;
2130 IHTMLFiltersCollection *filters;
2131
2132 hres = IHTMLElement_get_filters(elem, &filters);
2133 ok_(__FILE__,line) (hres == S_OK || broken(hres == REGDB_E_CLASSNOTREG) /* NT4 */,
2134 "get_filters failed: %08x\n", hres);
2135 if(hres == S_OK)
2136 {
2137 LONG len;
2138 IDispatchEx *dispex;
2139
2140 hres = IHTMLFiltersCollection_get_length(filters, &len);
2141 ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
2142 ok_(__FILE__,line) (len == 0, "expect 0 got %d\n", len);
2143
2144 hres = IHTMLFiltersCollection_QueryInterface(filters, &IID_IDispatchEx, (void**)&dispex);
2145 ok_(__FILE__,line) (hres == S_OK || broken(hres == E_NOINTERFACE),
2146 "Could not get IDispatchEx interface: %08x\n", hres);
2147 if(SUCCEEDED(hres)) {
2148 test_disp((IUnknown*)filters, &IID_IHTMLFiltersCollection, "[object]");
2149 IDispatchEx_Release(dispex);
2150 }
2151
2152 IHTMLFiltersCollection_Release(filters);
2153 }
2154
2155 IHTMLElement_Release(elem);
2156 }
2157
2158 #define test_elem_set_class(u,c) _test_elem_set_class(__LINE__,u,c)
2159 static void _test_elem_set_class(unsigned line, IUnknown *unk, const char *class)
2160 {
2161 IHTMLElement *elem = _get_elem_iface(line, unk);
2162 BSTR tmp;
2163 HRESULT hres;
2164
2165 tmp = class ? a2bstr(class) : NULL;
2166 hres = IHTMLElement_put_className(elem, tmp);
2167 IHTMLElement_Release(elem);
2168 ok_(__FILE__,line) (hres == S_OK, "put_className failed: %08x\n", hres);
2169 SysFreeString(tmp);
2170
2171 _test_elem_class(line, unk, class);
2172 }
2173
2174 #define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
2175 static void _test_elem_id(unsigned line, IUnknown *unk, const char *exid)
2176 {
2177 IHTMLElement *elem = _get_elem_iface(line, unk);
2178 BSTR id = (void*)0xdeadbeef;
2179 HRESULT hres;
2180
2181 hres = IHTMLElement_get_id(elem, &id);
2182 IHTMLElement_Release(elem);
2183 ok_(__FILE__,line) (hres == S_OK, "get_id failed: %08x\n", hres);
2184
2185 if(exid)
2186 ok_(__FILE__,line) (!strcmp_wa(id, exid), "unexpected id %s\n", wine_dbgstr_w(id));
2187 else
2188 ok_(__FILE__,line) (!id, "id=%s\n", wine_dbgstr_w(id));
2189
2190 SysFreeString(id);
2191 }
2192
2193 #define test_elem_put_id(u,i) _test_elem_put_id(__LINE__,u,i)
2194 static void _test_elem_put_id(unsigned line, IUnknown *unk, const char *new_id)
2195 {
2196 IHTMLElement *elem = _get_elem_iface(line, unk);
2197 BSTR tmp = a2bstr(new_id);
2198 HRESULT hres;
2199
2200 hres = IHTMLElement_put_id(elem, tmp);
2201 IHTMLElement_Release(elem);
2202 SysFreeString(tmp);
2203 ok_(__FILE__,line) (hres == S_OK, "put_id failed: %08x\n", hres);
2204
2205 _test_elem_id(line, unk, new_id);
2206 }
2207
2208 #define test_elem_title(u,t) _test_elem_title(__LINE__,u,t)
2209 static void _test_elem_title(unsigned line, IUnknown *unk, const char *extitle)
2210 {
2211 IHTMLElement *elem = _get_elem_iface(line, unk);
2212 BSTR title;
2213 HRESULT hres;
2214
2215 hres = IHTMLElement_get_title(elem, &title);
2216 IHTMLElement_Release(elem);
2217 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
2218 if(extitle)
2219 ok_(__FILE__,line) (!strcmp_wa(title, extitle), "unexpected title %s\n", wine_dbgstr_w(title));
2220 else
2221 ok_(__FILE__,line) (!title, "title=%s, expected NULL\n", wine_dbgstr_w(title));
2222
2223 SysFreeString(title);
2224 }
2225
2226 #define test_elem_set_title(u,t) _test_elem_set_title(__LINE__,u,t)
2227 static void _test_elem_set_title(unsigned line, IUnknown *unk, const char *title)
2228 {
2229 IHTMLElement *elem = _get_elem_iface(line, unk);
2230 BSTR tmp;
2231 HRESULT hres;
2232
2233 tmp = a2bstr(title);
2234 hres = IHTMLElement_put_title(elem, tmp);
2235 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
2236
2237 IHTMLElement_Release(elem);
2238 SysFreeString(tmp);
2239 }
2240
2241 #define test_node_get_value_str(u,e) _test_node_get_value_str(__LINE__,u,e)
2242 static void _test_node_get_value_str(unsigned line, IUnknown *unk, const char *exval)
2243 {
2244 IHTMLDOMNode *node = _get_node_iface(line, unk);
2245 VARIANT var;
2246 HRESULT hres;
2247
2248 hres = IHTMLDOMNode_get_nodeValue(node, &var);
2249 IHTMLDOMNode_Release(node);
2250 ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres);
2251
2252 if(exval) {
2253 ok_(__FILE__,line) (V_VT(&var) == VT_BSTR, "vt=%d\n", V_VT(&var));
2254 ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&var), exval), "unexpected value %s\n", wine_dbgstr_w(V_BSTR(&var)));
2255 }else {
2256 ok_(__FILE__,line) (V_VT(&var) == VT_NULL, "vt=%d, expected VT_NULL\n", V_VT(&var));
2257 }
2258
2259 VariantClear(&var);
2260 }
2261
2262 #define test_node_put_value_str(u,v) _test_node_put_value_str(__LINE__,u,v)
2263 static void _test_node_put_value_str(unsigned line, IUnknown *unk, const char *val)
2264 {
2265 IHTMLDOMNode *node = _get_node_iface(line, unk);
2266 VARIANT var;
2267 HRESULT hres;
2268
2269 V_VT(&var) = VT_BSTR;
2270 V_BSTR(&var) = a2bstr(val);
2271
2272 hres = IHTMLDOMNode_put_nodeValue(node, var);
2273 ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres);
2274 IHTMLDOMNode_Release(node);
2275 VariantClear(&var);
2276 }
2277
2278 #define test_elem_client_size(u) _test_elem_client_size(__LINE__,u)
2279 static void _test_elem_client_size(unsigned line, IUnknown *unk)
2280 {
2281 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
2282 LONG l;
2283 HRESULT hres;
2284
2285 hres = IHTMLElement2_get_clientWidth(elem, &l);
2286 ok_(__FILE__,line) (hres == S_OK, "get_clientWidth failed: %08x\n", hres);
2287 hres = IHTMLElement2_get_clientHeight(elem, &l);
2288 ok_(__FILE__,line) (hres == S_OK, "get_clientHeight failed: %08x\n", hres);
2289
2290 IHTMLElement2_Release(elem);
2291 }
2292
2293 #define test_elem_client_rect(u) _test_elem_client_rect(__LINE__,u)
2294 static void _test_elem_client_rect(unsigned line, IUnknown *unk)
2295 {
2296 IHTMLElement2 *elem = _get_elem2_iface(line, unk);
2297 LONG l;
2298 HRESULT hres;
2299
2300 hres = IHTMLElement2_get_clientLeft(elem, &l);
2301 ok_(__FILE__,line) (hres == S_OK, "get_clientLeft failed: %08x\n", hres);
2302 ok_(__FILE__,line) (!l, "clientLeft = %d\n", l);
2303
2304 hres = IHTMLElement2_get_clientTop(elem, &l);
2305 ok_(__FILE__,line) (hres == S_OK, "get_clientTop failed: %08x\n", hres);
2306 ok_(__FILE__,line) (!l, "clientTop = %d\n", l);
2307
2308 IHTMLElement2_Release(elem);
2309 }
2310
2311 #define get_elem_doc(e) _get_elem_doc(__LINE__,e)
2312 static IHTMLDocument2 *_get_elem_doc(unsigned line, IUnknown *unk)
2313 {
2314 IHTMLElement *elem = _get_elem_iface(line, unk);
2315 IHTMLDocument2 *doc;
2316 IDispatch *disp;
2317 HRESULT hres;
2318
2319 disp = NULL;
2320 hres = IHTMLElement_get_document(elem, &disp);
2321 ok(hres == S_OK, "get_document failed: %08x\n", hres);
2322 ok(disp != NULL, "disp == NULL\n");
2323
2324 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&doc);
2325 IDispatch_Release(disp);
2326 ok(hres == S_OK, "Could not get IHTMLDocument2 iface: %08x\n", hres);
2327
2328 return doc;
2329 }
2330
2331 #define get_window_doc(e) _get_window_doc(__LINE__,e)
2332 static IHTMLDocument2 *_get_window_doc(unsigned line, IHTMLWindow2 *window)
2333 {
2334 IHTMLDocument2 *doc;
2335 HRESULT hres;
2336
2337 doc = NULL;
2338 hres = IHTMLWindow2_get_document(window, &doc);
2339 ok(hres == S_OK, "get_document failed: %08x\n", hres);
2340 ok(doc != NULL, "disp == NULL\n");
2341
2342 return doc;
2343 }
2344
2345 #define test_create_elem(d,t) _test_create_elem(__LINE__,d,t)
2346 static IHTMLElement *_test_create_elem(unsigned line, IHTMLDocument2 *doc, const char *tag)
2347 {
2348 IHTMLElement *elem = NULL;
2349 BSTR tmp;
2350 HRESULT hres;
2351
2352 tmp = a2bstr(tag);
2353 hres = IHTMLDocument2_createElement(doc, tmp, &elem);
2354 ok_(__FILE__,line) (hres == S_OK, "createElement failed: %08x\n", hres);
2355 ok_(__FILE__,line) (elem != NULL, "elem == NULL\n");
2356
2357 return elem;
2358 }
2359
2360 #define test_create_text(d,t) _test_create_text(__LINE__,d,t)
2361 static IHTMLDOMNode *_test_create_text(unsigned line, IHTMLDocument2 *doc, const char *text)
2362 {
2363 IHTMLDocument3 *doc3;
2364 IHTMLDOMNode *node = NULL;
2365 BSTR tmp;
2366 HRESULT hres;
2367
2368 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
2369 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3: %08x\n", hres);
2370
2371 tmp = a2bstr(text);
2372 hres = IHTMLDocument3_createTextNode(doc3, tmp, &node);
2373 IHTMLDocument3_Release(doc3);
2374 ok_(__FILE__,line) (hres == S_OK, "createElement failed: %08x\n", hres);
2375 ok_(__FILE__,line) (node != NULL, "node == NULL\n");
2376
2377 return node;
2378 }
2379
2380 #define test_node_append_child(n,c) _test_node_append_child(__LINE__,n,c)
2381 static IHTMLDOMNode *_test_node_append_child(unsigned line, IUnknown *node_unk, IUnknown *child_unk)
2382 {
2383 IHTMLDOMNode *node = _get_node_iface(line, node_unk);
2384 IHTMLDOMNode *child = _get_node_iface(line, child_unk);
2385 IHTMLDOMNode *new_child = NULL;
2386 HRESULT hres;
2387
2388 hres = IHTMLDOMNode_appendChild(node, child, &new_child);
2389 ok_(__FILE__,line) (hres == S_OK, "appendChild failed: %08x\n", hres);
2390 ok_(__FILE__,line) (new_child != NULL, "new_child == NULL\n");
2391 /* TODO ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
2392
2393 IHTMLDOMNode_Release(node);
2394 IHTMLDOMNode_Release(child);
2395
2396 return new_child;
2397 }
2398
2399 #define test_node_insertbefore(n,c,v) _test_node_insertbefore(__LINE__,n,c,v)
2400 static IHTMLDOMNode *_test_node_insertbefore(unsigned line, IUnknown *node_unk, IHTMLDOMNode *child, VARIANT *var)
2401 {
2402 IHTMLDOMNode *node = _get_node_iface(line, node_unk);
2403 IHTMLDOMNode *new_child = NULL;
2404 HRESULT hres;
2405
2406 hres = IHTMLDOMNode_insertBefore(node, child, *var, &new_child);
2407 ok_(__FILE__,line) (hres == S_OK, "insertBefore failed: %08x\n", hres);
2408 ok_(__FILE__,line) (new_child != NULL, "new_child == NULL\n");
2409 /* TODO ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
2410
2411 IHTMLDOMNode_Release(node);
2412
2413 return new_child;
2414 }
2415
2416 #define test_node_remove_child(n,c) _test_node_remove_child(__LINE__,n,c)
2417 static void _test_node_remove_child(unsigned line, IUnknown *unk, IHTMLDOMNode *child)
2418 {
2419 IHTMLDOMNode *node = _get_node_iface(line, unk);
2420 IHTMLDOMNode *new_node = NULL;
2421 HRESULT hres;
2422
2423 hres = IHTMLDOMNode_removeChild(node, child, &new_node);
2424 ok_(__FILE__,line) (hres == S_OK, "removeChild failed: %08x\n", hres);
2425 ok_(__FILE__,line) (new_node != NULL, "new_node == NULL\n");
2426 /* TODO ok_(__FILE__,line) (new_node != child, "new_node == child\n"); */
2427
2428 IHTMLDOMNode_Release(node);
2429 IHTMLDOMNode_Release(new_node);
2430 }
2431
2432 #define test_doc_title(d,t) _test_doc_title(__LINE__,d,t)
2433 static void _test_doc_title(unsigned line, IHTMLDocument2 *doc, const char *extitle)
2434 {
2435 BSTR title = NULL;
2436 HRESULT hres;
2437
2438 hres = IHTMLDocument2_get_title(doc, &title);
2439 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
2440 ok_(__FILE__,line) (!strcmp_wa(title, extitle), "unexpected title %s\n", wine_dbgstr_w(title));
2441 SysFreeString(title);
2442 }
2443
2444 #define test_doc_set_title(d,t) _test_doc_set_title(__LINE__,d,t)
2445 static void _test_doc_set_title(unsigned line, IHTMLDocument2 *doc, const char *title)
2446 {
2447 BSTR tmp;
2448 HRESULT hres;
2449
2450 tmp = a2bstr(title);
2451 hres = IHTMLDocument2_put_title(doc, tmp);
2452 ok_(__FILE__,line) (hres == S_OK, "get_title failed: %08x\n", hres);
2453 SysFreeString(tmp);
2454 }
2455
2456 #define test_border_styles(p, n) _test_border_styles(__LINE__, p, n)
2457 static void _test_border_styles(unsigned line, IHTMLStyle *pStyle, BSTR Name)
2458 {
2459 HRESULT hres;
2460 DISPID dispid;
2461
2462 hres = IHTMLStyle_GetIDsOfNames(pStyle, &IID_NULL, &Name, 1,
2463 LOCALE_USER_DEFAULT, &dispid);
2464 ok_(__FILE__,line) (hres == S_OK, "GetIDsOfNames: %08x\n", hres);
2465 if(hres == S_OK)
2466 {
2467 DISPPARAMS params = {NULL,NULL,0,0};
2468 DISPID dispidNamed = DISPID_PROPERTYPUT;
2469 VARIANT ret;
2470 VARIANT vDefault;
2471 VARIANTARG arg;
2472
2473 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2474 DISPATCH_PROPERTYGET, &params, &vDefault, NULL, NULL);
2475 ok_(__FILE__,line) (hres == S_OK, "get_default. ret: %08x\n", hres);
2476
2477 params.cArgs = 1;
2478 params.cNamedArgs = 1;
2479 params.rgdispidNamedArgs = &dispidNamed;
2480 V_VT(&arg) = VT_BSTR;
2481 V_BSTR(&arg) = a2bstr("none");
2482 params.rgvarg = &arg;
2483 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2484 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2485 ok_(__FILE__,line) (hres == S_OK, "none. ret: %08x\n", hres);
2486 VariantClear(&arg);
2487
2488 V_VT(&arg) = VT_BSTR;
2489 V_BSTR(&arg) = a2bstr("dotted");
2490 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2491 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2492 ok_(__FILE__,line) (hres == S_OK, "dotted. ret: %08x\n", hres);
2493 VariantClear(&arg);
2494
2495 V_VT(&arg) = VT_BSTR;
2496 V_BSTR(&arg) = a2bstr("dashed");
2497 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2498 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2499 ok_(__FILE__,line) (hres == S_OK, "dashed. ret: %08x\n", hres);
2500 VariantClear(&arg);
2501
2502 V_VT(&arg) = VT_BSTR;
2503 V_BSTR(&arg) = a2bstr("solid");
2504 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2505 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2506 ok_(__FILE__,line) (hres == S_OK, "solid. ret: %08x\n", hres);
2507 VariantClear(&arg);
2508
2509 V_VT(&arg) = VT_BSTR;
2510 V_BSTR(&arg) = a2bstr("double");
2511 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2512 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2513 ok_(__FILE__,line) (hres == S_OK, "double. ret: %08x\n", hres);
2514 VariantClear(&arg);
2515
2516 V_VT(&arg) = VT_BSTR;
2517 V_BSTR(&arg) = a2bstr("groove");
2518 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2519 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2520 ok_(__FILE__,line) (hres == S_OK, "groove. ret: %08x\n", hres);
2521 VariantClear(&arg);
2522
2523 V_VT(&arg) = VT_BSTR;
2524 V_BSTR(&arg) = a2bstr("ridge");
2525 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2526 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2527 ok_(__FILE__,line) (hres == S_OK, "ridge. ret: %08x\n", hres);
2528 VariantClear(&arg);
2529
2530 V_VT(&arg) = VT_BSTR;
2531 V_BSTR(&arg) = a2bstr("inset");
2532 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2533 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2534 ok_(__FILE__,line) (hres == S_OK, "inset. ret: %08x\n", hres);
2535 VariantClear(&arg);
2536
2537 V_VT(&arg) = VT_BSTR;
2538 V_BSTR(&arg) = a2bstr("outset");
2539 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2540 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2541 ok_(__FILE__,line) (hres == S_OK, "outset. ret: %08x\n", hres);
2542 VariantClear(&arg);
2543
2544 V_VT(&arg) = VT_BSTR;
2545 V_BSTR(&arg) = a2bstr("invalid");
2546 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2547 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2548 ok_(__FILE__,line) (FAILED(hres), "invalid value passed.\n");
2549 VariantClear(&arg);
2550
2551 params.rgvarg = &vDefault;
2552 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
2553 DISPATCH_PROPERTYPUT, &params, &ret, NULL, NULL);
2554 ok_(__FILE__,line) (hres == S_OK, "default. ret: %08x\n", hres);
2555 }
2556 }
2557
2558 #define test_style_csstext(s,t) _test_style_csstext(__LINE__,s,t)
2559 static void _test_style_csstext(unsigned line, IHTMLStyle *style, const char *extext)
2560 {
2561 BSTR text = (void*)0xdeadbeef;
2562 HRESULT hres;
2563
2564 hres = IHTMLStyle_get_cssText(style, &text);
2565 ok_(__FILE__,line)(hres == S_OK, "get_cssText failed: %08x\n", hres);
2566 if(extext)
2567 ok_(__FILE__,line)(!strcmp_wa(text, extext), "cssText = %s\n", wine_dbgstr_w(text));
2568 else
2569 ok_(__FILE__,line)(!text, "cssText = %s\n", wine_dbgstr_w(text));
2570
2571 SysFreeString(text);
2572 }
2573
2574 #define test_style_set_csstext(s,t) _test_style_set_csstext(__LINE__,s,t)
2575 static void _test_style_set_csstext(unsigned line, IHTMLStyle *style, const char *text)
2576 {
2577 BSTR tmp;
2578 HRESULT hres;
2579
2580 tmp = a2bstr(text);
2581 hres = IHTMLStyle_put_cssText(style, tmp);
2582 ok_(__FILE__,line)(hres == S_OK, "put_cssText failed: %08x\n", hres);
2583 SysFreeString(tmp);
2584 }
2585
2586 static void test_elem_col_item(IHTMLElementCollection *col, const char *n,
2587 const elem_type_t *elem_types, LONG len)
2588 {
2589 IDispatch *disp;
2590 VARIANT name, index;
2591 DWORD i;
2592 HRESULT hres;
2593
2594 V_VT(&index) = VT_EMPTY;
2595 V_VT(&name) = VT_BSTR;
2596 V_BSTR(&name) = a2bstr(n);
2597
2598 hres = IHTMLElementCollection_item(col, name, index, &disp);
2599 ok(hres == S_OK, "item failed: %08x\n", hres);
2600
2601 test_elem_collection((IUnknown*)disp, elem_types, len);
2602 IDispatch_Release(disp);
2603 ok(hres == S_OK, "Could not get IHTMLElementCollection interface: %08x\n", hres);
2604 if(hres != S_OK)
2605 goto cleanup;
2606
2607 V_VT(&index) = VT_I4;
2608
2609 for(i=0; i<len; i++) {
2610 V_I4(&index) = i;
2611 disp = (void*)0xdeadbeef;
2612 hres = IHTMLElementCollection_item(col, name, index, &disp);
2613 ok(hres == S_OK, "item failed: %08x\n", hres);
2614 ok(disp != NULL, "disp == NULL\n");
2615 if(FAILED(hres) || !disp)
2616 continue;
2617
2618 test_elem_type((IUnknown*)disp, elem_types[i]);
2619
2620 IDispatch_Release(disp);
2621 }
2622
2623 V_I4(&index) = len;
2624 disp = (void*)0xdeadbeef;
2625 hres = IHTMLElementCollection_item(col, name, index, &disp);
2626 ok(hres == S_OK, "item failed: %08x\n", hres);
2627 ok(disp == NULL, "disp != NULL\n");
2628
2629 V_I4(&index) = -1;
2630 disp = (void*)0xdeadbeef;
2631 hres = IHTMLElementCollection_item(col, name, index, &disp);
2632 ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres);
2633 ok(disp == NULL, "disp != NULL\n");
2634
2635 cleanup:
2636 SysFreeString(V_BSTR(&name));
2637 }
2638
2639 static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, const char *id, BOOL expect_success)
2640 {
2641 IHTMLElementCollection *col;
2642 IHTMLElement *elem;
2643 IDispatch *disp = (void*)0xdeadbeef;
2644 VARIANT name, index;
2645 HRESULT hres;
2646
2647 hres = IHTMLDocument2_get_all(doc, &col);
2648 ok(hres == S_OK, "get_all failed: %08x\n", hres);
2649 ok(col != NULL, "col == NULL\n");
2650 if(FAILED(hres) || !col)
2651 return NULL;
2652
2653 V_VT(&index) = VT_EMPTY;
2654 V_VT(&name) = VT_BSTR;
2655 V_BSTR(&name) = a2bstr(id);
2656
2657 hres = IHTMLElementCollection_item(col, name, index, &disp);
2658 IHTMLElementCollection_Release(col);
2659 SysFreeString(V_BSTR(&name));
2660 ok(hres == S_OK, "item failed: %08x\n", hres);
2661 if(!expect_success) {
2662 ok(disp == NULL, "disp != NULL\n");
2663 return NULL;
2664 }
2665
2666 ok(disp != NULL, "disp == NULL\n");
2667 if(!disp)
2668 return NULL;
2669
2670 elem = get_elem_iface((IUnknown*)disp);
2671 IDispatch_Release(disp);
2672
2673 return elem;
2674 }
2675
2676 static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, const char *id)
2677 {
2678 IHTMLDocument3 *doc3;
2679 IHTMLElement *elem;
2680 BSTR tmp;
2681 HRESULT hres;
2682
2683 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
2684 ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
2685
2686 tmp = a2bstr(id);
2687 hres = IHTMLDocument3_getElementById(doc3, tmp, &elem);
2688 SysFreeString(tmp);
2689 ok(hres == S_OK, "getElementById(%s) failed: %08x\n", id, hres);
2690
2691 IHTMLDocument3_Release(doc3);
2692
2693 return elem;
2694 }
2695
2696 static void test_select_elem(IHTMLSelectElement *select)
2697 {
2698 test_select_type(select, "select-one");
2699 test_select_length(select, 2);
2700 test_select_selidx(select, 0);
2701 test_select_put_selidx(select, 1);
2702
2703 test_select_set_value(select, "val1");
2704 test_select_value(select, "val1");
2705
2706 test_select_get_disabled(select, VARIANT_FALSE);
2707 test_select_set_disabled(select, VARIANT_TRUE);
2708 test_select_set_disabled(select, VARIANT_FALSE);
2709 }
2710
2711 static void test_create_option_elem(IHTMLDocument2 *doc)
2712 {
2713 IHTMLOptionElement *option;
2714
2715 option = create_option_elem(doc, "test text", "test value");
2716
2717 test_option_put_text(option, "new text");
2718 test_option_put_value(option, "new value");
2719
2720 IHTMLOptionElement_Release(option);
2721 }
2722
2723 static void test_create_img_elem(IHTMLDocument2 *doc)
2724 {
2725 IHTMLImgElement *img;
2726
2727 img = create_img_elem(doc, 10, 15);
2728
2729 if(img){
2730 test_img_put_width(img, 5);
2731 test_img_put_height(img, 20);
2732
2733 IHTMLImgElement_Release(img);
2734 img = NULL;
2735 }
2736
2737 img = create_img_elem(doc, -1, -1);
2738
2739 if(img){
2740 test_img_put_width(img, 5);
2741 test_img_put_height(img, 20);
2742
2743 IHTMLImgElement_Release(img);
2744 }
2745 }
2746
2747 static IHTMLTxtRange *test_create_body_range(IHTMLDocument2 *doc)
2748 {
2749 IHTMLBodyElement *body;
2750 IHTMLTxtRange *range;
2751 IHTMLElement *elem;
2752 HRESULT hres;
2753
2754 hres = IHTMLDocument2_get_body(doc, &elem);
2755 ok(hres == S_OK, "get_body failed: %08x\n", hres);
2756
2757 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
2758 IHTMLElement_Release(elem);
2759
2760 hres = IHTMLBodyElement_createTextRange(body, &range);
2761 IHTMLBodyElement_Release(body);
2762 ok(hres == S_OK, "createTextRange failed: %08x\n", hres);
2763
2764 return range;
2765 }
2766
2767 static void test_txtrange(IHTMLDocument2 *doc)
2768 {
2769 IHTMLTxtRange *body_range, *range, *range2;
2770 IHTMLSelectionObject *selection;
2771 IDispatch *disp_range;
2772 HRESULT hres;
2773
2774 body_range = test_create_body_range(doc);
2775
2776 test_range_text(body_range, "test abc 123\r\nit's text");
2777
2778 hres = IHTMLTxtRange_duplicate(body_range, &range);
2779 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2780
2781 hres = IHTMLTxtRange_duplicate(body_range, &range2);
2782 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2783 test_range_isequal(range, range2, VARIANT_TRUE);
2784
2785 test_range_text(range, "test abc 123\r\nit's text");
2786 test_range_text(body_range, "test abc 123\r\nit's text");
2787
2788 test_range_collapse(range, TRUE);
2789 test_range_isequal(range, range2, VARIANT_FALSE);
2790 test_range_inrange(range, range2, VARIANT_FALSE);
2791 test_range_inrange(range2, range, VARIANT_TRUE);
2792 IHTMLTxtRange_Release(range2);
2793
2794 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
2795 test_range_expand(range, wordW, VARIANT_FALSE, "test ");
2796 test_range_move(range, characterW, 2, 2);
2797 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
2798
2799 test_range_collapse(range, FALSE);
2800 test_range_expand(range, wordW, VARIANT_TRUE, "abc ");
2801
2802 test_range_collapse(range, FALSE);
2803 test_range_expand(range, wordW, VARIANT_TRUE, "123");
2804 test_range_expand(range, wordW, VARIANT_FALSE, "123");
2805 test_range_move(range, characterW, 2, 2);
2806 test_range_expand(range, wordW, VARIANT_TRUE, "123");
2807 test_range_moveend(range, characterW, -5, -5);
2808 test_range_text(range, NULL);
2809 test_range_moveend(range, characterW, 3, 3);
2810 test_range_text(range, "c 1");
2811 test_range_expand(range, texteditW, VARIANT_TRUE, "test abc 123\r\nit's text");
2812 test_range_collapse(range, TRUE);
2813 test_range_move(range, characterW, 4, 4);
2814 test_range_moveend(range, characterW, 1, 1);
2815 test_range_text(range, " ");
2816 test_range_move(range, wordW, 1, 1);
2817 test_range_moveend(range, characterW, 2, 2);
2818 test_range_text(range, "ab");
2819
2820 IHTMLTxtRange_Release(range);
2821
2822 hres = IHTMLTxtRange_duplicate(body_range, &range);
2823 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2824
2825 test_range_text(range, "test abc 123\r\nit's text");
2826 test_range_move(range, characterW, 3, 3);
2827 test_range_moveend(range, characterW, 1, 1);
2828 test_range_text(range, "t");
2829 test_range_moveend(range, characterW, 3, 3);
2830 test_range_text(range, "t ab");
2831 test_range_moveend(range, characterW, -2, -2);
2832 test_range_text(range, "t ");
2833 test_range_move(range, characterW, 6, 6);
2834 test_range_moveend(range, characterW, 3, 3);
2835 test_range_text(range, "123");
2836 test_range_moveend(range, characterW, 2, 2);
2837 test_range_text(range, "123\r\ni");
2838
2839 IHTMLTxtRange_Release(range);
2840
2841 hres = IHTMLTxtRange_duplicate(body_range, &range);
2842 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2843
2844 test_range_move(range, wordW, 1, 1);
2845 test_range_moveend(range, characterW, 2, 2);
2846 test_range_text(range, "ab");
2847
2848 test_range_move(range, characterW, -2, -2);
2849 test_range_moveend(range, characterW, 2, 2);
2850 test_range_text(range, "t ");
2851
2852 test_range_move(range, wordW, 3, 3);
2853 test_range_move(range, wordW, -2, -2);
2854 test_range_moveend(range, characterW, 2, 2);
2855 test_range_text(range, "ab");
2856
2857 test_range_move(range, characterW, -6, -5);
2858 test_range_moveend(range, characterW, -1, 0);
2859 test_range_moveend(range, characterW, -6, 0);
2860 test_range_move(range, characterW, 2, 2);
2861 test_range_moveend(range, characterW, 2, 2);
2862 test_range_text(range, "st");
2863 test_range_moveend(range, characterW, -6, -4);
2864 test_range_moveend(range, characterW, 2, 2);
2865
2866 IHTMLTxtRange_Release(range);
2867
2868 hres = IHTMLTxtRange_duplicate(body_range, &range);
2869 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2870
2871 test_range_move(range, wordW, 2, 2);
2872 test_range_moveend(range, characterW, 2, 2);
2873 test_range_text(range, "12");
2874
2875 test_range_move(range, characterW, 15, 14);
2876 test_range_move(range, characterW, -2, -2);
2877 test_range_moveend(range, characterW, 3, 2);
2878 test_range_text(range, "t");
2879 test_range_moveend(range, characterW, -1, -1);
2880 test_range_text(range, "t");
2881 test_range_expand(range, wordW, VARIANT_TRUE, "text");
2882 test_range_move(range, characterW, -2, -2);
2883 test_range_moveend(range, characterW, 2, 2);
2884 test_range_text(range, "s ");
2885 test_range_move(range, characterW, 100, 7);
2886 test_range_move(range, wordW, 1, 0);
2887 test_range_move(range, characterW, -2, -2);
2888 test_range_moveend(range, characterW, 3, 2);
2889 test_range_text(range, "t");
2890
2891 IHTMLTxtRange_Release(range);
2892
2893 hres = IHTMLTxtRange_duplicate(body_range, &range);
2894 ok(hres == S_OK, "duplicate failed: %08x\n", hres);
2895
2896 test_range_collapse(range, TRUE);
2897 test_range_expand(range, wordW, VARIANT_TRUE, "test ");
2898 test_range_put_text(range, "word");
2899 test_range_text(body_range, "wordabc 123\r\nit's text");
2900 test_range_text(range, NULL);
2901 test_range_moveend(range, characterW, 3, 3);
2902 test_range_text(range, "abc");
2903 test_range_movestart(range, characterW, -2, -2);
2904 test_range_text(range, "rdabc");
2905 test_range_movestart(range, characterW, 3, 3);
2906 test_range_text(range, "bc");
2907 test_range_movestart(range, characterW, 4, 4);
2908 test_range_text(range, NULL);
2909 test_range_movestart(range, characterW, -3, -3);
2910 test_range_text(range, "c 1");
2911 test_range_movestart(range, characterW, -7, -6);
2912 test_range_text(range, "wordabc 1");
2913 test_range_movestart(range, characterW, 100, 22);
2914 test_range_text(range, NULL);
2915
2916 IHTMLTxtRange_Release(range);
2917 IHTMLTxtRange_Release(body_range);
2918
2919 hres = IHTMLDocument2_get_selection(doc, &selection);
2920 ok(hres == S_OK, "IHTMLDocument2_get_selection failed: %08x\n", hres);
2921
2922 hres = IHTMLSelectionObject_createRange(selection, &disp_range);
2923 ok(hres == S_OK, "IHTMLSelectionObject_createRange failed: %08x\n", hres);
2924 IHTMLSelectionObject_Release(selection);
2925
2926 hres = IDispatch_QueryInterface(disp_range, &IID_IHTMLTxtRange, (void **)&range);
2927 ok(hres == S_OK, "Could not get IID_IHTMLTxtRange interface: 0x%08x\n", hres);
2928 IDispatch_Release(disp_range);
2929
2930 test_range_text(range, NULL);
2931 test_range_moveend(range, characterW, 3, 3);
2932 test_range_text(range, "wor");
2933 test_range_parent(range, ET_BODY);
2934 test_range_expand(range, texteditW, VARIANT_TRUE, "wordabc 123\r\nit's text");
2935 test_range_expand(range, texteditW, VARIANT_TRUE, "wordabc 123\r\nit's text");
2936 test_range_move(range, characterW, 3, 3);
2937 test_range_expand(range, wordW, VARIANT_TRUE, "wordabc ");
2938 test_range_moveend(range, characterW, -4, -4);
2939 test_range_put_text(range, "abc def ");
2940 test_range_expand(range, texteditW, VARIANT_TRUE, "abc def abc 123\r\nit's text");
2941 test_range_move(range, wordW, 1, 1);
2942 test_range_movestart(range, characterW, -1, -1);
2943 test_range_text(range, " ");
2944 test_range_move(range, wordW, 1, 1);
2945 test_range_moveend(range, characterW, 3, 3);
2946 test_range_text(range, "def");
2947 test_range_put_text(range, "xyz");
2948 test_range_moveend(range, characterW, 1, 1);
2949 test_range_move(range, wordW, 1, 1);
2950 test_range_moveend(range, characterW, 2, 2);
2951 test_range_text(range, "ab");
2952
2953 IHTMLTxtRange_Release(range);
2954 }
2955
2956 static void test_txtrange2(IHTMLDocument2 *doc)
2957 {
2958 IHTMLTxtRange *range;
2959
2960 range = test_create_body_range(doc);
2961
2962 test_range_text(range, "abc\r\n\r\n123\r\n\r\n\r\ndef");
2963 test_range_move(range, characterW, 5, 5);
2964 test_range_moveend(range, characterW, 1, 1);
2965 test_range_text(range, "2");
2966 test_range_move(range, characterW, -3, -3);
2967 test_range_moveend(range, characterW, 3, 3);
2968 test_range_text(range, "c\r\n\r\n1");
2969 test_range_collapse(range, VARIANT_FALSE);
2970 test_range_moveend(range, characterW, 4, 4);
2971 test_range_text(range, "23");
2972 test_range_moveend(range, characterW, 1, 1);
2973 test_range_text(range, "23\r\n\r\n\r\nd");
2974 test_range_moveend(range, characterW, -1, -1);
2975 test_range_text(range, "23");
2976 test_range_moveend(range, characterW, -1, -1);
2977 test_range_text(range, "23");
2978 test_range_moveend(range, characterW, -2, -2);
2979 test_range_text(range, "2");
2980
2981 IHTMLTxtRange_Release(range);
2982 }
2983
2984 static void test_compatmode(IHTMLDocument2 *doc)
2985 {
2986 IHTMLDocument5 *doc5;
2987 BSTR mode;
2988 HRESULT hres;
2989
2990 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
2991 ok(hres == S_OK, "Could not get IHTMLDocument5 interface: %08x\n", hres);
2992 if(FAILED(hres))
2993 return;
2994
2995 hres = IHTMLDocument5_get_compatMode(doc5, &mode);
2996 IHTMLDocument5_Release(doc5);
2997 ok(hres == S_OK, "get_compatMode failed: %08x\n", hres);
2998 ok(!strcmp_wa(mode, "BackCompat"), "compatMode=%s\n", wine_dbgstr_w(mode));
2999 SysFreeString(mode);
3000 }
3001
3002 static void test_location(IHTMLDocument2 *doc)
3003 {
3004 IHTMLLocation *location, *location2;
3005 IHTMLWindow2 *window;
3006 BSTR str;
3007 ULONG ref;
3008 HRESULT hres;
3009
3010 hres = IHTMLDocument2_get_location(doc, &location);
3011 ok(hres == S_OK, "get_location failed: %08x\n", hres);
3012
3013 hres = IHTMLDocument2_get_location(doc, &location2);
3014 ok(hres == S_OK, "get_location failed: %08x\n", hres);
3015
3016 ok(location == location2, "location != location2\n");
3017 IHTMLLocation_Release(location2);
3018
3019 hres = IHTMLDocument2_get_parentWindow(doc, &window);
3020 ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
3021
3022 hres = IHTMLWindow2_get_location(window, &location2);
3023 ok(hres == S_OK, "get_location failed: %08x\n", hres);
3024 ok(location == location2, "location != location2\n");
3025 IHTMLLocation_Release(location2);
3026
3027 test_ifaces((IUnknown*)location, location_iids);
3028 test_disp2((IUnknown*)location, &DIID_DispHTMLLocation, &IID_IHTMLLocation, "about:blank");
3029
3030 hres = IHTMLLocation_get_pathname(location, &str);
3031 ok(hres == S_OK, "get_pathname failed: %08x\n", hres);
3032 ok(!strcmp_wa(str, "blank"), "unexpected pathname %s\n", wine_dbgstr_w(str));
3033
3034 hres = IHTMLLocation_get_href(location, NULL);
3035 ok(hres == E_POINTER, "get_href passed: %08x\n", hres);
3036
3037 hres = IHTMLLocation_get_href(location, &str);
3038 ok(hres == S_OK, "get_href failed: %08x\n", hres);
3039 ok(!strcmp_wa(str, "about:blank"), "unexpected href %s\n", wine_dbgstr_w(str));
3040
3041 ref = IHTMLLocation_Release(location);
3042 ok(!ref, "location chould be destroyed here\n");
3043 }
3044
3045 static void test_navigator(IHTMLDocument2 *doc)
3046 {
3047 IHTMLWindow2 *window;
3048 IOmNavigator *navigator, *navigator2;
3049 char buf[512];
3050 DWORD size;
3051 ULONG ref;
3052 BSTR bstr;
3053 HRESULT hres;
3054
3055 static const WCHAR v40[] = {'4','.','0'};
3056
3057 hres = IHTMLDocument2_get_parentWindow(doc, &window);
3058 ok(hres == S_OK, "parentWidnow failed: %08x\n", hres);
3059
3060 hres = IHTMLWindow2_get_navigator(window, &navigator);
3061 ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
3062 ok(navigator != NULL, "navigator == NULL\n");
3063 test_disp2((IUnknown*)navigator, &DIID_DispHTMLNavigator, &IID_IOmNavigator, "[object]");
3064
3065 hres = IHTMLWindow2_get_navigator(window, &navigator2);
3066 ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
3067 ok(navigator != navigator2, "navigator2 != navihgator\n");
3068
3069 IHTMLWindow2_Release(window);
3070 IOmNavigator_Release(navigator2);
3071
3072 hres = IOmNavigator_get_appCodeName(navigator, &bstr);
3073 ok(hres == S_OK, "get_appCodeName failed: %08x\n", hres);
3074 ok(!strcmp_wa(bstr, "Mozilla"), "Unexpected appCodeName %s\n", wine_dbgstr_w(bstr));
3075 SysFreeString(bstr);
3076
3077 bstr = NULL;
3078 hres = IOmNavigator_get_appName(navigator, &bstr);
3079 ok(hres == S_OK, "get_appName failed: %08x\n", hres);
3080 ok(!strcmp_wa(bstr, "Microsoft Internet Explorer"), "Unexpected appCodeName %s\n", wine_dbgstr_w(bstr));
3081 SysFreeString(bstr);
3082
3083 bstr = NULL;
3084 hres = IOmNavigator_get_platform(navigator, &bstr);
3085 ok(hres == S_OK, "get_platform failed: %08x\n", hres);
3086 #ifdef _WIN64
3087 ok(!strcmp_wa(bstr, "Win64"), "unexpected platform %s\n", wine_dbgstr_w(bstr));
3088 #else
3089 ok(!strcmp_wa(bstr, "Win32"), "unexpected platform %s\n", wine_dbgstr_w(bstr));
3090 #endif
3091 SysFreeString(bstr);
3092
3093 bstr = NULL;
3094 hres = IOmNavigator_get_appVersion(navigator, &bstr);
3095 ok(hres == S_OK, "get_appVersion failed: %08x\n", hres);
3096 ok(!memcmp(bstr, v40, sizeof(v40)), "appVersion is %s\n", wine_dbgstr_w(bstr));
3097 SysFreeString(bstr);
3098
3099 hres = IOmNavigator_toString(navigator, NULL);
3100 ok(hres == E_INVALIDARG, "toString failed: %08x\n", hres);
3101
3102 bstr = NULL;
3103 hres = IOmNavigator_toString(navigator, &bstr);
3104 ok(hres == S_OK, "toString failed: %08x\n", hres);
3105 ok(!strcmp_wa(bstr, "[object]"), "toString returned %s\n", wine_dbgstr_w(bstr));
3106 SysFreeString(bstr);
3107
3108 size = sizeof(buf);
3109 hres = ObtainUserAgentString(0, buf, &size);
3110 ok(hres == S_OK, "ObtainUserAgentString failed: %08x\n", hres);
3111
3112 bstr = NULL;
3113 hres = IOmNavigator_get_userAgent(navigator, &bstr);
3114 ok(hres == S_OK, "get_userAgent failed: %08x\n", hres);
3115 ok(!strcmp_wa(bstr, buf), "userAgent returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf);
3116 SysFreeString(bstr);
3117
3118 ref = IOmNavigator_Release(navigator);
3119 ok(!ref, "navigator should be destroyed here\n");
3120 }
3121
3122 static void test_screen(IHTMLWindow2 *window)
3123 {
3124 IHTMLScreen *screen, *screen2;
3125 IDispatchEx *dispex;
3126 LONG l, exl;
3127 HDC hdc;
3128 HRESULT hres;
3129
3130 static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
3131
3132 screen = NULL;
3133 hres = IHTMLWindow2_get_screen(window, &screen);
3134 ok(hres == S_OK, "get_screen failed: %08x\n", hres);
3135 ok(screen != NULL, "screen == NULL\n");
3136
3137 screen2 = NULL;
3138 hres = IHTMLWindow2_get_screen(window, &screen2);
3139 ok(hres == S_OK, "get_screen failed: %08x\n", hres);
3140 ok(screen2 != NULL, "screen == NULL\n");
3141 ok(iface_cmp((IUnknown*)screen2, (IUnknown*)screen), "screen2 != screen\n");
3142 IHTMLScreen_Release(screen2);
3143
3144 hres = IHTMLScreen_QueryInterface(screen, &IID_IDispatchEx, (void**)&dispex);
3145 ok(hres == S_OK || broken(hres == E_NOINTERFACE), "Could not get IDispatchEx interface: %08x\n", hres);
3146 if(SUCCEEDED(hres)) {
3147 test_disp((IUnknown*)screen, &DIID_DispHTMLScreen, "[object]");
3148 IDispatchEx_Release(dispex);
3149 }
3150
3151 hdc = CreateICW(displayW, NULL, NULL, NULL);
3152
3153 exl = GetDeviceCaps(hdc, HORZRES);
3154 l = 0xdeadbeef;
3155 hres = IHTMLScreen_get_width(screen, &l);
3156 ok(hres == S_OK, "get_width failed: %08x\n", hres);
3157 ok(l == exl, "width = %d, expected %d\n", l, exl);
3158
3159 exl = GetDeviceCaps(hdc, VERTRES);
3160 l = 0xdeadbeef;
3161 hres = IHTMLScreen_get_height(screen, &l);
3162 ok(hres == S_OK, "get_height failed: %08x\n", hres);
3163 ok(l == exl, "height = %d, expected %d\n", l, exl);
3164
3165 exl = GetDeviceCaps(hdc, BITSPIXEL);
3166 l = 0xdeadbeef;
3167 hres = IHTMLScreen_get_colorDepth(screen, &l);
3168 ok(hres == S_OK, "get_height failed: %08x\n", hres);
3169 ok(l == exl, "height = %d, expected %d\n", l, exl);
3170
3171 DeleteObject(hdc);
3172
3173 IHTMLScreen_Release(screen);
3174 }
3175
3176 static void test_current_style(IHTMLCurrentStyle *current_style)
3177 {
3178 BSTR str;
3179 HRESULT hres;
3180 VARIANT v;
3181
3182 test_disp((IUnknown*)current_style, &DIID_DispHTMLCurrentStyle, "[object]");
3183 test_ifaces((IUnknown*)current_style, cstyle_iids);
3184
3185 hres = IHTMLCurrentStyle_get_display(current_style, &str);
3186 ok(hres == S_OK, "get_display failed: %08x\n", hres);
3187 ok(!strcmp_wa(str, "block"), "get_display returned %s\n", wine_dbgstr_w(str));
3188 SysFreeString(str);
3189
3190 hres = IHTMLCurrentStyle_get_position(current_style, &str);
3191 ok(hres == S_OK, "get_position failed: %08x\n", hres);
3192 ok(!strcmp_wa(str, "absolute"), "get_position returned %s\n", wine_dbgstr_w(str));
3193 SysFreeString(str);
3194
3195 hres = IHTMLCurrentStyle_get_fontFamily(current_style, &str);
3196 ok(hres == S_OK, "get_fontFamily failed: %08x\n", hres);
3197 SysFreeString(str);
3198
3199 hres = IHTMLCurrentStyle_get_fontStyle(current_style, &str);
3200 ok(hres == S_OK, "get_fontStyle failed: %08x\n", hres);
3201 ok(!strcmp_wa(str, "normal"), "get_fontStyle returned %s\n", wine_dbgstr_w(str));
3202 SysFreeString(str);
3203
3204 hres = IHTMLCurrentStyle_get_backgroundImage(current_style, &str);
3205 ok(hres == S_OK, "get_backgroundImage failed: %08x\n", hres);
3206 ok(!strcmp_wa(str, "none"), "get_backgroundImage returned %s\n", wine_dbgstr_w(str));
3207 SysFreeString(str);
3208
3209 hres = IHTMLCurrentStyle_get_fontVariant(current_style, &str);
3210 ok(hres == S_OK, "get_fontVariant failed: %08x\n", hres);
3211 ok(!strcmp_wa(str, "normal"), "get_fontVariant returned %s\n", wine_dbgstr_w(str));
3212 SysFreeString(str);
3213
3214 hres = IHTMLCurrentStyle_get_borderTopStyle(current_style, &str);
3215 ok(hres == S_OK, "get_borderTopStyle failed: %08x\n", hres);
3216 ok(!strcmp_wa(str, "none"), "get_borderTopStyle returned %s\n", wine_dbgstr_w(str));
3217 SysFreeString(str);
3218
3219 hres = IHTMLCurrentStyle_get_borderRightStyle(current_style, &str);
3220 ok(hres == S_OK, "get_borderRightStyle failed: %08x\n", hres);
3221 ok(!strcmp_wa(str, "none"), "get_borderRightStyle returned %s\n", wine_dbgstr_w(str));
3222 SysFreeString(str);
3223
3224 hres = IHTMLCurrentStyle_get_borderBottomStyle(current_style, &str);
3225 ok(hres == S_OK, "get_borderBottomStyle failed: %08x\n", hres);
3226 ok(!strcmp_wa(str, "none"), "get_borderBottomStyle returned %s\n", wine_dbgstr_w(str));
3227 SysFreeString(str);
3228
3229 hres = IHTMLCurrentStyle_get_borderLeftStyle(current_style, &str);
3230 ok(hres == S_OK, "get_borderLeftStyle failed: %08x\n", hres);
3231 ok(!strcmp_wa(str, "none"), "get_borderLeftStyle returned %s\n", wine_dbgstr_w(str));
3232 SysFreeString(str);
3233
3234 hres = IHTMLCurrentStyle_get_textAlign(current_style, &str);
3235 ok(hres == S_OK, "get_textAlign failed: %08x\n", hres);
3236 ok(!strcmp_wa(str, "center"), "get_textAlign returned %s\n", wine_dbgstr_w(str));
3237 SysFreeString(str);
3238
3239 hres = IHTMLCurrentStyle_get_textDecoration(current_style, &str);
3240 ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
3241 ok(!strcmp_wa(str, "none"), "get_textDecoration returned %s\n", wine_dbgstr_w(str));
3242 SysFreeString(str);
3243
3244 hres = IHTMLCurrentStyle_get_cursor(current_style, &str);
3245 ok(hres == S_OK, "get_cursor failed: %08x\n", hres);
3246 ok(!strcmp_wa(str, "default"), "get_cursor returned %s\n", wine_dbgstr_w(str));
3247 SysFreeString(str);
3248
3249 hres = IHTMLCurrentStyle_get_backgroundRepeat(current_style, &str);
3250 ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres);
3251 ok(!strcmp_wa(str, "repeat"), "get_backgroundRepeat returned %s\n", wine_dbgstr_w(str));
3252 SysFreeString(str);
3253
3254 hres = IHTMLCurrentStyle_get_borderColor(current_style, &str);
3255 ok(hres == S_OK, "get_borderColor failed: %08x\n", hres);
3256 SysFreeString(str);
3257
3258 hres = IHTMLCurrentStyle_get_borderStyle(current_style, &str);
3259 ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres);
3260 SysFreeString(str);
3261
3262 hres = IHTMLCurrentStyle_get_visibility(current_style, &str);
3263 ok(hres == S_OK, "get_visibility failed: %08x\n", hres);
3264 SysFreeString(str);
3265
3266 hres = IHTMLCurrentStyle_get_overflow(current_style, &str);
3267 ok(hres == S_OK, "get_overflow failed: %08x\n", hres);
3268 SysFreeString(str);
3269
3270 hres = IHTMLCurrentStyle_get_borderWidth(current_style, &str);
3271 ok(hres == S_OK, "get_borderWidth failed: %08x\n", hres);
3272 SysFreeString(str);
3273
3274 hres = IHTMLCurrentStyle_get_margin(current_style, &str);
3275 ok(hres == S_OK, "get_margin failed: %08x\n", hres);
3276 SysFreeString(str);
3277
3278 hres = IHTMLCurrentStyle_get_fontWeight(current_style, &v);
3279 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
3280 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3281 ok( V_I4(&v) == 400, "expect 400 got (%d)\n", V_I4(&v));
3282 VariantClear(&v);
3283
3284 hres = IHTMLCurrentStyle_get_fontSize(current_style, &v);
3285 ok(hres == S_OK, "get_fontSize failed: %08x\n", hres);
3286 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3287 VariantClear(&v);
3288
3289 hres = IHTMLCurrentStyle_get_left(current_style, &v);
3290 ok(hres == S_OK, "get_left failed: %08x\n", hres);
3291 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3292 VariantClear(&v);
3293
3294 hres = IHTMLCurrentStyle_get_top(current_style, &v);
3295 ok(hres == S_OK, "get_top failed: %08x\n", hres);
3296 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3297 VariantClear(&v);
3298
3299 hres = IHTMLCurrentStyle_get_width(current_style, &v);
3300 ok(hres == S_OK, "get_width failed: %08x\n", hres);
3301 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3302 VariantClear(&v);
3303
3304 hres = IHTMLCurrentStyle_get_height(current_style, &v);
3305 ok(hres == S_OK, "get_height failed: %08x\n", hres);
3306 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3307 VariantClear(&v);
3308
3309 hres = IHTMLCurrentStyle_get_paddingLeft(current_style, &v);
3310 ok(hres == S_OK, "get_paddingLeft failed: %08x\n", hres);