1 /*
2 * Copyright 2007-2011 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #include "precomp.h"
20
strcmp_wa(LPCWSTR strw,const char * stra)21 static int strcmp_wa(LPCWSTR strw, const char *stra)
22 {
23 CHAR buf[512];
24 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
25 return lstrcmpA(stra, buf);
26 }
27
wstr_contains(const WCHAR * strw,const char * stra)28 static BOOL wstr_contains(const WCHAR *strw, const char *stra)
29 {
30 CHAR buf[512];
31 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
32 return strstr(buf, stra) != NULL;
33 }
34
a2bstr(const char * str)35 static BSTR a2bstr(const char *str)
36 {
37 BSTR ret;
38 int len;
39
40 if(!str)
41 return NULL;
42
43 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
44 ret = SysAllocStringLen(NULL, len);
45 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
46
47 return ret;
48 }
49
strstr_wa(const WCHAR * str,const char * suba)50 static const WCHAR *strstr_wa(const WCHAR *str, const char *suba)
51 {
52 BSTR sub;
53 const WCHAR *ret = NULL;
54 sub = a2bstr(suba);
55 while (*str)
56 {
57 const WCHAR *p1 = str, *p2 = sub;
58 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
59 if (!*p2) {ret = str; break;}
60 str++;
61 }
62 SysFreeString(sub);
63 return ret;
64 }
65
66 #define test_var_bstr(a,b) _test_var_bstr(__LINE__,a,b)
_test_var_bstr(unsigned line,const VARIANT * v,const char * expect)67 static void _test_var_bstr(unsigned line, const VARIANT *v, const char *expect)
68 {
69 ok_(__FILE__,line)(V_VT(v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(v));
70 if(expect)
71 ok_(__FILE__,line)(!strcmp_wa(V_BSTR(v), expect), "V_BSTR(v) = %s, expected %s\n", wine_dbgstr_w(V_BSTR(v)), expect);
72 else
73 ok_(__FILE__,line)(!V_BSTR(v), "V_BSTR(v) = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(v)));
74 }
75
76 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
_get_elem2_iface(unsigned line,IUnknown * unk)77 static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk)
78 {
79 IHTMLElement2 *elem;
80 HRESULT hres;
81
82 hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement2, (void**)&elem);
83 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres);
84 return elem;
85 }
86
87 #define get_current_style2_iface(u) _get_current_style2_iface(__LINE__,u)
_get_current_style2_iface(unsigned line,IUnknown * unk)88 static IHTMLCurrentStyle2 *_get_current_style2_iface(unsigned line, IUnknown *unk)
89 {
90 IHTMLCurrentStyle2 *current_style2;
91 HRESULT hres;
92
93 hres = IUnknown_QueryInterface(unk, &IID_IHTMLCurrentStyle2, (void**)¤t_style2);
94 ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres);
95 return current_style2;
96 }
97
get_element_by_id(IHTMLDocument2 * doc,const char * id)98 static IHTMLElement *get_element_by_id(IHTMLDocument2 *doc, const char *id)
99 {
100 HRESULT hres;
101 IHTMLDocument3 *doc3;
102 IHTMLElement *result;
103 BSTR idW = a2bstr(id);
104
105 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
106 ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres);
107
108 hres = IHTMLDocument3_getElementById(doc3, idW, &result);
109 ok(hres == S_OK, "getElementById failed: %08x\n", hres);
110 ok(result != NULL, "result == NULL\n");
111 SysFreeString(idW);
112
113 IHTMLDocument3_Release(doc3);
114 return result;
115 }
116
117 #define get_current_style(e) _get_current_style(__LINE__,e)
_get_current_style(unsigned line,IHTMLElement * elem)118 static IHTMLCurrentStyle *_get_current_style(unsigned line, IHTMLElement *elem)
119 {
120 IHTMLCurrentStyle *cstyle;
121 IHTMLElement2 *elem2;
122 HRESULT hres;
123
124 hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLElement2, (void**)&elem2);
125 ok(hres == S_OK, "Could not get IHTMLElement2 iface: %08x\n", hres);
126
127 cstyle = NULL;
128 hres = IHTMLElement2_get_currentStyle(elem2, &cstyle);
129 ok(hres == S_OK, "get_currentStyle failed: %08x\n", hres);
130 ok(cstyle != NULL, "cstyle = %p\n", cstyle);
131
132 IHTMLElement2_Release(elem2);
133 return cstyle;
134 }
135
136 #define test_border_styles(p, n) _test_border_styles(__LINE__, p, n)
_test_border_styles(unsigned line,IHTMLStyle * pStyle,BSTR Name)137 static void _test_border_styles(unsigned line, IHTMLStyle *pStyle, BSTR Name)
138 {
139 HRESULT hres;
140 DISPID dispid;
141
142 hres = IHTMLStyle_GetIDsOfNames(pStyle, &IID_NULL, &Name, 1,
143 LOCALE_USER_DEFAULT, &dispid);
144 ok_(__FILE__,line) (hres == S_OK, "GetIDsOfNames: %08x\n", hres);
145 if(hres == S_OK)
146 {
147 DISPPARAMS params = {NULL,NULL,0,0};
148 DISPID dispidNamed = DISPID_PROPERTYPUT;
149 VARIANT ret;
150 VARIANT vDefault;
151 VARIANTARG arg;
152
153 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
154 DISPATCH_PROPERTYGET, ¶ms, &vDefault, NULL, NULL);
155 ok_(__FILE__,line) (hres == S_OK, "get_default. ret: %08x\n", hres);
156
157 params.cArgs = 1;
158 params.cNamedArgs = 1;
159 params.rgdispidNamedArgs = &dispidNamed;
160 V_VT(&arg) = VT_BSTR;
161 V_BSTR(&arg) = a2bstr("none");
162 params.rgvarg = &arg;
163 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
164 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
165 ok_(__FILE__,line) (hres == S_OK, "none. ret: %08x\n", hres);
166 VariantClear(&arg);
167
168 V_VT(&arg) = VT_BSTR;
169 V_BSTR(&arg) = a2bstr("dotted");
170 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
171 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
172 ok_(__FILE__,line) (hres == S_OK, "dotted. ret: %08x\n", hres);
173 VariantClear(&arg);
174
175 V_VT(&arg) = VT_BSTR;
176 V_BSTR(&arg) = a2bstr("dashed");
177 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
178 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
179 ok_(__FILE__,line) (hres == S_OK, "dashed. ret: %08x\n", hres);
180 VariantClear(&arg);
181
182 V_VT(&arg) = VT_BSTR;
183 V_BSTR(&arg) = a2bstr("solid");
184 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
185 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
186 ok_(__FILE__,line) (hres == S_OK, "solid. ret: %08x\n", hres);
187 VariantClear(&arg);
188
189 V_VT(&arg) = VT_BSTR;
190 V_BSTR(&arg) = a2bstr("double");
191 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
192 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
193 ok_(__FILE__,line) (hres == S_OK, "double. ret: %08x\n", hres);
194 VariantClear(&arg);
195
196 V_VT(&arg) = VT_BSTR;
197 V_BSTR(&arg) = a2bstr("groove");
198 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
199 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
200 ok_(__FILE__,line) (hres == S_OK, "groove. ret: %08x\n", hres);
201 VariantClear(&arg);
202
203 V_VT(&arg) = VT_BSTR;
204 V_BSTR(&arg) = a2bstr("ridge");
205 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
206 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
207 ok_(__FILE__,line) (hres == S_OK, "ridge. ret: %08x\n", hres);
208 VariantClear(&arg);
209
210 V_VT(&arg) = VT_BSTR;
211 V_BSTR(&arg) = a2bstr("inset");
212 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
213 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
214 ok_(__FILE__,line) (hres == S_OK, "inset. ret: %08x\n", hres);
215 VariantClear(&arg);
216
217 V_VT(&arg) = VT_BSTR;
218 V_BSTR(&arg) = a2bstr("outset");
219 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
220 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
221 ok_(__FILE__,line) (hres == S_OK, "outset. ret: %08x\n", hres);
222 VariantClear(&arg);
223
224 V_VT(&arg) = VT_BSTR;
225 V_BSTR(&arg) = a2bstr("invalid");
226 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
227 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
228 ok_(__FILE__,line) (FAILED(hres), "invalid value passed.\n");
229 VariantClear(&arg);
230
231 params.rgvarg = &vDefault;
232 hres = IHTMLStyle_Invoke(pStyle, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
233 DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, NULL);
234 ok_(__FILE__,line) (hres == S_OK, "default. ret: %08x\n", hres);
235 VariantClear(&vDefault);
236 }
237 }
238
239 #define test_style_csstext(s,t) _test_style_csstext(__LINE__,s,t)
_test_style_csstext(unsigned line,IHTMLStyle * style,const char * extext)240 static void _test_style_csstext(unsigned line, IHTMLStyle *style, const char *extext)
241 {
242 BSTR text = (void*)0xdeadbeef;
243 HRESULT hres;
244
245 hres = IHTMLStyle_get_cssText(style, &text);
246 ok_(__FILE__,line)(hres == S_OK, "get_cssText failed: %08x\n", hres);
247 if(extext)
248 ok_(__FILE__,line)(!strcmp_wa(text, extext), "cssText = %s\n", wine_dbgstr_w(text));
249 else
250 ok_(__FILE__,line)(!text, "cssText = %s\n", wine_dbgstr_w(text));
251
252 SysFreeString(text);
253 }
254
255 #define test_style_set_csstext(s,t) _test_style_set_csstext(__LINE__,s,t)
_test_style_set_csstext(unsigned line,IHTMLStyle * style,const char * text)256 static void _test_style_set_csstext(unsigned line, IHTMLStyle *style, const char *text)
257 {
258 BSTR tmp;
259 HRESULT hres;
260
261 tmp = a2bstr(text);
262 hres = IHTMLStyle_put_cssText(style, tmp);
263 ok_(__FILE__,line)(hres == S_OK, "put_cssText failed: %08x\n", hres);
264 SysFreeString(tmp);
265 }
266
267 #define test_style_remove_attribute(a,b,c) _test_style_remove_attribute(__LINE__,a,b,c)
_test_style_remove_attribute(unsigned line,IHTMLStyle * style,const char * attr,VARIANT_BOOL exb)268 static void _test_style_remove_attribute(unsigned line, IHTMLStyle *style, const char *attr, VARIANT_BOOL exb)
269 {
270 BSTR str = a2bstr(attr);
271 VARIANT_BOOL b = 100;
272 HRESULT hres;
273
274 hres = IHTMLStyle_removeAttribute(style, str, 1, &b);
275 SysFreeString(str);
276 ok_(__FILE__,line)(hres == S_OK, "removeAttribute failed: %08x\n", hres);
277 ok_(__FILE__,line)(b == exb, "removeAttribute returned %x, expected %x\n", b, exb);
278 }
279
280 #define set_text_decoration(a,b) _set_text_decoration(__LINE__,a,b)
_set_text_decoration(unsigned line,IHTMLStyle * style,const char * v)281 static void _set_text_decoration(unsigned line, IHTMLStyle *style, const char *v)
282 {
283 BSTR str;
284 HRESULT hres;
285
286 str = a2bstr(v);
287 hres = IHTMLStyle_put_textDecoration(style, str);
288 ok_(__FILE__,line)(hres == S_OK, "put_textDecoration failed: %08x\n", hres);
289 SysFreeString(str);
290 }
291
292 #define test_text_decoration(a,b) _test_text_decoration(__LINE__,a,b)
_test_text_decoration(unsigned line,IHTMLStyle * style,const char * exdec)293 static void _test_text_decoration(unsigned line, IHTMLStyle *style, const char *exdec)
294 {
295 BSTR str;
296 HRESULT hres;
297
298 hres = IHTMLStyle_get_textDecoration(style, &str);
299 ok_(__FILE__,line)(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
300 if(exdec)
301 ok_(__FILE__,line)(!strcmp_wa(str, exdec), "textDecoration = %s, expected %s\n", wine_dbgstr_w(str), exdec);
302 else
303 ok_(__FILE__,line)(!str, "textDecoration = %s, expected NULL\n", wine_dbgstr_w(str));
304 SysFreeString(str);
305 }
306
test_set_csstext(IHTMLStyle * style)307 static void test_set_csstext(IHTMLStyle *style)
308 {
309 VARIANT v;
310 HRESULT hres;
311
312 test_style_set_csstext(style, "background-color: black;");
313
314 hres = IHTMLStyle_get_backgroundColor(style, &v);
315 ok(hres == S_OK, "get_backgroundColor: %08x\n", hres);
316 ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v));
317 ok(!strcmp_wa(V_BSTR(&v), "black"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
318 VariantClear(&v);
319 }
320
test_style2(IHTMLStyle2 * style2)321 static void test_style2(IHTMLStyle2 *style2)
322 {
323 VARIANT v;
324 BSTR str;
325 HRESULT hres;
326
327 str = (void*)0xdeadbeef;
328 hres = IHTMLStyle2_get_position(style2, &str);
329 ok(hres == S_OK, "get_position failed: %08x\n", hres);
330 ok(!str, "str != NULL\n");
331
332 str = a2bstr("absolute");
333 hres = IHTMLStyle2_put_position(style2, str);
334 ok(hres == S_OK, "put_position failed: %08x\n", hres);
335 SysFreeString(str);
336
337 str = NULL;
338 hres = IHTMLStyle2_get_position(style2, &str);
339 ok(hres == S_OK, "get_position failed: %08x\n", hres);
340 ok(!strcmp_wa(str, "absolute"), "get_position returned %s\n", wine_dbgstr_w(str));
341 SysFreeString(str);
342
343 /* Test right */
344 V_VT(&v) = VT_EMPTY;
345 hres = IHTMLStyle2_get_right(style2, &v);
346 ok(hres == S_OK, "get_top failed: %08x\n", hres);
347 ok(V_VT(&v) == VT_BSTR, "V_VT(right)=%d\n", V_VT(&v));
348 ok(!V_BSTR(&v), "V_BSTR(right) != NULL\n");
349 VariantClear(&v);
350
351 V_VT(&v) = VT_BSTR;
352 V_BSTR(&v) = a2bstr("3px");
353 hres = IHTMLStyle2_put_right(style2, v);
354 ok(hres == S_OK, "put_right failed: %08x\n", hres);
355 VariantClear(&v);
356
357 V_VT(&v) = VT_EMPTY;
358 hres = IHTMLStyle2_get_right(style2, &v);
359 ok(hres == S_OK, "get_right failed: %08x\n", hres);
360 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
361 ok(!strcmp_wa(V_BSTR(&v), "3px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
362 VariantClear(&v);
363
364 /* direction */
365 str = (void*)0xdeadbeef;
366 hres = IHTMLStyle2_get_direction(style2, &str);
367 ok(hres == S_OK, "get_direction failed: %08x\n", hres);
368 ok(!str, "str = %s\n", wine_dbgstr_w(str));
369
370 str = a2bstr("ltr");
371 hres = IHTMLStyle2_put_direction(style2, str);
372 ok(hres == S_OK, "put_direction failed: %08x\n", hres);
373 SysFreeString(str);
374
375 str = NULL;
376 hres = IHTMLStyle2_get_direction(style2, &str);
377 ok(hres == S_OK, "get_direction failed: %08x\n", hres);
378 ok(!strcmp_wa(str, "ltr"), "str = %s\n", wine_dbgstr_w(str));
379 SysFreeString(str);
380
381 /* bottom */
382 V_VT(&v) = VT_EMPTY;
383 hres = IHTMLStyle2_get_bottom(style2, &v);
384 ok(hres == S_OK, "get_bottom failed: %08x\n", hres);
385 test_var_bstr(&v, NULL);
386
387 V_VT(&v) = VT_I4;
388 V_I4(&v) = 4;
389 hres = IHTMLStyle2_put_bottom(style2, v);
390 ok(hres == S_OK, "put_bottom failed: %08x\n", hres);
391
392 V_VT(&v) = VT_EMPTY;
393 hres = IHTMLStyle2_get_bottom(style2, &v);
394 ok(hres == S_OK, "get_bottom failed: %08x\n", hres);
395 test_var_bstr(&v, "4px");
396
397 /* overflowX */
398 str = (void*)0xdeadbeef;
399 hres = IHTMLStyle2_get_overflowX(style2, &str);
400 ok(hres == S_OK, "get_overflowX failed: %08x\n", hres);
401 ok(!str, "overflowX = %s\n", wine_dbgstr_w(str));
402
403 str = a2bstr("hidden");
404 hres = IHTMLStyle2_put_overflowX(style2, str);
405 ok(hres == S_OK, "put_overflowX failed: %08x\n", hres);
406 SysFreeString(str);
407
408 str = NULL;
409 hres = IHTMLStyle2_get_overflowX(style2, &str);
410 ok(hres == S_OK, "get_overflowX failed: %08x\n", hres);
411 ok(!strcmp_wa(str, "hidden"), "overflowX = %s\n", wine_dbgstr_w(str));
412
413 /* overflowY */
414 str = (void*)0xdeadbeef;
415 hres = IHTMLStyle2_get_overflowY(style2, &str);
416 ok(hres == S_OK, "get_overflowY failed: %08x\n", hres);
417 ok(!str, "overflowY = %s\n", wine_dbgstr_w(str));
418
419 str = a2bstr("hidden");
420 hres = IHTMLStyle2_put_overflowY(style2, str);
421 ok(hres == S_OK, "put_overflowY failed: %08x\n", hres);
422 SysFreeString(str);
423
424 str = NULL;
425 hres = IHTMLStyle2_get_overflowY(style2, &str);
426 ok(hres == S_OK, "get_overflowY failed: %08x\n", hres);
427 ok(!strcmp_wa(str, "hidden"), "overflowX = %s\n", wine_dbgstr_w(str));
428
429 /* tableLayout */
430 str = a2bstr("fixed");
431 hres = IHTMLStyle2_put_tableLayout(style2, str);
432 ok(hres == S_OK, "put_tableLayout failed: %08x\n", hres);
433 SysFreeString(str);
434
435 str = (void*)0xdeadbeef;
436 hres = IHTMLStyle2_get_tableLayout(style2, &str);
437 ok(hres == S_OK, "get_tableLayout failed: %08x\n", hres);
438 ok(!strcmp_wa(str, "fixed"), "tableLayout = %s\n", wine_dbgstr_w(str));
439 SysFreeString(str);
440 }
441
test_style3(IHTMLStyle3 * style3)442 static void test_style3(IHTMLStyle3 *style3)
443 {
444 VARIANT v;
445 BSTR str;
446 HRESULT hres;
447
448 str = (void*)0xdeadbeef;
449 hres = IHTMLStyle3_get_wordWrap(style3, &str);
450 ok(hres == S_OK, "get_wordWrap failed: %08x\n", hres);
451 ok(!str, "str != NULL\n");
452
453 str = a2bstr("break-word");
454 hres = IHTMLStyle3_put_wordWrap(style3, str);
455 ok(hres == S_OK, "put_wordWrap failed: %08x\n", hres);
456 SysFreeString(str);
457
458 str = NULL;
459 hres = IHTMLStyle3_get_wordWrap(style3, &str);
460 ok(hres == S_OK, "get_wordWrap failed: %08x\n", hres);
461 ok(!strcmp_wa(str, "break-word"), "get_wordWrap returned %s\n", wine_dbgstr_w(str));
462 SysFreeString(str);
463
464 V_VT(&v) = VT_ERROR;
465 hres = IHTMLStyle3_get_zoom(style3, &v);
466 ok(hres == S_OK, "get_zoom failed: %08x\n", hres);
467 ok(V_VT(&v) == VT_BSTR, "V_VT(zoom) = %d\n", V_VT(&v));
468 ok(!V_BSTR(&v), "V_BSTR(zoom) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
469 VariantClear(&v);
470
471 V_VT(&v) = VT_BSTR;
472 V_BSTR(&v) = a2bstr("100%");
473 hres = IHTMLStyle3_put_zoom(style3, v);
474 ok(hres == S_OK, "put_zoom failed: %08x\n", hres);
475
476 V_VT(&v) = VT_ERROR;
477 hres = IHTMLStyle3_get_zoom(style3, &v);
478 ok(hres == S_OK, "get_zoom failed: %08x\n", hres);
479 ok(V_VT(&v) == VT_BSTR, "V_VT(zoom) = %d\n", V_VT(&v));
480 ok(!strcmp_wa(V_BSTR(&v), "100%"), "V_BSTR(zoom) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
481 VariantClear(&v);
482
483 V_VT(&v) = VT_I4;
484 V_I4(&v) = 1;
485 hres = IHTMLStyle3_put_zoom(style3, v);
486 ok(hres == S_OK, "put_zoom failed: %08x\n", hres);
487
488 V_VT(&v) = VT_ERROR;
489 hres = IHTMLStyle3_get_zoom(style3, &v);
490 ok(hres == S_OK, "get_zoom failed: %08x\n", hres);
491 ok(V_VT(&v) == VT_BSTR, "V_VT(zoom) = %d\n", V_VT(&v));
492 ok(!strcmp_wa(V_BSTR(&v), "1"), "V_BSTR(zoom) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
493 VariantClear(&v);
494 }
495
test_style4(IHTMLStyle4 * style4)496 static void test_style4(IHTMLStyle4 *style4)
497 {
498 HRESULT hres;
499 VARIANT v;
500 VARIANT vdefault;
501
502 hres = IHTMLStyle4_get_minHeight(style4, &vdefault);
503 ok(hres == S_OK, "get_minHeight failed: %08x\n", hres);
504
505 V_VT(&v) = VT_BSTR;
506 V_BSTR(&v) = a2bstr("10px");
507 hres = IHTMLStyle4_put_minHeight(style4, v);
508 ok(hres == S_OK, "put_minHeight failed: %08x\n", hres);
509 VariantClear(&v);
510
511 hres = IHTMLStyle4_get_minHeight(style4, &v);
512 ok(hres == S_OK, "get_minHeight failed: %08x\n", hres);
513 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
514 ok( !strcmp_wa(V_BSTR(&v), "10px"), "expect 10px got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
515 VariantClear(&v);
516
517 hres = IHTMLStyle4_put_minHeight(style4, vdefault);
518 ok(hres == S_OK, "put_minHeight failed: %08x\n", hres);
519 VariantClear(&vdefault);
520 }
521
test_style5(IHTMLStyle5 * style5)522 static void test_style5(IHTMLStyle5 *style5)
523 {
524 HRESULT hres;
525 VARIANT v;
526 VARIANT vdefault;
527
528 /* minWidth */
529 hres = IHTMLStyle5_get_minWidth(style5, &vdefault);
530 ok(hres == S_OK, "get_minWidth failed: %08x\n", hres);
531
532 V_VT(&v) = VT_BSTR;
533 V_BSTR(&v) = a2bstr("12px");
534 hres = IHTMLStyle5_put_minWidth(style5, v);
535 ok(hres == S_OK, "put_minWidth failed: %08x\n", hres);
536 VariantClear(&v);
537
538 hres = IHTMLStyle5_get_minWidth(style5, &v);
539 ok(hres == S_OK, "get_minWidth failed: %08x\n", hres);
540 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
541 ok(!strcmp_wa(V_BSTR(&v), "12px"), "expect 12px got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
542 VariantClear(&v);
543
544 V_VT(&v) = VT_BSTR;
545 V_BSTR(&v) = a2bstr("10%");
546 hres = IHTMLStyle5_put_minWidth(style5, v);
547 ok(hres == S_OK, "put_minWidth failed: %08x\n", hres);
548 VariantClear(&v);
549
550 hres = IHTMLStyle5_get_minWidth(style5, &v);
551 ok(hres == S_OK, "get_minWidth failed: %08x\n", hres);
552 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
553 ok(!strcmp_wa(V_BSTR(&v), "10%"), "expect 10%% got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
554 VariantClear(&v);
555
556 V_VT(&v) = VT_BSTR;
557 V_BSTR(&v) = a2bstr("10");
558 hres = IHTMLStyle5_put_minWidth(style5, v);
559 ok(hres == S_OK, "put_minWidth failed: %08x\n", hres);
560 VariantClear(&v);
561
562 hres = IHTMLStyle5_get_minWidth(style5, &v);
563 ok(hres == S_OK, "get_minWidth failed: %08x\n", hres);
564 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
565 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expect 10px got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
566 VariantClear(&v);
567
568 hres = IHTMLStyle5_put_minWidth(style5, vdefault);
569 ok(hres == S_OK, "put_minWidth failed: %08x\n", hres);
570 VariantClear(&vdefault);
571
572 /* maxWidth */
573 hres = IHTMLStyle5_get_maxWidth(style5, &vdefault);
574 ok(hres == S_OK, "get_maxWidth failed: %08x\n", hres);
575
576 V_VT(&v) = VT_BSTR;
577 V_BSTR(&v) = a2bstr("200px");
578 hres = IHTMLStyle5_put_maxWidth(style5, v);
579 ok(hres == S_OK, "put_maxWidth failed: %08x\n", hres);
580 VariantClear(&v);
581
582 hres = IHTMLStyle5_get_maxWidth(style5, &v);
583 ok(hres == S_OK, "get_maxWidth failed: %08x\n", hres);
584 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n",V_VT(&v));
585 ok(!strcmp_wa(V_BSTR(&v), "200px"), "expect 200px got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
586 VariantClear(&v);
587
588 V_VT(&v) = VT_BSTR;
589 V_BSTR(&v) = a2bstr("70%");
590 hres = IHTMLStyle5_put_maxWidth(style5, v);
591 ok(hres == S_OK, "put_maxWidth failed: %08x\n", hres);
592 VariantClear(&v);
593
594 hres = IHTMLStyle5_get_maxWidth(style5, &v);
595 ok(hres == S_OK, "get maxWidth failed: %08x\n", hres);
596 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
597 ok(!strcmp_wa(V_BSTR(&v), "70%"), "expect 70%% got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
598 VariantClear(&v);
599
600 hres = IHTMLStyle5_put_maxWidth(style5,vdefault);
601 ok(hres == S_OK, "put_maxWidth failed: %08x\n", hres);
602 VariantClear(&vdefault);
603
604 /* maxHeight */
605 hres = IHTMLStyle5_get_maxHeight(style5, &vdefault);
606 ok(hres == S_OK, "get maxHeight failed: %08x\n", hres);
607
608 V_VT(&v) = VT_BSTR;
609 V_BSTR(&v) = a2bstr("200px");
610 hres = IHTMLStyle5_put_maxHeight(style5, v);
611 ok(hres == S_OK, "put maxHeight failed: %08x\n", hres);
612 VariantClear(&v);
613
614 hres = IHTMLStyle5_get_maxHeight(style5, &v);
615 ok(hres == S_OK, "get maxHeight failed: %08x\n", hres);
616 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
617 ok(!strcmp_wa(V_BSTR(&v), "200px"), "expect 200px got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
618 VariantClear(&v);
619
620 V_VT(&v) = VT_BSTR;
621 V_BSTR(&v) = a2bstr("70%");
622 hres = IHTMLStyle5_put_maxHeight(style5, v);
623 ok(hres == S_OK, "put maxHeight failed: %08x\n", hres);
624 VariantClear(&v);
625
626 hres = IHTMLStyle5_get_maxHeight(style5, &v);
627 ok(hres == S_OK, "get_maxHeight failed: %08x\n", hres);
628 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
629 ok(!strcmp_wa(V_BSTR(&v), "70%"), "expect 70%% got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
630 VariantClear(&v);
631
632 V_VT(&v) = VT_BSTR;
633 V_BSTR(&v) = a2bstr("100");
634 hres = IHTMLStyle5_put_maxHeight(style5, v);
635 ok(hres == S_OK, "put maxHeight failed: %08x\n", hres);
636 VariantClear(&v);
637
638 hres = IHTMLStyle5_get_maxHeight(style5, &v);
639 ok(hres == S_OK, "get_maxHeight failed: %08x\n", hres);
640 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
641 ok(!strcmp_wa(V_BSTR(&v), "100px"), "expect 100 got (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
642 VariantClear(&v);
643
644 hres = IHTMLStyle5_put_maxHeight(style5, vdefault);
645 ok(hres == S_OK, "put maxHeight failed:%08x\n", hres);
646 VariantClear(&vdefault);
647 }
648
test_style6(IHTMLStyle6 * style)649 static void test_style6(IHTMLStyle6 *style)
650 {
651 BSTR str;
652 HRESULT hres;
653
654 str = (void*)0xdeadbeef;
655 hres = IHTMLStyle6_get_outline(style, &str);
656 ok(hres == S_OK, "get_outline failed: %08x\n", hres);
657 ok(str && !*str, "outline = %s\n", wine_dbgstr_w(str));
658 SysFreeString(str);
659
660 str = a2bstr("1px");
661 hres = IHTMLStyle6_put_outline(style, str);
662 ok(hres == S_OK, "put_outline failed: %08x\n", hres);
663 SysFreeString(str);
664
665 str = (void*)0xdeadbeef;
666 hres = IHTMLStyle6_get_outline(style, &str);
667 ok(hres == S_OK, "get_outline failed: %08x\n", hres);
668 ok(wstr_contains(str, "1px"), "outline = %s\n", wine_dbgstr_w(str));
669 SysFreeString(str);
670
671 str = (void*)0xdeadbeef;
672 hres = IHTMLStyle6_get_boxSizing(style, &str);
673 ok(hres == S_OK, "get_boxSizing failed: %08x\n", hres);
674 ok(!str, "boxSizing = %s\n", wine_dbgstr_w(str));
675 SysFreeString(str);
676
677 str = a2bstr("border-box");
678 hres = IHTMLStyle6_put_boxSizing(style, str);
679 ok(hres == S_OK, "put_boxSizing failed: %08x\n", hres);
680 SysFreeString(str);
681
682 str = NULL;
683 hres = IHTMLStyle6_get_boxSizing(style, &str);
684 ok(hres == S_OK, "get_boxSizing failed: %08x\n", hres);
685 ok(!strcmp_wa(str, "border-box"), "boxSizing = %s\n", wine_dbgstr_w(str));
686 SysFreeString(str);
687 }
688
test_body_style(IHTMLStyle * style)689 static void test_body_style(IHTMLStyle *style)
690 {
691 IHTMLStyle2 *style2;
692 IHTMLStyle3 *style3;
693 IHTMLStyle4 *style4;
694 IHTMLStyle5 *style5;
695 IHTMLStyle6 *style6;
696 VARIANT_BOOL b;
697 VARIANT v;
698 BSTR str;
699 HRESULT hres;
700 float f;
701 BSTR sOverflowDefault;
702 BSTR sDefault;
703 LONG l;
704 VARIANT vDefault;
705
706 test_style_csstext(style, NULL);
707
708 hres = IHTMLStyle_get_position(style, &str);
709 ok(hres == S_OK, "get_position failed: %08x\n", hres);
710 ok(!str, "str=%s\n", wine_dbgstr_w(str));
711
712 V_VT(&v) = VT_NULL;
713 hres = IHTMLStyle_get_marginRight(style, &v);
714 ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
715 ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v));
716 ok(!V_BSTR(&v), "V_BSTR(marginRight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
717
718 V_VT(&v) = VT_I4;
719 V_I4(&v) = 6;
720 hres = IHTMLStyle_put_marginRight(style, v);
721 ok(hres == S_OK, "put_marginRight failed: %08x\n", hres);
722
723 V_VT(&v) = VT_NULL;
724 hres = IHTMLStyle_get_marginRight(style, &v);
725 ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
726 ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v));
727 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginRight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
728
729 V_VT(&v) = VT_NULL;
730 hres = IHTMLStyle_get_marginBottom(style, &v);
731 ok(hres == S_OK, "get_marginBottom failed: %08x\n", hres);
732 ok(V_VT(&v) == VT_BSTR, "V_VT(marginBottom) = %d\n", V_VT(&v));
733 ok(!V_BSTR(&v), "V_BSTR(marginBottom) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
734
735 V_VT(&v) = VT_I4;
736 V_I4(&v) = 6;
737 hres = IHTMLStyle_put_marginBottom(style, v);
738 ok(hres == S_OK, "put_marginBottom failed: %08x\n", hres);
739
740 V_VT(&v) = VT_NULL;
741 hres = IHTMLStyle_get_marginBottom(style, &v);
742 ok(hres == S_OK, "get_marginBottom failed: %08x\n", hres);
743 ok(V_VT(&v) == VT_BSTR, "V_VT(marginBottom) = %d\n", V_VT(&v));
744 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginBottom) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
745
746 V_VT(&v) = VT_NULL;
747 hres = IHTMLStyle_get_marginLeft(style, &v);
748 ok(hres == S_OK, "get_marginLeft failed: %08x\n", hres);
749 ok(V_VT(&v) == VT_BSTR, "V_VT(marginLeft) = %d\n", V_VT(&v));
750 ok(!V_BSTR(&v), "V_BSTR(marginLeft) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
751
752 V_VT(&v) = VT_I4;
753 V_I4(&v) = 6;
754 hres = IHTMLStyle_put_marginLeft(style, v);
755 ok(hres == S_OK, "put_marginLeft failed: %08x\n", hres);
756
757 V_VT(&v) = VT_NULL;
758 hres = IHTMLStyle_get_marginLeft(style, &v);
759 ok(hres == S_OK, "get_marginLeft failed: %08x\n", hres);
760 ok(V_VT(&v) == VT_BSTR, "V_VT(marginLeft) = %d\n", V_VT(&v));
761 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginLeft) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
762
763 str = (void*)0xdeadbeef;
764 hres = IHTMLStyle_get_fontFamily(style, &str);
765 ok(hres == S_OK, "get_fontFamily failed: %08x\n", hres);
766 ok(!str, "fontFamily = %s\n", wine_dbgstr_w(str));
767
768 str = (void*)0xdeadbeef;
769 hres = IHTMLStyle_get_fontWeight(style, &str);
770 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
771 ok(!str, "fontWeight = %s\n", wine_dbgstr_w(str));
772
773 hres = IHTMLStyle_get_fontWeight(style, &sDefault);
774 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
775
776 str = a2bstr("test");
777 hres = IHTMLStyle_put_fontWeight(style, str);
778 ok(hres == E_INVALIDARG, "put_fontWeight failed: %08x\n", hres);
779 SysFreeString(str);
780
781 str = a2bstr("bold");
782 hres = IHTMLStyle_put_fontWeight(style, str);
783 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
784 SysFreeString(str);
785
786 str = a2bstr("bolder");
787 hres = IHTMLStyle_put_fontWeight(style, str);
788 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
789 SysFreeString(str);
790
791 str = a2bstr("lighter");
792 hres = IHTMLStyle_put_fontWeight(style, str);
793 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
794 SysFreeString(str);
795
796 str = a2bstr("100");
797 hres = IHTMLStyle_put_fontWeight(style, str);
798 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
799 SysFreeString(str);
800
801 str = a2bstr("200");
802 hres = IHTMLStyle_put_fontWeight(style, str);
803 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
804 SysFreeString(str);
805
806 str = a2bstr("300");
807 hres = IHTMLStyle_put_fontWeight(style, str);
808 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
809 SysFreeString(str);
810
811 str = a2bstr("400");
812 hres = IHTMLStyle_put_fontWeight(style, str);
813 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
814 SysFreeString(str);
815
816 str = a2bstr("500");
817 hres = IHTMLStyle_put_fontWeight(style, str);
818 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
819 SysFreeString(str);
820
821 str = a2bstr("600");
822 hres = IHTMLStyle_put_fontWeight(style, str);
823 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
824 SysFreeString(str);
825
826 str = a2bstr("700");
827 hres = IHTMLStyle_put_fontWeight(style, str);
828 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
829 SysFreeString(str);
830
831 str = a2bstr("800");
832 hres = IHTMLStyle_put_fontWeight(style, str);
833 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
834 SysFreeString(str);
835
836 str = a2bstr("900");
837 hres = IHTMLStyle_put_fontWeight(style, str);
838 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
839 SysFreeString(str);
840
841 hres = IHTMLStyle_get_fontWeight(style, &str);
842 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
843 ok(!strcmp_wa(str, "900"), "str != style900\n");
844 SysFreeString(str);
845
846 str = a2bstr("");
847 hres = IHTMLStyle_put_fontWeight(style, str);
848 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
849 SysFreeString(str);
850
851 hres = IHTMLStyle_get_fontWeight(style, &str);
852 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
853 ok(!str, "str != NULL\n");
854 SysFreeString(str);
855
856 hres = IHTMLStyle_put_fontWeight(style, sDefault);
857 ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres);
858 SysFreeString(sDefault);
859
860 /* font Variant */
861 hres = IHTMLStyle_get_fontVariant(style, NULL);
862 ok(hres == E_INVALIDARG, "get_fontVariant failed: %08x\n", hres);
863
864 hres = IHTMLStyle_get_fontVariant(style, &sDefault);
865 ok(hres == S_OK, "get_fontVariant failed: %08x\n", hres);
866
867 str = a2bstr("test");
868 hres = IHTMLStyle_put_fontVariant(style, str);
869 ok(hres == E_INVALIDARG, "fontVariant failed: %08x\n", hres);
870 SysFreeString(str);
871
872 str = a2bstr("small-caps");
873 hres = IHTMLStyle_put_fontVariant(style, str);
874 ok(hres == S_OK, "fontVariant failed: %08x\n", hres);
875 SysFreeString(str);
876
877 str = a2bstr("normal");
878 hres = IHTMLStyle_put_fontVariant(style, str);
879 ok(hres == S_OK, "fontVariant failed: %08x\n", hres);
880 SysFreeString(str);
881
882 hres = IHTMLStyle_put_fontVariant(style, sDefault);
883 ok(hres == S_OK, "fontVariant failed: %08x\n", hres);
884 SysFreeString(sDefault);
885
886 str = (void*)0xdeadbeef;
887 hres = IHTMLStyle_get_display(style, &str);
888 ok(hres == S_OK, "get_display failed: %08x\n", hres);
889 ok(!str, "display = %s\n", wine_dbgstr_w(str));
890
891 str = (void*)0xdeadbeef;
892 hres = IHTMLStyle_get_visibility(style, &str);
893 ok(hres == S_OK, "get_visibility failed: %08x\n", hres);
894 ok(!str, "visibility = %s\n", wine_dbgstr_w(str));
895
896 V_VT(&v) = VT_NULL;
897 hres = IHTMLStyle_get_fontSize(style, &v);
898 ok(hres == S_OK, "get_fontSize failed: %08x\n", hres);
899 ok(V_VT(&v) == VT_BSTR, "V_VT(fontSize) = %d\n", V_VT(&v));
900 ok(!V_BSTR(&v), "V_BSTR(fontSize) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
901
902 V_VT(&v) = VT_I4;
903 V_I4(&v) = 12;
904 hres = IHTMLStyle_put_fontSize(style, v);
905 ok(hres == S_OK, "put_fontSize failed: %08x\n", hres);
906
907 V_VT(&v) = VT_NULL;
908 hres = IHTMLStyle_get_fontSize(style, &v);
909 ok(hres == S_OK, "get_fontSize failed: %08x\n", hres);
910 ok(V_VT(&v) == VT_BSTR, "V_VT(fontSize) = %d\n", V_VT(&v));
911 ok(!strcmp_wa(V_BSTR(&v), "12px"), "V_BSTR(fontSize) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
912
913 V_VT(&v) = VT_NULL;
914 hres = IHTMLStyle_get_color(style, &v);
915 ok(hres == S_OK, "get_color failed: %08x\n", hres);
916 ok(V_VT(&v) == VT_BSTR, "V_VT(color) = %d\n", V_VT(&v));
917 ok(!V_BSTR(&v), "V_BSTR(color) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
918
919 V_VT(&v) = VT_I4;
920 V_I4(&v) = 0xfdfd;
921 hres = IHTMLStyle_put_color(style, v);
922 ok(hres == S_OK, "put_color failed: %08x\n", hres);
923
924 V_VT(&v) = VT_NULL;
925 hres = IHTMLStyle_get_color(style, &v);
926 ok(hres == S_OK, "get_color failed: %08x\n", hres);
927 ok(V_VT(&v) == VT_BSTR, "V_VT(color) = %d\n", V_VT(&v));
928 todo_wine
929 ok(!strcmp_wa(V_BSTR(&v), "#00fdfd"), "V_BSTR(color) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
930
931 V_VT(&v) = VT_I4;
932 V_I4(&v) = 3;
933 hres = IHTMLStyle_put_lineHeight(style, v);
934 ok(hres == S_OK, "put_lineHeight failed: %08x\n", hres);
935
936 hres = IHTMLStyle_get_lineHeight(style, &v);
937 ok(hres == S_OK, "get_lineHeight failed: %08x\n", hres);
938 ok(V_VT(&v) == VT_BSTR, "V_VT(lineHeight) = %d, expect VT_BSTR\n", V_VT(&v));
939 ok(!strcmp_wa(V_BSTR(&v), "3"), "V_BSTR(lineHeight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
940
941 V_VT(&v) = VT_BSTR;
942 V_BSTR(&v) = a2bstr("300%");
943 hres = IHTMLStyle_put_lineHeight(style, v);
944 ok(hres == S_OK, "put_lineHeight failed: %08x\n", hres);
945 VariantClear(&v);
946
947 hres = IHTMLStyle_get_lineHeight(style, &v);
948 ok(hres == S_OK, "get_lineHeight failed: %08x\n", hres);
949 ok(V_VT(&v) == VT_BSTR, "V_VT(lineHeight) = %d, expect VT_BSTR\n", V_VT(&v));
950 ok(!strcmp_wa(V_BSTR(&v), "300%"), "V_BSTR(lineHeight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
951 VariantClear(&v);
952
953 b = 0xfefe;
954 hres = IHTMLStyle_get_textDecorationUnderline(style, &b);
955 ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
956 ok(b == VARIANT_FALSE, "textDecorationUnderline = %x\n", b);
957
958 hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_TRUE);
959 ok(hres == S_OK, "put_textDecorationUnderline failed: %08x\n", hres);
960
961 hres = IHTMLStyle_get_textDecorationUnderline(style, &b);
962 ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
963 ok(b == VARIANT_TRUE, "textDecorationUnderline = %x\n", b);
964
965 hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_FALSE);
966 ok(hres == S_OK, "put_textDecorationUnderline failed: %08x\n", hres);
967
968 b = 0xfefe;
969 hres = IHTMLStyle_get_textDecorationLineThrough(style, &b);
970 ok(hres == S_OK, "get_textDecorationLineThrough failed: %08x\n", hres);
971 ok(b == VARIANT_FALSE, "textDecorationLineThrough = %x\n", b);
972
973 hres = IHTMLStyle_put_textDecorationLineThrough(style, VARIANT_TRUE);
974 ok(hres == S_OK, "put_textDecorationLineThrough failed: %08x\n", hres);
975
976 hres = IHTMLStyle_get_textDecorationLineThrough(style, &b);
977 ok(hres == S_OK, "get_textDecorationLineThrough failed: %08x\n", hres);
978 ok(b == VARIANT_TRUE, "textDecorationLineThrough = %x\n", b);
979
980 hres = IHTMLStyle_put_textDecorationLineThrough(style, VARIANT_FALSE);
981 ok(hres == S_OK, "put_textDecorationLineThrough failed: %08x\n", hres);
982
983 b = 0xfefe;
984 hres = IHTMLStyle_get_textDecorationNone(style, &b);
985 ok(hres == S_OK, "get_textDecorationNone failed: %08x\n", hres);
986 ok(b == VARIANT_FALSE, "textDecorationNone = %x\n", b);
987
988 hres = IHTMLStyle_put_textDecorationNone(style, VARIANT_TRUE);
989 ok(hres == S_OK, "put_textDecorationNone failed: %08x\n", hres);
990
991 hres = IHTMLStyle_get_textDecorationNone(style, &b);
992 ok(hres == S_OK, "get_textDecorationNone failed: %08x\n", hres);
993 ok(b == VARIANT_TRUE, "textDecorationNone = %x\n", b);
994
995 hres = IHTMLStyle_put_textDecorationNone(style, VARIANT_FALSE);
996 ok(hres == S_OK, "put_textDecorationNone failed: %08x\n", hres);
997
998 b = 0xfefe;
999 hres = IHTMLStyle_get_textDecorationOverline(style, &b);
1000 ok(hres == S_OK, "get_textDecorationOverline failed: %08x\n", hres);
1001 ok(b == VARIANT_FALSE, "textDecorationOverline = %x\n", b);
1002
1003 hres = IHTMLStyle_put_textDecorationOverline(style, VARIANT_TRUE);
1004 ok(hres == S_OK, "put_textDecorationOverline failed: %08x\n", hres);
1005
1006 hres = IHTMLStyle_get_textDecorationOverline(style, &b);
1007 ok(hres == S_OK, "get_textDecorationOverline failed: %08x\n", hres);
1008 ok(b == VARIANT_TRUE, "textDecorationOverline = %x\n", b);
1009
1010 hres = IHTMLStyle_put_textDecorationOverline(style, VARIANT_FALSE);
1011 ok(hres == S_OK, "put_textDecorationOverline failed: %08x\n", hres);
1012
1013 b = 0xfefe;
1014 hres = IHTMLStyle_get_textDecorationBlink(style, &b);
1015 ok(hres == S_OK, "get_textDecorationBlink failed: %08x\n", hres);
1016 ok(b == VARIANT_FALSE, "textDecorationBlink = %x\n", b);
1017
1018 hres = IHTMLStyle_put_textDecorationBlink(style, VARIANT_TRUE);
1019 ok(hres == S_OK, "put_textDecorationBlink failed: %08x\n", hres);
1020
1021 hres = IHTMLStyle_get_textDecorationBlink(style, &b);
1022 ok(hres == S_OK, "get_textDecorationBlink failed: %08x\n", hres);
1023 ok(b == VARIANT_TRUE, "textDecorationBlink = %x\n", b);
1024
1025 hres = IHTMLStyle_put_textDecorationBlink(style, VARIANT_FALSE);
1026 ok(hres == S_OK, "textDecorationBlink failed: %08x\n", hres);
1027
1028 hres = IHTMLStyle_get_textDecoration(style, &sDefault);
1029 ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
1030
1031 str = a2bstr("invalid");
1032 hres = IHTMLStyle_put_textDecoration(style, str);
1033 ok(hres == E_INVALIDARG, "put_textDecoration failed: %08x\n", hres);
1034 SysFreeString(str);
1035
1036 set_text_decoration(style, "none");
1037 test_text_decoration(style, "none");
1038 set_text_decoration(style, "underline");
1039 set_text_decoration(style, "overline");
1040 set_text_decoration(style, "line-through");
1041 set_text_decoration(style, "blink");
1042 set_text_decoration(style, "overline");
1043 set_text_decoration(style, "blink");
1044 test_text_decoration(style, "blink");
1045
1046 hres = IHTMLStyle_put_textDecoration(style, sDefault);
1047 ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres);
1048 SysFreeString(sDefault);
1049
1050 hres = IHTMLStyle_get_posWidth(style, NULL);
1051 ok(hres == E_POINTER, "get_posWidth failed: %08x\n", hres);
1052
1053 hres = IHTMLStyle_get_posWidth(style, &f);
1054 ok(hres == S_OK, "get_posWidth failed: %08x\n", hres);
1055 ok(f == 0.0f, "f = %f\n", f);
1056
1057 V_VT(&v) = VT_EMPTY;
1058 hres = IHTMLStyle_get_width(style, &v);
1059 ok(hres == S_OK, "get_width failed: %08x\n", hres);
1060 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1061 ok(!V_BSTR(&v), "V_BSTR(v)=%p\n", V_BSTR(&v));
1062
1063 hres = IHTMLStyle_put_posWidth(style, 2.2);
1064 ok(hres == S_OK, "put_posWidth failed: %08x\n", hres);
1065
1066 hres = IHTMLStyle_get_posWidth(style, &f);
1067 ok(hres == S_OK, "get_posWidth failed: %08x\n", hres);
1068 ok(f == 2.0f ||
1069 f == 2.2f, /* IE8 */
1070 "f = %f\n", f);
1071
1072 l = 0xdeadbeef;
1073 hres = IHTMLStyle_get_pixelWidth(style, &l);
1074 ok(hres == S_OK, "get_pixelWidth failed: %08x\n", hres);
1075 ok(l == 2, "pixelWidth = %d\n", l);
1076
1077 V_VT(&v) = VT_BSTR;
1078 V_BSTR(&v) = a2bstr("auto");
1079 hres = IHTMLStyle_put_width(style, v);
1080 ok(hres == S_OK, "put_width failed: %08x\n", hres);
1081 VariantClear(&v);
1082
1083 V_VT(&v) = VT_EMPTY;
1084 hres = IHTMLStyle_get_width(style, &v);
1085 ok(hres == S_OK, "get_width failed: %08x\n", hres);
1086 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1087 ok(!strcmp_wa(V_BSTR(&v), "auto"), "V_BSTR(v)=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1088 VariantClear(&v);
1089
1090 V_VT(&v) = VT_I4;
1091 V_I4(&v) = 100;
1092 hres = IHTMLStyle_put_width(style, v);
1093 ok(hres == S_OK, "put_width failed: %08x\n", hres);
1094
1095 l = 0xdeadbeef;
1096 hres = IHTMLStyle_get_pixelWidth(style, &l);
1097 ok(hres == S_OK, "get_pixelWidth failed: %08x\n", hres);
1098 ok(l == 100, "pixelWidth = %d\n", l);
1099
1100 V_VT(&v) = VT_EMPTY;
1101 hres = IHTMLStyle_get_width(style, &v);
1102 ok(hres == S_OK, "get_width failed: %08x\n", hres);
1103 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1104 ok(!strcmp_wa(V_BSTR(&v), "100px"), "V_BSTR(v)=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1105 VariantClear(&v);
1106
1107 hres = IHTMLStyle_put_pixelWidth(style, 50);
1108 ok(hres == S_OK, "put_pixelWidth failed: %08x\n", hres);
1109
1110 l = 0xdeadbeef;
1111 hres = IHTMLStyle_get_pixelWidth(style, &l);
1112 ok(hres == S_OK, "get_pixelWidth failed: %08x\n", hres);
1113 ok(l == 50, "pixelWidth = %d\n", l);
1114
1115 hres = IHTMLStyle_get_pixelWidth(style, NULL);
1116 ok(hres == E_POINTER, "get_pixelWidth failed: %08x\n", hres);
1117
1118 V_VT(&v) = VT_EMPTY;
1119 hres = IHTMLStyle_get_width(style, &v);
1120 ok(hres == S_OK, "get_width failed: %08x\n", hres);
1121 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1122 ok(!strcmp_wa(V_BSTR(&v), "50px"), "V_BSTR(v)=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1123 VariantClear(&v);
1124
1125 /* margin tests */
1126 str = (void*)0xdeadbeef;
1127 hres = IHTMLStyle_get_margin(style, &str);
1128 ok(hres == S_OK, "get_margin failed: %08x\n", hres);
1129 ok(!str, "margin = %s\n", wine_dbgstr_w(str));
1130
1131 str = a2bstr("1");
1132 hres = IHTMLStyle_put_margin(style, str);
1133 ok(hres == S_OK, "put_margin failed: %08x\n", hres);
1134 SysFreeString(str);
1135
1136 hres = IHTMLStyle_get_margin(style, &str);
1137 ok(hres == S_OK, "get_margin failed: %08x\n", hres);
1138 ok(!strcmp_wa(str, "1px"), "margin = %s\n", wine_dbgstr_w(str));
1139 SysFreeString(str);
1140
1141 hres = IHTMLStyle_put_margin(style, NULL);
1142 ok(hres == S_OK, "put_margin failed: %08x\n", hres);
1143
1144 str = (void*)0xdeadbeef;
1145 hres = IHTMLStyle_get_marginTop(style, &v);
1146 ok(hres == S_OK, "get_marginTop failed: %08x\n", hres);
1147 ok(V_VT(&v) == VT_BSTR, "V_VT(marginTop) = %d\n", V_VT(&v));
1148 ok(!V_BSTR(&v), "V_BSTR(marginTop) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1149
1150 V_VT(&v) = VT_BSTR;
1151 V_BSTR(&v) = a2bstr("6px");
1152 hres = IHTMLStyle_put_marginTop(style, v);
1153 SysFreeString(V_BSTR(&v));
1154 ok(hres == S_OK, "put_marginTop failed: %08x\n", hres);
1155
1156 str = (void*)0xdeadbeef;
1157 hres = IHTMLStyle_get_marginTop(style, &v);
1158 ok(hres == S_OK, "get_marginTop failed: %08x\n", hres);
1159 ok(V_VT(&v) == VT_BSTR, "V_VT(marginTop) = %d\n", V_VT(&v));
1160 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginTop) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1161 VariantClear(&v);
1162
1163 V_VT(&v) = VT_I4;
1164 V_I4(&v) = 5;
1165 hres = IHTMLStyle_put_marginTop(style, v);
1166 ok(hres == S_OK, "put_marginTop failed: %08x\n", hres);
1167
1168 str = (void*)0xdeadbeef;
1169 hres = IHTMLStyle_get_marginTop(style, &v);
1170 ok(hres == S_OK, "get_marginTop failed: %08x\n", hres);
1171 ok(V_VT(&v) == VT_BSTR, "V_VT(marginTop) = %d\n", V_VT(&v));
1172 ok(!strcmp_wa(V_BSTR(&v), "5px"), "V_BSTR(marginTop) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1173 VariantClear(&v);
1174
1175 str = NULL;
1176 hres = IHTMLStyle_get_border(style, &str);
1177 ok(hres == S_OK, "get_border failed: %08x\n", hres);
1178 ok(!str || !*str, "str is not empty\n");
1179 SysFreeString(str);
1180
1181 str = a2bstr("1px");
1182 hres = IHTMLStyle_put_border(style, str);
1183 ok(hres == S_OK, "put_border failed: %08x\n", hres);
1184 SysFreeString(str);
1185
1186 V_VT(&v) = VT_EMPTY;
1187 hres = IHTMLStyle_get_left(style, &v);
1188 ok(hres == S_OK, "get_left failed: %08x\n", hres);
1189 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1190 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1191 VariantClear(&v);
1192
1193 l = 0xdeadbeef;
1194 hres = IHTMLStyle_get_pixelLeft(style, &l);
1195 ok(hres == S_OK, "get_pixelLeft failed: %08x\n", hres);
1196 ok(!l, "pixelLeft = %d\n", l);
1197
1198 /* Test posLeft */
1199 hres = IHTMLStyle_get_posLeft(style, NULL);
1200 ok(hres == E_POINTER, "get_posLeft failed: %08x\n", hres);
1201
1202 f = 1.0f;
1203 hres = IHTMLStyle_get_posLeft(style, &f);
1204 ok(hres == S_OK, "get_posLeft failed: %08x\n", hres);
1205 ok(f == 0.0, "expected 0.0 got %f\n", f);
1206
1207 hres = IHTMLStyle_put_posLeft(style, 4.9f);
1208 ok(hres == S_OK, "put_posLeft failed: %08x\n", hres);
1209
1210 hres = IHTMLStyle_get_posLeft(style, &f);
1211 ok(hres == S_OK, "get_posLeft failed: %08x\n", hres);
1212 ok(f == 4.0 ||
1213 f == 4.9f, /* IE8 */
1214 "expected 4.0 or 4.9 (IE8) got %f\n", f);
1215
1216 /* Ensure left is updated correctly. */
1217 V_VT(&v) = VT_EMPTY;
1218 hres = IHTMLStyle_get_left(style, &v);
1219 ok(hres == S_OK, "get_left failed: %08x\n", hres);
1220 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1221 ok(!strcmp_wa(V_BSTR(&v), "4px") ||
1222 !strcmp_wa(V_BSTR(&v), "4.9px"), /* IE8 */
1223 "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1224 VariantClear(&v);
1225
1226 /* Test left */
1227 V_VT(&v) = VT_BSTR;
1228 V_BSTR(&v) = a2bstr("3px");
1229 hres = IHTMLStyle_put_left(style, v);
1230 ok(hres == S_OK, "put_left failed: %08x\n", hres);
1231 VariantClear(&v);
1232
1233 hres = IHTMLStyle_get_posLeft(style, &f);
1234 ok(hres == S_OK, "get_posLeft failed: %08x\n", hres);
1235 ok(f == 3.0, "expected 3.0 got %f\n", f);
1236
1237 l = 0xdeadbeef;
1238 hres = IHTMLStyle_get_pixelLeft(style, &l);
1239 ok(hres == S_OK, "get_pixelLeft failed: %08x\n", hres);
1240 ok(l == 3, "pixelLeft = %d\n", l);
1241
1242 V_VT(&v) = VT_EMPTY;
1243 hres = IHTMLStyle_get_left(style, &v);
1244 ok(hres == S_OK, "get_left failed: %08x\n", hres);
1245 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1246 ok(!strcmp_wa(V_BSTR(&v), "3px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1247 VariantClear(&v);
1248
1249 V_VT(&v) = VT_BSTR;
1250 V_BSTR(&v) = a2bstr("4.99");
1251 hres = IHTMLStyle_put_left(style, v);
1252 ok(hres == S_OK, "put_left failed: %08x\n", hres);
1253 VariantClear(&v);
1254
1255 l = 0xdeadbeef;
1256 hres = IHTMLStyle_get_pixelLeft(style, &l);
1257 ok(hres == S_OK, "get_pixelLeft failed: %08x\n", hres);
1258 ok(l == 4, "pixelLeft = %d\n", l);
1259
1260 V_VT(&v) = VT_NULL;
1261 hres = IHTMLStyle_put_left(style, v);
1262 ok(hres == S_OK, "put_left failed: %08x\n", hres);
1263
1264 V_VT(&v) = VT_EMPTY;
1265 hres = IHTMLStyle_get_left(style, &v);
1266 ok(hres == S_OK, "get_left failed: %08x\n", hres);
1267 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1268 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1269 VariantClear(&v);
1270
1271 V_VT(&v) = VT_EMPTY;
1272 hres = IHTMLStyle_get_top(style, &v);
1273 ok(hres == S_OK, "get_top failed: %08x\n", hres);
1274 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1275 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1276 VariantClear(&v);
1277
1278 l = 0xdeadbeef;
1279 hres = IHTMLStyle_get_pixelLeft(style, &l);
1280 ok(hres == S_OK, "get_pixelLeft failed: %08x\n", hres);
1281 ok(!l, "pixelLeft = %d\n", l);
1282
1283 hres = IHTMLStyle_put_pixelLeft(style, 6);
1284 ok(hres == S_OK, "put_pixelLeft failed: %08x\n", hres);
1285
1286 l = 0xdeadbeef;
1287 hres = IHTMLStyle_get_pixelLeft(style, &l);
1288 ok(hres == S_OK, "get_pixelLeft failed: %08x\n", hres);
1289 ok(l == 6, "pixelLeft = %d\n", l);
1290
1291 hres = IHTMLStyle_get_pixelLeft(style, NULL);
1292 ok(hres == E_POINTER, "get_pixelLeft failed: %08x\n", hres);
1293
1294 V_VT(&v) = VT_EMPTY;
1295 hres = IHTMLStyle_get_left(style, &v);
1296 ok(hres == S_OK, "get_left failed: %08x\n", hres);
1297 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1298 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1299 VariantClear(&v);
1300
1301 /* Test posTop */
1302 hres = IHTMLStyle_get_posTop(style, NULL);
1303 ok(hres == E_POINTER, "get_posTop failed: %08x\n", hres);
1304
1305 f = 1.0f;
1306 hres = IHTMLStyle_get_posTop(style, &f);
1307 ok(hres == S_OK, "get_posTop failed: %08x\n", hres);
1308 ok(f == 0.0, "expected 0.0 got %f\n", f);
1309
1310 hres = IHTMLStyle_put_posTop(style, 4.9f);
1311 ok(hres == S_OK, "put_posTop failed: %08x\n", hres);
1312
1313 hres = IHTMLStyle_get_posTop(style, &f);
1314 ok(hres == S_OK, "get_posTop failed: %08x\n", hres);
1315 ok(f == 4.0 ||
1316 f == 4.9f, /* IE8 */
1317 "expected 4.0 or 4.9 (IE8) got %f\n", f);
1318
1319 hres = IHTMLStyle_put_pixelTop(style, 6);
1320 ok(hres == S_OK, "put_pixelTop failed: %08x\n", hres);
1321
1322 l = 0xdeadbeef;
1323 hres = IHTMLStyle_get_pixelTop(style, &l);
1324 ok(hres == S_OK, "get_pixelTop failed: %08x\n", hres);
1325 ok(l == 6, "pixelTop = %d\n", l);
1326
1327 hres = IHTMLStyle_get_pixelTop(style, NULL);
1328 ok(hres == E_POINTER, "get_pixelTop failed: %08x\n", hres);
1329
1330 V_VT(&v) = VT_BSTR;
1331 V_BSTR(&v) = a2bstr("3px");
1332 hres = IHTMLStyle_put_top(style, v);
1333 ok(hres == S_OK, "put_top failed: %08x\n", hres);
1334 VariantClear(&v);
1335
1336 V_VT(&v) = VT_EMPTY;
1337 hres = IHTMLStyle_get_top(style, &v);
1338 ok(hres == S_OK, "get_top failed: %08x\n", hres);
1339 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1340 ok(!strcmp_wa(V_BSTR(&v), "3px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1341 VariantClear(&v);
1342
1343 hres = IHTMLStyle_get_posTop(style, &f);
1344 ok(hres == S_OK, "get_posTop failed: %08x\n", hres);
1345 ok(f == 3.0, "expected 3.0 got %f\n", f);
1346
1347 l = 0xdeadbeef;
1348 hres = IHTMLStyle_get_pixelTop(style, &l);
1349 ok(hres == S_OK, "get_pixelTop failed: %08x\n", hres);
1350 ok(l == 3, "pixelTop = %d\n", l);
1351
1352 V_VT(&v) = VT_NULL;
1353 hres = IHTMLStyle_put_top(style, v);
1354 ok(hres == S_OK, "put_top failed: %08x\n", hres);
1355
1356 V_VT(&v) = VT_EMPTY;
1357 hres = IHTMLStyle_get_top(style, &v);
1358 ok(hres == S_OK, "get_top failed: %08x\n", hres);
1359 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1360 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1361 VariantClear(&v);
1362
1363 l = 0xdeadbeef;
1364 hres = IHTMLStyle_get_pixelTop(style, &l);
1365 ok(hres == S_OK, "get_pixelTop failed: %08x\n", hres);
1366 ok(!l, "pixelTop = %d\n", l);
1367
1368 /* Test posHeight */
1369 hres = IHTMLStyle_get_posHeight(style, NULL);
1370 ok(hres == E_POINTER, "get_posHeight failed: %08x\n", hres);
1371
1372 V_VT(&v) = VT_EMPTY;
1373 hres = IHTMLStyle_get_height(style, &v);
1374 ok(hres == S_OK, "get_height failed: %08x\n", hres);
1375 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1376 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1377 VariantClear(&v);
1378
1379 f = 1.0f;
1380 hres = IHTMLStyle_get_posHeight(style, &f);
1381 ok(hres == S_OK, "get_posHeight failed: %08x\n", hres);
1382 ok(f == 0.0, "expected 0.0 got %f\n", f);
1383
1384 l = 0xdeadbeef;
1385 hres = IHTMLStyle_get_pixelHeight(style, &l);
1386 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1387 ok(!l, "pixelHeight = %d\n", l);
1388
1389 hres = IHTMLStyle_put_posHeight(style, 4.9f);
1390 ok(hres == S_OK, "put_posHeight failed: %08x\n", hres);
1391
1392 hres = IHTMLStyle_get_posHeight(style, &f);
1393 ok(hres == S_OK, "get_posHeight failed: %08x\n", hres);
1394 ok(f == 4.0 ||
1395 f == 4.9f, /* IE8 */
1396 "expected 4.0 or 4.9 (IE8) got %f\n", f);
1397
1398 l = 0xdeadbeef;
1399 hres = IHTMLStyle_get_pixelHeight(style, &l);
1400 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1401 ok(l == 4 ||
1402 l == 5, /* IE8 */
1403 "pixelHeight = %d\n", l);
1404
1405 V_VT(&v) = VT_BSTR;
1406 V_BSTR(&v) = a2bstr("70px");
1407 hres = IHTMLStyle_put_height(style, v);
1408 ok(hres == S_OK, "put_height failed: %08x\n", hres);
1409 VariantClear(&v);
1410
1411 V_VT(&v) = VT_EMPTY;
1412 hres = IHTMLStyle_get_height(style, &v);
1413 ok(hres == S_OK, "get_height failed: %08x\n", hres);
1414 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1415 ok(!strcmp_wa(V_BSTR(&v), "70px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1416 VariantClear(&v);
1417
1418 l = 0xdeadbeef;
1419 hres = IHTMLStyle_get_pixelHeight(style, &l);
1420 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1421 ok(l == 70, "pixelHeight = %d\n", l);
1422
1423 V_VT(&v) = VT_BSTR;
1424 V_BSTR(&v) = NULL;
1425 hres = IHTMLStyle_put_height(style, v);
1426 ok(hres == S_OK, "put_height failed: %08x\n", hres);
1427 VariantClear(&v);
1428
1429 V_VT(&v) = VT_EMPTY;
1430 hres = IHTMLStyle_get_height(style, &v);
1431 ok(hres == S_OK, "get_height failed: %08x\n", hres);
1432 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1433 ok(!V_BSTR(&v), "V_BSTR(v) = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&v)));
1434 VariantClear(&v);
1435
1436 l = 0xdeadbeef;
1437 hres = IHTMLStyle_get_pixelHeight(style, &l);
1438 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1439 ok(!l, "pixelHeight = %d\n", l);
1440
1441 hres = IHTMLStyle_put_pixelHeight(style, 50);
1442 ok(hres == S_OK, "put_pixelHeight failed: %08x\n", hres);
1443
1444 l = 0xdeadbeef;
1445 hres = IHTMLStyle_get_pixelHeight(style, &l);
1446 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1447 ok(l == 50, "pixelHeight = %d\n", l);
1448
1449 hres = IHTMLStyle_get_pixelHeight(style, NULL);
1450 ok(hres == E_POINTER, "get_pixelHeight failed: %08x\n", hres);
1451
1452 V_VT(&v) = VT_I4;
1453 V_I4(&v) = 64;
1454 hres = IHTMLStyle_put_height(style, v);
1455 ok(hres == S_OK, "put_height failed: %08x\n", hres);
1456
1457 V_VT(&v) = VT_EMPTY;
1458 hres = IHTMLStyle_get_height(style, &v);
1459 ok(hres == S_OK, "get_height failed: %08x\n", hres);
1460 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1461 ok(!strcmp_wa(V_BSTR(&v), "64px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1462 VariantClear(&v);
1463
1464 hres = IHTMLStyle_get_posHeight(style, &f);
1465 ok(hres == S_OK, "get_posHeight failed: %08x\n", hres);
1466 ok(f == 64.0, "expected 64.0 got %f\n", f);
1467
1468 l = 0xdeadbeef;
1469 hres = IHTMLStyle_get_pixelHeight(style, &l);
1470 ok(hres == S_OK, "get_pixelHeight failed: %08x\n", hres);
1471 ok(l == 64, "pixelHeight = %d\n", l);
1472
1473 str = (void*)0xdeadbeef;
1474 hres = IHTMLStyle_get_cursor(style, &str);
1475 ok(hres == S_OK, "get_cursor failed: %08x\n", hres);
1476 ok(!str, "get_cursor != NULL\n");
1477 SysFreeString(str);
1478
1479 str = a2bstr("default");
1480 hres = IHTMLStyle_put_cursor(style, str);
1481 ok(hres == S_OK, "put_cursor failed: %08x\n", hres);
1482 SysFreeString(str);
1483
1484 str = NULL;
1485 hres = IHTMLStyle_get_cursor(style, &str);
1486 ok(hres == S_OK, "get_cursor failed: %08x\n", hres);
1487 ok(!strcmp_wa(str, "default"), "get_cursor returned %s\n", wine_dbgstr_w(str));
1488 SysFreeString(str);
1489
1490 V_VT(&v) = VT_EMPTY;
1491 hres = IHTMLStyle_get_verticalAlign(style, &v);
1492 ok(hres == S_OK, "get_vertivalAlign failed: %08x\n", hres);
1493 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1494 ok(!V_BSTR(&v), "V_BSTR(v) != NULL\n");
1495 VariantClear(&v);
1496
1497 V_VT(&v) = VT_BSTR;
1498 V_BSTR(&v) = a2bstr("middle");
1499 hres = IHTMLStyle_put_verticalAlign(style, v);
1500 ok(hres == S_OK, "put_vertivalAlign failed: %08x\n", hres);
1501 VariantClear(&v);
1502
1503 V_VT(&v) = VT_EMPTY;
1504 hres = IHTMLStyle_get_verticalAlign(style, &v);
1505 ok(hres == S_OK, "get_verticalAlign failed: %08x\n", hres);
1506 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1507 ok(!strcmp_wa(V_BSTR(&v), "middle"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1508 VariantClear(&v);
1509
1510 V_VT(&v) = VT_I4;
1511 V_I4(&v) = 100;
1512 hres = IHTMLStyle_put_verticalAlign(style, v);
1513 ok(hres == S_OK, "put_vertivalAlign failed: %08x\n", hres);
1514 VariantClear(&v);
1515
1516 V_VT(&v) = VT_EMPTY;
1517 hres = IHTMLStyle_get_verticalAlign(style, &v);
1518 ok(hres == S_OK, "get_verticalAlign failed: %08x\n", hres);
1519 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
1520 ok(!strcmp_wa(V_BSTR(&v), "100px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1521 VariantClear(&v);
1522
1523 str = (void*)0xdeadbeef;
1524 hres = IHTMLStyle_get_textAlign(style, &str);
1525 ok(hres == S_OK, "get_textAlign failed: %08x\n", hres);
1526 ok(!str, "textAlign != NULL\n");
1527
1528 str = a2bstr("center");
1529 hres = IHTMLStyle_put_textAlign(style, str);
1530 ok(hres == S_OK, "put_textAlign failed: %08x\n", hres);
1531 SysFreeString(str);
1532
1533 str = NULL;
1534 hres = IHTMLStyle_get_textAlign(style, &str);
1535 ok(hres == S_OK, "get_textAlign failed: %08x\n", hres);
1536 ok(!strcmp_wa(str, "center"), "textAlign = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1537 SysFreeString(str);
1538
1539 V_VT(&v) = VT_NULL;
1540 hres = IHTMLStyle_get_textIndent(style, &v);
1541 ok(hres == S_OK, "get_textIndent failed: %08x\n", hres);
1542 ok(V_VT(&v) == VT_BSTR, "V_VT(textIndent) = %d\n", V_VT(&v));
1543 ok(!V_BSTR(&v), "V_BSTR(textIndent) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1544
1545 V_VT(&v) = VT_I4;
1546 V_I4(&v) = 6;
1547 hres = IHTMLStyle_put_textIndent(style, v);
1548 ok(hres == S_OK, "put_textIndent failed: %08x\n", hres);
1549
1550 V_VT(&v) = VT_NULL;
1551 hres = IHTMLStyle_get_textIndent(style, &v);
1552 ok(hres == S_OK, "get_textIndent failed: %08x\n", hres);
1553 ok(V_VT(&v) == VT_BSTR, "V_VT(textIndent) = %d\n", V_VT(&v));
1554 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(textIndent) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1555
1556 str = (void*)0xdeadbeef;
1557 hres = IHTMLStyle_get_textTransform(style, &str);
1558 ok(hres == S_OK, "get_textTransform failed: %08x\n", hres);
1559 ok(!str, "textTransform != NULL\n");
1560
1561 str = a2bstr("lowercase");
1562 hres = IHTMLStyle_put_textTransform(style, str);
1563 ok(hres == S_OK, "put_textTransform failed: %08x\n", hres);
1564 SysFreeString(str);
1565
1566 str = NULL;
1567 hres = IHTMLStyle_get_textTransform(style, &str);
1568 ok(hres == S_OK, "get_textTransform failed: %08x\n", hres);
1569 ok(!strcmp_wa(str, "lowercase"), "textTransform = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1570 SysFreeString(str);
1571
1572 str = (void*)0xdeadbeef;
1573 hres = IHTMLStyle_get_filter(style, &str);
1574 ok(hres == S_OK, "get_filter failed: %08x\n", hres);
1575 ok(!str, "filter != NULL\n");
1576
1577 str = a2bstr("alpha(opacity=100)");
1578 hres = IHTMLStyle_put_filter(style, str);
1579 ok(hres == S_OK, "put_filter failed: %08x\n", hres);
1580 SysFreeString(str);
1581
1582 V_VT(&v) = VT_EMPTY;
1583 hres = IHTMLStyle_get_zIndex(style, &v);
1584 ok(hres == S_OK, "get_zIndex failed: %08x\n", hres);
1585 ok(V_VT(&v) == VT_I4, "V_VT(v)=%d\n", V_VT(&v));
1586 ok(!V_I4(&v), "V_I4(v) != 0\n");
1587 VariantClear(&v);
1588
1589 V_VT(&v) = VT_BSTR;
1590 V_BSTR(&v) = a2bstr("1");
1591 hres = IHTMLStyle_put_zIndex(style, v);
1592 ok(hres == S_OK, "put_zIndex failed: %08x\n", hres);
1593 VariantClear(&v);
1594
1595 V_VT(&v) = VT_EMPTY;
1596 hres = IHTMLStyle_get_zIndex(style, &v);
1597 ok(hres == S_OK, "get_zIndex failed: %08x\n", hres);
1598 ok(V_VT(&v) == VT_I4, "V_VT(v)=%d\n", V_VT(&v));
1599 ok(V_I4(&v) == 1, "V_I4(v) = %d\n", V_I4(&v));
1600 VariantClear(&v);
1601
1602 /* fontStyle */
1603 hres = IHTMLStyle_get_fontStyle(style, &sDefault);
1604 ok(hres == S_OK, "get_fontStyle failed: %08x\n", hres);
1605
1606 str = a2bstr("test");
1607 hres = IHTMLStyle_put_fontStyle(style, str);
1608 ok(hres == E_INVALIDARG, "put_fontStyle failed: %08x\n", hres);
1609 SysFreeString(str);
1610
1611 str = a2bstr("italic");
1612 hres = IHTMLStyle_put_fontStyle(style, str);
1613 ok(hres == S_OK, "put_fontStyle failed: %08x\n", hres);
1614 SysFreeString(str);
1615
1616 str = a2bstr("oblique");
1617 hres = IHTMLStyle_put_fontStyle(style, str);
1618 ok(hres == S_OK, "put_fontStyle failed: %08x\n", hres);
1619 SysFreeString(str);
1620
1621 str = a2bstr("normal");
1622 hres = IHTMLStyle_put_fontStyle(style, str);
1623 ok(hres == S_OK, "put_fontStyle failed: %08x\n", hres);
1624 SysFreeString(str);
1625
1626 hres = IHTMLStyle_put_fontStyle(style, sDefault);
1627 ok(hres == S_OK, "put_fontStyle failed: %08x\n", hres);
1628 SysFreeString(sDefault);
1629
1630 /* overflow */
1631 hres = IHTMLStyle_get_overflow(style, NULL);
1632 ok(hres == E_INVALIDARG, "get_overflow failed: %08x\n", hres);
1633
1634 hres = IHTMLStyle_get_overflow(style, &sOverflowDefault);
1635 ok(hres == S_OK, "get_overflow failed: %08x\n", hres);
1636
1637 str = a2bstr("test");
1638 hres = IHTMLStyle_put_overflow(style, str);
1639 ok(hres == E_INVALIDARG, "put_overflow failed: %08x\n", hres);
1640 SysFreeString(str);
1641
1642 str = a2bstr("visible");
1643 hres = IHTMLStyle_put_overflow(style, str);
1644 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1645 SysFreeString(str);
1646
1647 str = a2bstr("scroll");
1648 hres = IHTMLStyle_put_overflow(style, str);
1649 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1650 SysFreeString(str);
1651
1652 str = a2bstr("hidden");
1653 hres = IHTMLStyle_put_overflow(style, str);
1654 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1655 SysFreeString(str);
1656
1657 str = a2bstr("auto");
1658 hres = IHTMLStyle_put_overflow(style, str);
1659 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1660 SysFreeString(str);
1661
1662 hres = IHTMLStyle_get_overflow(style, &str);
1663 ok(hres == S_OK, "get_overflow failed: %08x\n", hres);
1664 ok(!strcmp_wa(str, "auto"), "str=%s\n", wine_dbgstr_w(str));
1665 SysFreeString(str);
1666
1667 str = a2bstr("");
1668 hres = IHTMLStyle_put_overflow(style, str);
1669 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1670 SysFreeString(str);
1671
1672 hres = IHTMLStyle_get_overflow(style, &str);
1673 ok(hres == S_OK, "get_overflow failed: %08x\n", hres);
1674 ok(!str, "str=%s\n", wine_dbgstr_w(str));
1675 SysFreeString(str);
1676
1677 /* restore overflow default */
1678 hres = IHTMLStyle_put_overflow(style, sOverflowDefault);
1679 ok(hres == S_OK, "put_overflow failed: %08x\n", hres);
1680 SysFreeString(sOverflowDefault);
1681
1682 /* Attribute Tests*/
1683 hres = IHTMLStyle_getAttribute(style, NULL, 1, &v);
1684 ok(hres == E_INVALIDARG, "getAttribute failed: %08x\n", hres);
1685
1686 str = a2bstr("position");
1687 hres = IHTMLStyle_getAttribute(style, str, 1, NULL);
1688 ok(hres == E_INVALIDARG, "getAttribute failed: %08x\n", hres);
1689
1690 hres = IHTMLStyle_getAttribute(style, str, 1, &v);
1691 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1692 ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v));
1693 VariantClear(&v);
1694
1695 hres = IHTMLStyle_setAttribute(style, NULL, v, 1);
1696 ok(hres == E_INVALIDARG, "setAttribute failed: %08x\n", hres);
1697
1698 V_VT(&v) = VT_BSTR;
1699 V_BSTR(&v) = a2bstr("absolute");
1700 hres = IHTMLStyle_setAttribute(style, str, v, 1);
1701 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
1702 VariantClear(&v);
1703
1704 hres = IHTMLStyle_getAttribute(style, str, 1, &v);
1705 ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
1706 ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v));
1707 ok(!strcmp_wa(V_BSTR(&v), "absolute"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1708 VariantClear(&v);
1709
1710 V_VT(&v) = VT_BSTR;
1711 V_BSTR(&v) = NULL;
1712 hres = IHTMLStyle_setAttribute(style, str, v, 1);
1713 ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
1714 VariantClear(&v);
1715
1716 SysFreeString(str);
1717
1718 str = a2bstr("borderLeftStyle");
1719 test_border_styles(style, str);
1720 SysFreeString(str);
1721
1722 str = a2bstr("borderbottomstyle");
1723 test_border_styles(style, str);
1724 SysFreeString(str);
1725
1726 str = a2bstr("borderrightstyle");
1727 test_border_styles(style, str);
1728 SysFreeString(str);
1729
1730 str = a2bstr("bordertopstyle");
1731 test_border_styles(style, str);
1732 SysFreeString(str);
1733
1734 hres = IHTMLStyle_get_borderStyle(style, &sDefault);
1735 ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres);
1736
1737 str = a2bstr("none dotted dashed solid");
1738 hres = IHTMLStyle_put_borderStyle(style, str);
1739 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1740 SysFreeString(str);
1741
1742 str = a2bstr("none dotted dashed solid");
1743 hres = IHTMLStyle_get_borderStyle(style, &str);
1744 ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres);
1745 ok(!strcmp_wa(str, "none dotted dashed solid"),
1746 "expected (none dotted dashed solid) = (%s)\n", wine_dbgstr_w(V_BSTR(&v)));
1747 SysFreeString(str);
1748
1749 str = a2bstr("double groove ridge inset");
1750 hres = IHTMLStyle_put_borderStyle(style, str);
1751 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1752 SysFreeString(str);
1753
1754 str = a2bstr("window-inset outset ridge inset");
1755 hres = IHTMLStyle_put_borderStyle(style, str);
1756 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1757 SysFreeString(str);
1758
1759 str = a2bstr("window-inset");
1760 hres = IHTMLStyle_put_borderStyle(style, str);
1761 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1762 SysFreeString(str);
1763
1764 str = a2bstr("none none none none none");
1765 hres = IHTMLStyle_put_borderStyle(style, str);
1766 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1767 SysFreeString(str);
1768
1769 str = a2bstr("invalid none none none");
1770 hres = IHTMLStyle_put_borderStyle(style, str);
1771 ok(hres == E_INVALIDARG, "put_borderStyle failed: %08x\n", hres);
1772 SysFreeString(str);
1773
1774 str = a2bstr("none invalid none none");
1775 hres = IHTMLStyle_put_borderStyle(style, str);
1776 ok(hres == E_INVALIDARG, "put_borderStyle failed: %08x\n", hres);
1777 SysFreeString(str);
1778
1779 hres = IHTMLStyle_put_borderStyle(style, sDefault);
1780 ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres);
1781 SysFreeString(sDefault);
1782
1783 /* backgoundColor */
1784 hres = IHTMLStyle_get_backgroundColor(style, &v);
1785 ok(hres == S_OK, "get_backgroundColor: %08x\n", hres);
1786 ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v));
1787 ok(!V_BSTR(&v), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1788 VariantClear(&v);
1789
1790 V_VT(&v) = VT_BSTR;
1791 V_BSTR(&v) = a2bstr("red");
1792 hres = IHTMLStyle_put_backgroundColor(style, v);
1793 ok(hres == S_OK, "put_backgroundColor failed: %08x\n", hres);
1794 VariantClear(&v);
1795
1796 hres = IHTMLStyle_get_backgroundColor(style, &v);
1797 ok(hres == S_OK, "get_backgroundColor: %08x\n", hres);
1798 ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v));
1799 ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1800 VariantClear(&v);
1801
1802 str = a2bstr("fixed");
1803 hres = IHTMLStyle_put_backgroundAttachment(style, str);
1804 ok(hres == S_OK, "put_backgroundAttachment failed: %08x\n", hres);
1805 SysFreeString(str);
1806
1807 hres = IHTMLStyle_get_backgroundAttachment(style, &str);
1808 ok(hres == S_OK, "get_backgroundAttachment failed: %08x\n", hres);
1809 ok(!strcmp_wa(str, "fixed"), "ret = %s\n", wine_dbgstr_w(str));
1810 SysFreeString(str);
1811
1812 /* padding */
1813 hres = IHTMLStyle_get_padding(style, &str);
1814 ok(hres == S_OK, "get_padding failed: %08x\n", hres);
1815 ok(!str, "padding = %s\n", wine_dbgstr_w(str));
1816 SysFreeString(str);
1817
1818 hres = IHTMLStyle_get_paddingTop(style, &v);
1819 ok(hres == S_OK, "get_paddingTop: %08x\n", hres);
1820 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1821 ok(!V_BSTR(&v), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1822
1823 V_VT(&v) = VT_I4;
1824 V_I4(&v) = 6;
1825 hres = IHTMLStyle_put_paddingTop(style, v);
1826 ok(hres == S_OK, "put_paddingTop failed: %08x\n", hres);
1827
1828 hres = IHTMLStyle_get_paddingTop(style, &v);
1829 ok(hres == S_OK, "get_paddingTop: %08x\n", hres);
1830 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1831 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1832 VariantClear(&v);
1833
1834 hres = IHTMLStyle_get_paddingRight(style, &v);
1835 ok(hres == S_OK, "get_paddingRight: %08x\n", hres);
1836 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1837 ok(!V_BSTR(&v), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1838
1839 V_VT(&v) = VT_I4;
1840 V_I4(&v) = 6;
1841 hres = IHTMLStyle_put_paddingRight(style, v);
1842 ok(hres == S_OK, "put_paddingRight failed: %08x\n", hres);
1843
1844 hres = IHTMLStyle_get_paddingRight(style, &v);
1845 ok(hres == S_OK, "get_paddingRight: %08x\n", hres);
1846 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1847 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1848 VariantClear(&v);
1849
1850 hres = IHTMLStyle_get_paddingBottom(style, &v);
1851 ok(hres == S_OK, "get_paddingBottom: %08x\n", hres);
1852 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1853 ok(!V_BSTR(&v), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1854
1855 V_VT(&v) = VT_I4;
1856 V_I4(&v) = 6;
1857 hres = IHTMLStyle_put_paddingBottom(style, v);
1858 ok(hres == S_OK, "put_paddingBottom failed: %08x\n", hres);
1859
1860 hres = IHTMLStyle_get_paddingBottom(style, &v);
1861 ok(hres == S_OK, "get_paddingBottom: %08x\n", hres);
1862 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
1863 ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1864 VariantClear(&v);
1865
1866 str = a2bstr("1");
1867 hres = IHTMLStyle_put_padding(style, str);
1868 ok(hres == S_OK, "put_padding failed: %08x\n", hres);
1869 SysFreeString(str);
1870
1871 hres = IHTMLStyle_get_padding(style, &str);
1872 ok(hres == S_OK, "get_padding failed: %08x\n", hres);
1873 ok(!strcmp_wa(str, "1px"), "padding = %s\n", wine_dbgstr_w(str));
1874 SysFreeString(str);
1875
1876 /* PaddingLeft */
1877 hres = IHTMLStyle_get_paddingLeft(style, &vDefault);
1878 ok(hres == S_OK, "get_paddingLeft: %08x\n", hres);
1879 ok(V_VT(&vDefault) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&vDefault));
1880 ok(!strcmp_wa(V_BSTR(&vDefault), "1px"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&vDefault)));
1881
1882 V_VT(&v) = VT_BSTR;
1883 V_BSTR(&v) = a2bstr("10");
1884 hres = IHTMLStyle_put_paddingLeft(style, v);
1885 ok(hres == S_OK, "put_paddingLeft: %08x\n", hres);
1886 VariantClear(&v);
1887
1888 hres = IHTMLStyle_get_paddingLeft(style, &v);
1889 ok(hres == S_OK, "get_paddingLeft: %08x\n", hres);
1890 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expecte 10 = %s\n", wine_dbgstr_w(V_BSTR(&v)));
1891 VariantClear(&v);
1892
1893 hres = IHTMLStyle_put_paddingLeft(style, vDefault);
1894 ok(hres == S_OK, "put_paddingLeft: %08x\n", hres);
1895
1896 /* BackgroundRepeat */
1897 hres = IHTMLStyle_get_backgroundRepeat(style, &sDefault);
1898 ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres);
1899
1900 str = a2bstr("invalid");
1901 hres = IHTMLStyle_put_backgroundRepeat(style, str);
1902 ok(hres == E_INVALIDARG, "put_backgroundRepeat failed: %08x\n", hres);
1903 SysFreeString(str);
1904
1905 str = a2bstr("repeat");
1906 hres = IHTMLStyle_put_backgroundRepeat(style, str);
1907 ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres);
1908 SysFreeString(str);
1909
1910 str = a2bstr("no-repeat");
1911 hres = IHTMLStyle_put_backgroundRepeat(style, str);
1912 ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres);
1913 SysFreeString(str);
1914
1915 str = a2bstr("repeat-x");
1916 hres = IHTMLStyle_put_backgroundRepeat(style, str);
1917 ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres);
1918 SysFreeString(str);
1919
1920 str = a2bstr("repeat-y");
1921 hres = IHTMLStyle_put_backgroundRepeat(style, str);
1922 ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres);
1923 SysFreeString(str);
1924
1925 hres = IHTMLStyle_get_backgroundRepeat(style, &str);
1926 ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres);
1927 ok(!strcmp_wa(str, "repeat-y"), "str=%s\n", wine_dbgstr_w(str));
1928 SysFreeString(str);
1929
1930 hres = IHTMLStyle_put_backgroundRepeat(style, sDefault);
1931 ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres);
1932 SysFreeString(sDefault);
1933
1934 /* BorderColor */
1935 hres = IHTMLStyle_get_borderColor(style, &sDefault);
1936 ok(hres == S_OK, "get_borderColor failed: %08x\n", hres);
1937
1938 str = a2bstr("red green red blue");
1939 hres = IHTMLStyle_put_borderColor(style, str);
1940 ok(hres == S_OK, "put_borderColor failed: %08x\n", hres);
1941 SysFreeString(str);
1942
1943 hres = IHTMLStyle_get_borderColor(style, &str);
1944 ok(hres == S_OK, "get_borderColor failed: %08x\n", hres);
1945 ok(!strcmp_wa(str, "red green red blue"), "str=%s\n", wine_dbgstr_w(str));
1946 SysFreeString(str);
1947
1948 hres = IHTMLStyle_put_borderColor(style, sDefault);
1949 ok(hres == S_OK, "put_borderColor failed: %08x\n", hres);
1950 SysFreeString(sDefault);
1951
1952 /* BorderRight */
1953 hres = IHTMLStyle_get_borderRight(style, &sDefault);
1954 ok(hres == S_OK, "get_borderRight failed: %08x\n", hres);
1955
1956 str = a2bstr("thick dotted red");
1957 hres = IHTMLStyle_put_borderRight(style, str);
1958 ok(hres == S_OK, "put_borderRight failed: %08x\n", hres);
1959 SysFreeString(str);
1960
1961 /* IHTMLStyle_get_borderRight appears to have a bug where
1962 it returns the first letter of the color. So we check
1963 each style individually.
1964 */
1965 V_BSTR(&v) = NULL;
1966 hres = IHTMLStyle_get_borderRightColor(style, &v);
1967 ok(hres == S_OK, "get_borderRightColor failed: %08x\n", hres);
1968 ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1969 VariantClear(&v);
1970
1971 V_BSTR(&v) = NULL;
1972 hres = IHTMLStyle_get_borderRightWidth(style, &v);
1973 ok(hres == S_OK, "get_borderRightWidth failed: %08x\n", hres);
1974 ok(!strcmp_wa(V_BSTR(&v), "thick"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
1975 VariantClear(&v);
1976
1977 hres = IHTMLStyle_get_borderRightStyle(style, &str);
1978 ok(hres == S_OK, "get_borderRightStyle failed: %08x\n", hres);
1979 ok(!strcmp_wa(str, "dotted"), "str=%s\n", wine_dbgstr_w(str));
1980 SysFreeString(str);
1981
1982 hres = IHTMLStyle_put_borderRight(style, sDefault);
1983 ok(hres == S_OK, "put_borderRight failed: %08x\n", hres);
1984 SysFreeString(sDefault);
1985
1986 /* BorderTop */
1987 hres = IHTMLStyle_get_borderTop(style, &sDefault);
1988 ok(hres == S_OK, "get_borderTop failed: %08x\n", hres);
1989
1990 str = a2bstr("thick dotted red");
1991 hres = IHTMLStyle_put_borderTop(style, str);
1992 ok(hres == S_OK, "put_borderTop failed: %08x\n", hres);
1993 SysFreeString(str);
1994
1995 /* IHTMLStyle_get_borderTop appears to have a bug where
1996 it returns the first letter of the color. So we check
1997 each style individually.
1998 */
1999 V_BSTR(&v) = NULL;
2000 hres = IHTMLStyle_get_borderTopColor(style, &v);
2001 ok(hres == S_OK, "get_borderTopColor failed: %08x\n", hres);
2002 ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2003 VariantClear(&v);
2004
2005 V_BSTR(&v) = NULL;
2006 hres = IHTMLStyle_get_borderTopWidth(style, &v);
2007 ok(hres == S_OK, "get_borderTopWidth failed: %08x\n", hres);
2008 ok(!strcmp_wa(V_BSTR(&v), "thick"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2009 VariantClear(&v);
2010
2011 hres = IHTMLStyle_get_borderTopStyle(style, &str);
2012 ok(hres == S_OK, "get_borderTopStyle failed: %08x\n", hres);
2013 ok(!strcmp_wa(str, "dotted"), "str=%s\n", wine_dbgstr_w(str));
2014 SysFreeString(str);
2015
2016 hres = IHTMLStyle_put_borderTop(style, sDefault);
2017 ok(hres == S_OK, "put_borderTop failed: %08x\n", hres);
2018 SysFreeString(sDefault);
2019
2020 /* BorderBottom */
2021 hres = IHTMLStyle_get_borderBottom(style, &sDefault);
2022 ok(hres == S_OK, "get_borderBottom failed: %08x\n", hres);
2023
2024 str = a2bstr("thick dotted red");
2025 hres = IHTMLStyle_put_borderBottom(style, str);
2026 ok(hres == S_OK, "put_borderBottom failed: %08x\n", hres);
2027 SysFreeString(str);
2028
2029 /* IHTMLStyle_get_borderBottom appears to have a bug where
2030 it returns the first letter of the color. So we check
2031 each style individually.
2032 */
2033 V_BSTR(&v) = NULL;
2034 hres = IHTMLStyle_get_borderBottomColor(style, &v);
2035 ok(hres == S_OK, "get_borderBottomColor failed: %08x\n", hres);
2036 ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2037 VariantClear(&v);
2038
2039 V_BSTR(&v) = NULL;
2040 hres = IHTMLStyle_get_borderBottomWidth(style, &v);
2041 ok(hres == S_OK, "get_borderBottomWidth failed: %08x\n", hres);
2042 ok(!strcmp_wa(V_BSTR(&v), "thick"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2043 VariantClear(&v);
2044
2045 hres = IHTMLStyle_get_borderBottomStyle(style, &str);
2046 ok(hres == S_OK, "get_borderBottomStyle failed: %08x\n", hres);
2047 ok(!strcmp_wa(str, "dotted"), "str=%s\n", wine_dbgstr_w(str));
2048 SysFreeString(str);
2049
2050 hres = IHTMLStyle_put_borderBottom(style, sDefault);
2051 ok(hres == S_OK, "put_borderBottom failed: %08x\n", hres);
2052 SysFreeString(sDefault);
2053
2054 /* BorderLeft */
2055 hres = IHTMLStyle_get_borderLeft(style, &sDefault);
2056 ok(hres == S_OK, "get_borderLeft failed: %08x\n", hres);
2057
2058 str = a2bstr("thick dotted red");
2059 hres = IHTMLStyle_put_borderLeft(style, str);
2060 ok(hres == S_OK, "put_borderLeft failed: %08x\n", hres);
2061 SysFreeString(str);
2062
2063 /* IHTMLStyle_get_borderLeft appears to have a bug where
2064 it returns the first letter of the color. So we check
2065 each style individually.
2066 */
2067 V_BSTR(&v) = NULL;
2068 hres = IHTMLStyle_get_borderLeftColor(style, &v);
2069 ok(hres == S_OK, "get_borderLeftColor failed: %08x\n", hres);
2070 ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2071 VariantClear(&v);
2072
2073 V_BSTR(&v) = NULL;
2074 hres = IHTMLStyle_get_borderLeftWidth(style, &v);
2075 ok(hres == S_OK, "get_borderLeftWidth failed: %08x\n", hres);
2076 ok(!strcmp_wa(V_BSTR(&v), "thick"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v)));
2077 VariantClear(&v);
2078
2079 hres = IHTMLStyle_get_borderLeftStyle(style, &str);
2080 ok(hres == S_OK, "get_borderLeftStyle failed: %08x\n", hres);
2081 ok(!strcmp_wa(str, "dotted"), "str=%s\n", wine_dbgstr_w(str));
2082 SysFreeString(str);
2083
2084 hres = IHTMLStyle_put_borderLeft(style, sDefault);
2085 ok(hres == S_OK, "put_borderLeft failed: %08x\n", hres);
2086 SysFreeString(sDefault);
2087
2088 /* backgroundPositionX */
2089 hres = IHTMLStyle_get_backgroundPositionX(style, &v);
2090 ok(hres == S_OK, "get_backgroundPositionX failed: %08x\n", hres);
2091 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2092 ok(!V_BSTR(&v), "backgroundPositionX = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2093 VariantClear(&v);
2094
2095 V_VT(&v) = VT_BSTR;
2096 V_BSTR(&v) = a2bstr("10px");
2097 hres = IHTMLStyle_put_backgroundPositionX(style, v);
2098 ok(hres == S_OK, "put_backgroundPositionX failed: %08x\n", hres);
2099 VariantClear(&v);
2100
2101 hres = IHTMLStyle_get_backgroundPositionX(style, &v);
2102 ok(hres == S_OK, "get_backgroundPositionX failed: %08x\n", hres);
2103 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2104 ok(!strcmp_wa(V_BSTR(&v), "10px"), "backgroundPositionX = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2105 VariantClear(&v);
2106
2107 /* backgroundPositionY */
2108 hres = IHTMLStyle_get_backgroundPositionY(style, &v);
2109 ok(hres == S_OK, "get_backgroundPositionY failed: %08x\n", hres);
2110 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2111 VariantClear(&v);
2112
2113 V_VT(&v) = VT_BSTR;
2114 V_BSTR(&v) = a2bstr("15px");
2115 hres = IHTMLStyle_put_backgroundPositionY(style, v);
2116 ok(hres == S_OK, "put_backgroundPositionY failed: %08x\n", hres);
2117 VariantClear(&v);
2118
2119 hres = IHTMLStyle_get_backgroundPositionY(style, &v);
2120 ok(hres == S_OK, "get_backgroundPositionY failed: %08x\n", hres);
2121 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2122 ok(!strcmp_wa(V_BSTR(&v), "15px"), "backgroundPositionY = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2123 VariantClear(&v);
2124
2125 /* backgroundPosition */
2126 str = NULL;
2127 hres = IHTMLStyle_get_backgroundPosition(style, &str);
2128 ok(hres == S_OK, "get_backgroundPosition failed: %08x\n", hres);
2129 ok(!strcmp_wa(str, "10px 15px"), "backgroundPosition = %s\n", wine_dbgstr_w(str));
2130 SysFreeString(str);
2131
2132 str = a2bstr("center 20%");
2133 hres = IHTMLStyle_put_backgroundPosition(style, str);
2134 ok(hres == S_OK, "put_backgroundPosition failed: %08x\n", hres);
2135 SysFreeString(str);
2136
2137 str = NULL;
2138 hres = IHTMLStyle_get_backgroundPosition(style, &str);
2139 ok(hres == S_OK, "get_backgroundPosition failed: %08x\n", hres);
2140 ok(!strcmp_wa(str, "center 20%"), "backgroundPosition = %s\n", wine_dbgstr_w(str));
2141 SysFreeString(str);
2142
2143 hres = IHTMLStyle_get_backgroundPositionX(style, &v);
2144 ok(hres == S_OK, "get_backgroundPositionX failed: %08x\n", hres);
2145 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2146 ok(!strcmp_wa(V_BSTR(&v), "center"), "backgroundPositionX = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2147 VariantClear(&v);
2148
2149 hres = IHTMLStyle_get_backgroundPositionY(style, &v);
2150 ok(hres == S_OK, "get_backgroundPositionY failed: %08x\n", hres);
2151 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2152 ok(!strcmp_wa(V_BSTR(&v), "20%"), "backgroundPositionY = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2153 VariantClear(&v);
2154
2155 /* borderTopWidth */
2156 hres = IHTMLStyle_get_borderTopWidth(style, &vDefault);
2157 ok(hres == S_OK, "get_borderTopWidth: %08x\n", hres);
2158
2159 V_VT(&v) = VT_BSTR;
2160 V_BSTR(&v) = a2bstr("10px");
2161 hres = IHTMLStyle_put_borderTopWidth(style, v);
2162 ok(hres == S_OK, "put_borderTopWidth: %08x\n", hres);
2163 VariantClear(&v);
2164
2165 hres = IHTMLStyle_get_borderTopWidth(style, &v);
2166 ok(hres == S_OK, "get_borderTopWidth: %08x\n", hres);
2167 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2168 VariantClear(&v);
2169
2170 hres = IHTMLStyle_put_borderTopWidth(style, vDefault);
2171 ok(hres == S_OK, "put_borderTopWidth: %08x\n", hres);
2172 VariantClear(&vDefault);
2173
2174 /* borderRightWidth */
2175 hres = IHTMLStyle_get_borderRightWidth(style, &vDefault);
2176 ok(hres == S_OK, "get_borderRightWidth: %08x\n", hres);
2177
2178 V_VT(&v) = VT_BSTR;
2179 V_BSTR(&v) = a2bstr("10");
2180 hres = IHTMLStyle_put_borderRightWidth(style, v);
2181 ok(hres == S_OK, "put_borderRightWidth: %08x\n", hres);
2182 VariantClear(&v);
2183
2184 hres = IHTMLStyle_get_borderRightWidth(style, &v);
2185 ok(hres == S_OK, "get_borderRightWidth: %08x\n", hres);
2186 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2187 VariantClear(&v);
2188
2189 hres = IHTMLStyle_put_borderRightWidth(style, vDefault);
2190 ok(hres == S_OK, "put_borderRightWidth: %08x\n", hres);
2191 VariantClear(&vDefault);
2192
2193 /* borderBottomWidth */
2194 hres = IHTMLStyle_get_borderBottomWidth(style, &vDefault);
2195 ok(hres == S_OK, "get_borderBottomWidth: %08x\n", hres);
2196
2197 V_VT(&v) = VT_BSTR;
2198 V_BSTR(&v) = a2bstr("10");
2199 hres = IHTMLStyle_put_borderBottomWidth(style, v);
2200 ok(hres == S_OK, "put_borderBottomWidth: %08x\n", hres);
2201 VariantClear(&v);
2202
2203 hres = IHTMLStyle_get_borderBottomWidth(style, &v);
2204 ok(hres == S_OK, "get_borderBottomWidth: %08x\n", hres);
2205 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2206 VariantClear(&v);
2207
2208 hres = IHTMLStyle_put_borderBottomWidth(style, vDefault);
2209 ok(hres == S_OK, "put_borderBottomWidth: %08x\n", hres);
2210 VariantClear(&vDefault);
2211
2212 /* borderLeftWidth */
2213 hres = IHTMLStyle_get_borderLeftWidth(style, &vDefault);
2214 ok(hres == S_OK, "get_borderLeftWidth: %08x\n", hres);
2215
2216 V_VT(&v) = VT_BSTR;
2217 V_BSTR(&v) = a2bstr("10");
2218 hres = IHTMLStyle_put_borderLeftWidth(style, v);
2219 ok(hres == S_OK, "put_borderLeftWidth: %08x\n", hres);
2220 VariantClear(&v);
2221
2222 hres = IHTMLStyle_get_borderLeftWidth(style, &v);
2223 ok(hres == S_OK, "get_borderLeftWidth: %08x\n", hres);
2224 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2225 VariantClear(&v);
2226
2227 hres = IHTMLStyle_put_borderLeftWidth(style, vDefault);
2228 ok(hres == S_OK, "put_borderLeftWidth: %08x\n", hres);
2229 VariantClear(&vDefault);
2230
2231 /* wordSpacing */
2232 hres = IHTMLStyle_get_wordSpacing(style, &vDefault);
2233 ok(hres == S_OK, "get_wordSpacing: %08x\n", hres);
2234
2235 V_VT(&v) = VT_BSTR;
2236 V_BSTR(&v) = a2bstr("10");
2237 hres = IHTMLStyle_put_wordSpacing(style, v);
2238 ok(hres == S_OK, "put_wordSpacing: %08x\n", hres);
2239 VariantClear(&v);
2240
2241 hres = IHTMLStyle_get_wordSpacing(style, &v);
2242 ok(hres == S_OK, "get_wordSpacing: %08x\n", hres);
2243 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2244 ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2245 VariantClear(&v);
2246
2247 hres = IHTMLStyle_put_wordSpacing(style, vDefault);
2248 ok(hres == S_OK, "put_wordSpacing: %08x\n", hres);
2249 VariantClear(&vDefault);
2250
2251 /* letterSpacing */
2252 hres = IHTMLStyle_get_letterSpacing(style, &vDefault);
2253 ok(hres == S_OK, "get_letterSpacing: %08x\n", hres);
2254
2255 V_VT(&v) = VT_BSTR;
2256 V_BSTR(&v) = a2bstr("11");
2257 hres = IHTMLStyle_put_letterSpacing(style, v);
2258 ok(hres == S_OK, "put_letterSpacing: %08x\n", hres);
2259 VariantClear(&v);
2260
2261 hres = IHTMLStyle_get_letterSpacing(style, &v);
2262 ok(hres == S_OK, "get_letterSpacing: %08x\n", hres);
2263 ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v));
2264 ok(!strcmp_wa(V_BSTR(&v), "11px"), "expected 10px = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2265 VariantClear(&v);
2266
2267 hres = IHTMLStyle_put_letterSpacing(style, vDefault);
2268 ok(hres == S_OK, "put_letterSpacing: %08x\n", hres);
2269 VariantClear(&vDefault);
2270
2271 /* borderTopColor */
2272 hres = IHTMLStyle_get_borderTopColor(style, &vDefault);
2273 ok(hres == S_OK, "get_borderTopColor: %08x\n", hres);
2274
2275 V_VT(&v) = VT_BSTR;
2276 V_BSTR(&v) = a2bstr("red");
2277 hres = IHTMLStyle_put_borderTopColor(style, v);
2278 ok(hres == S_OK, "put_borderTopColor: %08x\n", hres);
2279 VariantClear(&v);
2280
2281 hres = IHTMLStyle_get_borderTopColor(style, &v);
2282 ok(hres == S_OK, "get_borderTopColor: %08x\n", hres);
2283 ok(!strcmp_wa(V_BSTR(&v), "red"), "expecte red = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2284 VariantClear(&v);
2285
2286 hres = IHTMLStyle_put_borderTopColor(style, vDefault);
2287 ok(hres == S_OK, "put_borderTopColor: %08x\n", hres);
2288
2289 /* borderRightColor */
2290 hres = IHTMLStyle_get_borderRightColor(style, &vDefault);
2291 ok(hres == S_OK, "get_borderRightColor: %08x\n", hres);
2292
2293 V_VT(&v) = VT_BSTR;
2294 V_BSTR(&v) = a2bstr("blue");
2295 hres = IHTMLStyle_put_borderRightColor(style, v);
2296 ok(hres == S_OK, "put_borderRightColor: %08x\n", hres);
2297 VariantClear(&v);
2298
2299 hres = IHTMLStyle_get_borderRightColor(style, &v);
2300 ok(hres == S_OK, "get_borderRightColor: %08x\n", hres);
2301 ok(!strcmp_wa(V_BSTR(&v), "blue"), "expected blue = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2302 VariantClear(&v);
2303
2304 hres = IHTMLStyle_put_borderRightColor(style, vDefault);
2305 ok(hres == S_OK, "putborderRightColorr: %08x\n", hres);
2306
2307 /* borderBottomColor */
2308 hres = IHTMLStyle_get_borderBottomColor(style, &vDefault);
2309 ok(hres == S_OK, "get_borderBottomColor: %08x\n", hres);
2310
2311 V_VT(&v) = VT_BSTR;
2312 V_BSTR(&v) = a2bstr("cyan");
2313 hres = IHTMLStyle_put_borderBottomColor(style, v);
2314 ok(hres == S_OK, "put_borderBottomColor: %08x\n", hres);
2315 VariantClear(&v);
2316
2317 hres = IHTMLStyle_get_borderBottomColor(style, &v);
2318 ok(hres == S_OK, "get_borderBottomColor: %08x\n", hres);
2319 ok(!strcmp_wa(V_BSTR(&v), "cyan"), "expected cyan = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2320 VariantClear(&v);
2321
2322 hres = IHTMLStyle_put_borderBottomColor(style, vDefault);
2323 ok(hres == S_OK, "put_borderBottomColor: %08x\n", hres);
2324
2325 /* borderLeftColor */
2326 hres = IHTMLStyle_get_borderLeftColor(style, &vDefault);
2327 ok(hres == S_OK, "get_borderLeftColor: %08x\n", hres);
2328
2329 V_VT(&v) = VT_BSTR;
2330 V_BSTR(&v) = a2bstr("cyan");
2331 hres = IHTMLStyle_put_borderLeftColor(style, v);
2332 ok(hres == S_OK, "put_borderLeftColor: %08x\n", hres);
2333 VariantClear(&v);
2334
2335 hres = IHTMLStyle_get_borderLeftColor(style, &v);
2336 ok(hres == S_OK, "get_borderLeftColor: %08x\n", hres);
2337 ok(!strcmp_wa(V_BSTR(&v), "cyan"), "expected cyan = %s\n", wine_dbgstr_w(V_BSTR(&v)));
2338 VariantClear(&v);
2339
2340 hres = IHTMLStyle_put_borderLeftColor(style, vDefault);
2341 ok(hres == S_OK, "put_borderLeftColor: %08x\n", hres);
2342
2343 /* clip */
2344 hres = IHTMLStyle_get_clip(style, &str);
2345 ok(hres == S_OK, "get_clip failed: %08x\n", hres);
2346 ok(!str, "clip = %s\n", wine_dbgstr_w(str));
2347
2348 str = a2bstr("rect(0px 1px 500px 505px)");
2349 hres = IHTMLStyle_put_clip(style, str);
2350 ok(hres == S_OK, "put_clip failed: %08x\n", hres);
2351 SysFreeString(str);
2352
2353 hres = IHTMLStyle_get_clip(style, &str);
2354 ok(hres == S_OK, "get_clip failed: %08x\n", hres);
2355 ok(!strcmp_wa(str, "rect(0px 1px 500px 505px)"), "clip = %s\n", wine_dbgstr_w(str));
2356 SysFreeString(str);
2357
2358 /* clear */
2359 hres = IHTMLStyle_get_clear(style, &str);
2360 ok(hres == S_OK, "get_clear failed: %08x\n", hres);
2361 ok(!str, "clear = %s\n", wine_dbgstr_w(str));
2362
2363 str = a2bstr("both");
2364 hres = IHTMLStyle_put_clear(style, str);
2365 ok(hres == S_OK, "put_clear failed: %08x\n", hres);
2366 SysFreeString(str);
2367
2368 hres = IHTMLStyle_get_clear(style, &str);
2369 ok(hres == S_OK, "get_clear failed: %08x\n", hres);
2370 ok(!strcmp_wa(str, "both"), "clear = %s\n", wine_dbgstr_w(str));
2371 SysFreeString(str);
2372
2373 /* pageBreakAfter */
2374 hres = IHTMLStyle_get_pageBreakAfter(style, &str);
2375 ok(hres == S_OK, "get_pageBreakAfter failed: %08x\n", hres);
2376 ok(!str, "pageBreakAfter = %s\n", wine_dbgstr_w(str));
2377
2378 str = a2bstr("always");
2379 hres = IHTMLStyle_put_pageBreakAfter(style, str);
2380 ok(hres == S_OK, "put_pageBreakAfter failed: %08x\n", hres);
2381 SysFreeString(str);
2382
2383 hres = IHTMLStyle_get_pageBreakAfter(style, &str);
2384 ok(hres == S_OK, "get_pageBreakAfter failed: %08x\n", hres);
2385 ok(!strcmp_wa(str, "always"), "pageBreakAfter = %s\n", wine_dbgstr_w(str));
2386 SysFreeString(str);
2387
2388 /* pageBreakBefore */
2389 hres = IHTMLStyle_get_pageBreakBefore(style, &str);
2390 ok(hres == S_OK, "get_pageBreakBefore failed: %08x\n", hres);
2391 ok(!str, "pageBreakBefore = %s\n", wine_dbgstr_w(str));
2392
2393 str = a2bstr("always");
2394 hres = IHTMLStyle_put_pageBreakBefore(style, str);
2395 ok(hres == S_OK, "put_pageBreakBefore failed: %08x\n", hres);
2396 SysFreeString(str);
2397
2398 hres = IHTMLStyle_get_pageBreakBefore(style, &str);
2399 ok(hres == S_OK, "get_pageBreakBefore failed: %08x\n", hres);
2400 ok(!strcmp_wa(str, "always"), "pageBreakBefore = %s\n", wine_dbgstr_w(str));
2401 SysFreeString(str);
2402
2403 test_style_remove_attribute(style, "pageBreakBefore", VARIANT_TRUE);
2404 test_style_remove_attribute(style, "pageBreakBefore", VARIANT_FALSE);
2405
2406 hres = IHTMLStyle_get_pageBreakBefore(style, &str);
2407 ok(hres == S_OK, "get_pageBreakBefore failed: %08x\n", hres);
2408 ok(!str, "pageBreakBefore = %s\n", wine_dbgstr_w(str));
2409
2410 str = (void*)0xdeadbeef;
2411 hres = IHTMLStyle_get_whiteSpace(style, &str);
2412 ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres);
2413 ok(!str, "whiteSpace = %s\n", wine_dbgstr_w(str));
2414
2415 str = a2bstr("nowrap");
2416 hres = IHTMLStyle_put_whiteSpace(style, str);
2417 SysFreeString(str);
2418 ok(hres == S_OK, "put_whiteSpace failed: %08x\n", hres);
2419
2420 str = NULL;
2421 hres = IHTMLStyle_get_whiteSpace(style, &str);
2422 ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres);
2423 ok(!strcmp_wa(str, "nowrap"), "whiteSpace = %s\n", wine_dbgstr_w(str));
2424 SysFreeString(str);
2425
2426 str = a2bstr("normal");
2427 hres = IHTMLStyle_put_whiteSpace(style, str);
2428 SysFreeString(str);
2429 ok(hres == S_OK, "put_whiteSpace failed: %08x\n", hres);
2430
2431 str = NULL;
2432 hres = IHTMLStyle_get_whiteSpace(style, &str);
2433 ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres);
2434 ok(!strcmp_wa(str, "normal"), "whiteSpace = %s\n", wine_dbgstr_w(str));
2435 SysFreeString(str);
2436
2437 /* listStyleType */
2438 hres = IHTMLStyle_get_listStyleType(style, &str);
2439 ok(hres == S_OK, "get_listStyleType failed: %08x\n", hres);
2440 ok(!str, "listStyleType = %s\n", wine_dbgstr_w(str));
2441
2442 str = a2bstr("square");
2443 hres = IHTMLStyle_put_listStyleType(style, str);
2444 ok(hres == S_OK, "put_listStyleType failed: %08x\n", hres);
2445 SysFreeString(str);
2446
2447 str = NULL;
2448 hres = IHTMLStyle_get_listStyleType(style, &str);
2449 ok(hres == S_OK, "get_listStyleType failed: %08x\n", hres);
2450 ok(!strcmp_wa(str, "square"), "listStyleType = %s\n", wine_dbgstr_w(str));
2451
2452 str = a2bstr("inside");
2453 hres = IHTMLStyle_put_listStylePosition(style, str);
2454 ok(hres == S_OK, "put_listStylePosition failed: %08x\n", hres);
2455 SysFreeString(str);
2456
2457 hres = IHTMLStyle_get_listStylePosition(style, &str);
2458 ok(hres == S_OK, "get_listStylePosition failed: %08x\n", hres);
2459 ok(!strcmp_wa(str, "inside"), "listStyleType = %s\n", wine_dbgstr_w(str));
2460 SysFreeString(str);
2461
2462 str = a2bstr("decimal-leading-zero none inside");
2463 hres = IHTMLStyle_put_listStyle(style, str);
2464 ok(hres == S_OK || broken(hres == E_INVALIDARG), /* win 2000 */
2465 "put_listStyle(%s) failed: %08x\n", wine_dbgstr_w(str), hres);
2466 SysFreeString(str);
2467
2468 if (hres != E_INVALIDARG) {
2469 hres = IHTMLStyle_get_listStyle(style, &str);
2470 ok(hres == S_OK, "get_listStyle failed: %08x\n", hres);
2471 ok(strstr_wa(str, "decimal-leading-zero") &&
2472 strstr_wa(str, "none") != NULL &&
2473 strstr_wa(str, "inside") != NULL,
2474 "listStyle = %s\n", wine_dbgstr_w(str));
2475 SysFreeString(str);
2476 } else {
2477 win_skip("IHTMLStyle_put_listStyle already failed\n");
2478 }
2479
2480 str = (void*)0xdeadbeef;
2481 hres = IHTMLStyle_get_styleFloat(style, &str);
2482 ok(hres == S_OK, "get_styleFloat failed: %08x\n", hres);
2483 ok(!str, "styleFloat = %s\n", wine_dbgstr_w(str));
2484
2485 str = a2bstr("left");
2486 hres = IHTMLStyle_put_styleFloat(style, str);
2487 ok(hres == S_OK, "put_styleFloat failed: %08x\n", hres);
2488 SysFreeString(str);
2489
2490 str = NULL;
2491 hres = IHTMLStyle_get_styleFloat(style, &str);
2492 ok(hres == S_OK, "get_styleFloat failed: %08x\n", hres);
2493 ok(!strcmp_wa(str, "left"), "styleFloat = %s\n", wine_dbgstr_w(str));
2494
2495 hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle2, (void**)&style2);
2496 ok(hres == S_OK, "Could not get IHTMLStyle2 iface: %08x\n", hres);
2497 if(SUCCEEDED(hres)) {
2498 test_style2(style2);
2499 IHTMLStyle2_Release(style2);
2500 }
2501
2502 hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle3, (void**)&style3);
2503 ok(hres == S_OK, "Could not get IHTMLStyle3 iface: %08x\n", hres);
2504 if(SUCCEEDED(hres)) {
2505 test_style3(style3);
2506 IHTMLStyle3_Release(style3);
2507 }
2508
2509 hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle4, (void**)&style4);
2510 ok(hres == S_OK, "Could not get IHTMLStyle4 iface: %08x\n", hres);
2511 if(SUCCEEDED(hres)) {
2512 test_style4(style4);
2513 IHTMLStyle4_Release(style4);
2514 }
2515
2516 hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle5, (void**)&style5);
2517 if(SUCCEEDED(hres)) {
2518 test_style5(style5);
2519 IHTMLStyle5_Release(style5);
2520 }else {
2521 win_skip("IHTMLStyle5 not available\n");
2522 }
2523
2524 hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle6, (void**)&style6);
2525 if(SUCCEEDED(hres)) {
2526 test_style6(style6);
2527 IHTMLStyle6_Release(style6);
2528 }else {
2529 win_skip("IHTMLStyle6 not available\n");
2530 }
2531 }
2532
2533 #define test_style_filter(a,b) _test_style_filter(__LINE__,a,b)
_test_style_filter(unsigned line,IHTMLStyle * style,const char * exval)2534 static void _test_style_filter(unsigned line, IHTMLStyle *style, const char *exval)
2535 {
2536 BSTR str;
2537 HRESULT hres;
2538
2539 str = (void*)0xdeadbeef;
2540 hres = IHTMLStyle_get_filter(style, &str);
2541 ok_(__FILE__,line)(hres == S_OK, "get_filter failed: %08x\n", hres);
2542 if(exval)
2543 ok_(__FILE__,line)(str && !strcmp_wa(str, exval), "filter = %s, expected %s\n", wine_dbgstr_w(str), exval);
2544 else
2545 ok_(__FILE__,line)(!str, "str = %s, expected NULL\n", wine_dbgstr_w(str));
2546
2547 SysFreeString(str);
2548 }
2549
2550 #define test_current_style_filter(a,b) _test_current_style_filter(__LINE__,a,b)
_test_current_style_filter(unsigned line,IHTMLCurrentStyle2 * style,const char * exval)2551 static void _test_current_style_filter(unsigned line, IHTMLCurrentStyle2 *style, const char *exval)
2552 {
2553 BSTR str;
2554 HRESULT hres;
2555
2556 str = (void*)0xdeadbeef;
2557 hres = IHTMLCurrentStyle2_get_filter(style, &str);
2558 ok_(__FILE__,line)(hres == S_OK, "get_filter failed: %08x\n", hres);
2559 if(exval)
2560 ok_(__FILE__,line)(str && !strcmp_wa(str, exval), "filter = %s, expected %s\n", wine_dbgstr_w(str), exval);
2561 else
2562 ok_(__FILE__,line)(!str, "str = %s, expected NULL\n", wine_dbgstr_w(str));
2563
2564 SysFreeString(str);
2565 }
2566
2567 #define set_style_filter(a,b) _set_style_filter(__LINE__,a,b)
_set_style_filter(unsigned line,IHTMLStyle * style,const char * val)2568 static void _set_style_filter(unsigned line, IHTMLStyle *style, const char *val)
2569 {
2570 BSTR str = a2bstr(val);
2571 HRESULT hres;
2572
2573 hres = IHTMLStyle_put_filter(style, str);
2574 ok_(__FILE__,line)(hres == S_OK, "put_filter failed: %08x\n", hres);
2575 SysFreeString(str);
2576
2577 _test_style_filter(line, style, val);
2578 }
2579
test_style_filters(IHTMLElement * elem)2580 static void test_style_filters(IHTMLElement *elem)
2581 {
2582 IHTMLElement2 *elem2 = get_elem2_iface((IUnknown*)elem);
2583 IHTMLCurrentStyle2 *current_style2;
2584 IHTMLCurrentStyle *current_style;
2585 IHTMLStyle *style;
2586 HRESULT hres;
2587
2588 hres = IHTMLElement_get_style(elem, &style);
2589 ok(hres == S_OK, "get_style failed: %08x\n", hres);
2590
2591 hres = IHTMLElement2_get_currentStyle(elem2, ¤t_style);
2592 ok(hres == S_OK, "get_style failed: %08x\n", hres);
2593
2594 current_style2 = get_current_style2_iface((IUnknown*)current_style);
2595
2596 test_style_filter(style, NULL);
2597 test_current_style_filter(current_style2, NULL);
2598 set_style_filter(style, "alpha(opacity=50.0040)");
2599 test_current_style_filter(current_style2, "alpha(opacity=50.0040)");
2600 set_style_filter(style, "alpha(opacity=100)");
2601
2602 IHTMLStyle_Release(style);
2603
2604 hres = IHTMLElement_get_style(elem, &style);
2605 ok(hres == S_OK, "get_style failed: %08x\n", hres);
2606
2607 test_style_filter(style, "alpha(opacity=100)");
2608 set_style_filter(style, "xxx(a,b,c) alpha(opacity=100)");
2609 set_style_filter(style, NULL);
2610 set_style_filter(style, "alpha(opacity=100)");
2611 test_style_remove_attribute(style, "filter", VARIANT_TRUE);
2612 test_style_remove_attribute(style, "filter", VARIANT_FALSE);
2613 test_style_filter(style, NULL);
2614
2615
2616 IHTMLCurrentStyle2_Release(current_style2);
2617 IHTMLStyle_Release(style);
2618 IHTMLElement2_Release(elem2);
2619 }
2620
test_current_style(IHTMLCurrentStyle * current_style)2621 static void test_current_style(IHTMLCurrentStyle *current_style)
2622 {
2623 IHTMLCurrentStyle2 *current_style2;
2624 IHTMLCurrentStyle3 *current_style3;
2625 VARIANT_BOOL b;
2626 BSTR str;
2627 HRESULT hres;
2628 VARIANT v;
2629
2630 hres = IHTMLCurrentStyle_get_display(current_style, &str);
2631 ok(hres == S_OK, "get_display failed: %08x\n", hres);
2632 ok(!strcmp_wa(str, "block"), "get_display returned %s\n", wine_dbgstr_w(str));
2633 SysFreeString(str);
2634
2635 hres = IHTMLCurrentStyle_get_position(current_style, &str);
2636 ok(hres == S_OK, "get_position failed: %08x\n", hres);
2637 ok(!strcmp_wa(str, "absolute"), "get_position returned %s\n", wine_dbgstr_w(str));
2638 SysFreeString(str);
2639
2640 hres = IHTMLCurrentStyle_get_fontFamily(current_style, &str);
2641 ok(hres == S_OK, "get_fontFamily failed: %08x\n", hres);
2642 SysFreeString(str);
2643
2644 hres = IHTMLCurrentStyle_get_fontStyle(current_style, &str);
2645 ok(hres == S_OK, "get_fontStyle failed: %08x\n", hres);
2646 ok(!strcmp_wa(str, "normal"), "get_fontStyle returned %s\n", wine_dbgstr_w(str));
2647 SysFreeString(str);
2648
2649 hres = IHTMLCurrentStyle_get_backgroundImage(current_style, &str);
2650 ok(hres == S_OK, "get_backgroundImage failed: %08x\n", hres);
2651 ok(!strcmp_wa(str, "none"), "get_backgroundImage returned %s\n", wine_dbgstr_w(str));
2652 SysFreeString(str);
2653
2654 hres = IHTMLCurrentStyle_get_fontVariant(current_style, &str);
2655 ok(hres == S_OK, "get_fontVariant failed: %08x\n", hres);
2656 ok(!strcmp_wa(str, "normal"), "get_fontVariant returned %s\n", wine_dbgstr_w(str));
2657 SysFreeString(str);
2658
2659 hres = IHTMLCurrentStyle_get_borderTopStyle(current_style, &str);
2660 ok(hres == S_OK, "get_borderTopStyle failed: %08x\n", hres);
2661 ok(!strcmp_wa(str, "none"), "get_borderTopStyle returned %s\n", wine_dbgstr_w(str));
2662 SysFreeString(str);
2663
2664 hres = IHTMLCurrentStyle_get_borderRightStyle(current_style, &str);
2665 ok(hres == S_OK, "get_borderRightStyle failed: %08x\n", hres);
2666 ok(!strcmp_wa(str, "none"), "get_borderRightStyle returned %s\n", wine_dbgstr_w(str));
2667 SysFreeString(str);
2668
2669 hres = IHTMLCurrentStyle_get_borderBottomStyle(current_style, &str);
2670 ok(hres == S_OK, "get_borderBottomStyle failed: %08x\n", hres);
2671 ok(!strcmp_wa(str, "none"), "get_borderBottomStyle returned %s\n", wine_dbgstr_w(str));
2672 SysFreeString(str);
2673
2674 hres = IHTMLCurrentStyle_get_borderLeftStyle(current_style, &str);
2675 ok(hres == S_OK, "get_borderLeftStyle failed: %08x\n", hres);
2676 ok(!strcmp_wa(str, "none"), "get_borderLeftStyle returned %s\n", wine_dbgstr_w(str));
2677 SysFreeString(str);
2678
2679 hres = IHTMLCurrentStyle_get_textAlign(current_style, &str);
2680 ok(hres == S_OK, "get_textAlign failed: %08x\n", hres);
2681 ok(!strcmp_wa(str, "center"), "get_textAlign returned %s\n", wine_dbgstr_w(str));
2682 SysFreeString(str);
2683
2684 hres = IHTMLCurrentStyle_get_textDecoration(current_style, &str);
2685 ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
2686 ok(!strcmp_wa(str, "none"), "get_textDecoration returned %s\n", wine_dbgstr_w(str));
2687 SysFreeString(str);
2688
2689 hres = IHTMLCurrentStyle_get_cursor(current_style, &str);
2690 ok(hres == S_OK, "get_cursor failed: %08x\n", hres);
2691 ok(!strcmp_wa(str, "default"), "get_cursor returned %s\n", wine_dbgstr_w(str));
2692 SysFreeString(str);
2693
2694 hres = IHTMLCurrentStyle_get_backgroundRepeat(current_style, &str);
2695 ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres);
2696 ok(!strcmp_wa(str, "repeat"), "get_backgroundRepeat returned %s\n", wine_dbgstr_w(str));
2697 SysFreeString(str);
2698
2699 hres = IHTMLCurrentStyle_get_borderColor(current_style, &str);
2700 ok(hres == S_OK, "get_borderColor failed: %08x\n", hres);
2701 SysFreeString(str);
2702
2703 hres = IHTMLCurrentStyle_get_borderStyle(current_style, &str);
2704 ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres);
2705 SysFreeString(str);
2706
2707 hres = IHTMLCurrentStyle_get_visibility(current_style, &str);
2708 ok(hres == S_OK, "get_visibility failed: %08x\n", hres);
2709 SysFreeString(str);
2710
2711 hres = IHTMLCurrentStyle_get_overflow(current_style, &str);
2712 ok(hres == S_OK, "get_overflow failed: %08x\n", hres);
2713 SysFreeString(str);
2714
2715 hres = IHTMLCurrentStyle_get_borderWidth(current_style, &str);
2716 ok(hres == S_OK, "get_borderWidth failed: %08x\n", hres);
2717 SysFreeString(str);
2718
2719 hres = IHTMLCurrentStyle_get_margin(current_style, &str);
2720 ok(hres == S_OK, "get_margin failed: %08x\n", hres);
2721 SysFreeString(str);
2722
2723 hres = IHTMLCurrentStyle_get_padding(current_style, &str);
2724 ok(hres == S_OK, "get_padding failed: %08x\n", hres);
2725 SysFreeString(str);
2726
2727 hres = IHTMLCurrentStyle_get_fontWeight(current_style, &v);
2728 ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres);
2729 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
2730 ok( V_I4(&v) == 400, "expect 400 got (%d)\n", V_I4(&v));
2731 VariantClear(&v);
2732
2733 hres = IHTMLCurrentStyle_get_fontSize(current_style, &v);
2734 ok(hres == S_OK, "get_fontSize failed: %08x\n", hres);
2735 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2736 VariantClear(&v);
2737
2738 hres = IHTMLCurrentStyle_get_left(current_style, &v);
2739 ok(hres == S_OK, "get_left failed: %08x\n", hres);
2740 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2741 VariantClear(&v);
2742
2743 hres = IHTMLCurrentStyle_get_top(current_style, &v);
2744 ok(hres == S_OK, "get_top failed: %08x\n", hres);
2745 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2746 VariantClear(&v);
2747
2748 hres = IHTMLCurrentStyle_get_width(current_style, &v);
2749 ok(hres == S_OK, "get_width failed: %08x\n", hres);
2750 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2751 VariantClear(&v);
2752
2753 hres = IHTMLCurrentStyle_get_height(current_style, &v);
2754 ok(hres == S_OK, "get_height failed: %08x\n", hres);
2755 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2756 VariantClear(&v);
2757
2758 hres = IHTMLCurrentStyle_get_paddingLeft(current_style, &v);
2759 ok(hres == S_OK, "get_paddingLeft failed: %08x\n", hres);
2760 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2761 VariantClear(&v);
2762
2763 hres = IHTMLCurrentStyle_get_zIndex(current_style, &v);
2764 ok(hres == S_OK, "get_zIndex failed: %08x\n", hres);
2765 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
2766 ok( V_I4(&v) == 1, "expect 1 got (%d)\n", V_I4(&v));
2767 VariantClear(&v);
2768
2769 hres = IHTMLCurrentStyle_get_verticalAlign(current_style, &v);
2770 ok(hres == S_OK, "get_verticalAlign failed: %08x\n", hres);
2771 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2772 ok(!strcmp_wa(V_BSTR(&v), "100px"), "get_verticalAlign returned %s\n", wine_dbgstr_w(V_BSTR(&v)));
2773 VariantClear(&v);
2774
2775 hres = IHTMLCurrentStyle_get_marginRight(current_style, &v);
2776 ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
2777 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2778 VariantClear(&v);
2779
2780 hres = IHTMLCurrentStyle_get_marginLeft(current_style, &v);
2781 ok(hres == S_OK, "get_marginLeft failed: %08x\n", hres);
2782 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2783 VariantClear(&v);
2784
2785 hres = IHTMLCurrentStyle_get_borderLeftWidth(current_style, &v);
2786 ok(hres == S_OK, "get_borderLeftWidth failed: %08x\n", hres);
2787 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2788 VariantClear(&v);
2789
2790 V_BSTR(&v) = NULL;
2791 hres = IHTMLCurrentStyle_get_borderRightWidth(current_style, &v);
2792 ok(hres == S_OK, "get_borderRightWidth failed: %08x\n", hres);
2793 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2794 VariantClear(&v);
2795
2796 hres = IHTMLCurrentStyle_get_borderBottomWidth(current_style, &v);
2797 ok(hres == S_OK, "get_borderBottomWidth failed: %08x\n", hres);
2798 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2799 VariantClear(&v);
2800
2801 hres = IHTMLCurrentStyle_get_borderTopWidth(current_style, &v);
2802 ok(hres == S_OK, "get_borderTopWidth failed: %08x\n", hres);
2803 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2804 VariantClear(&v);
2805
2806 hres = IHTMLCurrentStyle_get_color(current_style, &v);
2807 ok(hres == S_OK, "get_color failed: %08x\n", hres);
2808 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2809 VariantClear(&v);
2810
2811 hres = IHTMLCurrentStyle_get_backgroundColor(current_style, &v);
2812 ok(hres == S_OK, "get_backgroundColor failed: %08x\n", hres);
2813 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2814 VariantClear(&v);
2815
2816 hres = IHTMLCurrentStyle_get_borderLeftColor(current_style, &v);
2817 ok(hres == S_OK, "get_borderLeftColor failed: %08x\n", hres);
2818 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2819 VariantClear(&v);
2820
2821 hres = IHTMLCurrentStyle_get_borderTopColor(current_style, &v);
2822 ok(hres == S_OK, "get_borderTopColor failed: %08x\n", hres);
2823 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2824 VariantClear(&v);
2825
2826 hres = IHTMLCurrentStyle_get_borderRightColor(current_style, &v);
2827 ok(hres == S_OK, "get_borderRightColor failed: %08x\n", hres);
2828 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2829 VariantClear(&v);
2830
2831 hres = IHTMLCurrentStyle_get_borderBottomColor(current_style, &v);
2832 ok(hres == S_OK, "get_borderBottomColor failed: %08x\n", hres);
2833 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2834 VariantClear(&v);
2835
2836 hres = IHTMLCurrentStyle_get_paddingTop(current_style, &v);
2837 ok(hres == S_OK, "get_paddingTop failed: %08x\n", hres);
2838 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2839 VariantClear(&v);
2840
2841 hres = IHTMLCurrentStyle_get_paddingRight(current_style, &v);
2842 ok(hres == S_OK, "get_paddingRight failed: %08x\n", hres);
2843 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2844 VariantClear(&v);
2845
2846 hres = IHTMLCurrentStyle_get_paddingBottom(current_style, &v);
2847 ok(hres == S_OK, "get_paddingRight failed: %08x\n", hres);
2848 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2849 VariantClear(&v);
2850
2851 hres = IHTMLCurrentStyle_get_letterSpacing(current_style, &v);
2852 ok(hres == S_OK, "get_letterSpacing failed: %08x\n", hres);
2853 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2854 VariantClear(&v);
2855
2856 hres = IHTMLCurrentStyle_get_marginTop(current_style, &v);
2857 ok(hres == S_OK, "get_marginTop failed: %08x\n", hres);
2858 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2859 VariantClear(&v);
2860
2861 hres = IHTMLCurrentStyle_get_marginBottom(current_style, &v);
2862 ok(hres == S_OK, "get_marginBottom failed: %08x\n", hres);
2863 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2864 VariantClear(&v);
2865
2866 hres = IHTMLCurrentStyle_get_right(current_style, &v);
2867 ok(hres == S_OK, "get_Right failed: %08x\n", hres);
2868 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2869 VariantClear(&v);
2870
2871 hres = IHTMLCurrentStyle_get_bottom(current_style, &v);
2872 ok(hres == S_OK, "get_bottom failed: %08x\n", hres);
2873 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2874 VariantClear(&v);
2875
2876 hres = IHTMLCurrentStyle_get_lineHeight(current_style, &v);
2877 ok(hres == S_OK, "get_lineHeight failed: %08x\n", hres);
2878 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2879 VariantClear(&v);
2880
2881 hres = IHTMLCurrentStyle_get_textIndent(current_style, &v);
2882 ok(hres == S_OK, "get_textIndent failed: %08x\n", hres);
2883 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2884 VariantClear(&v);
2885
2886 hres = IHTMLCurrentStyle_get_textTransform(current_style, &str);
2887 ok(hres == S_OK, "get_textTransform failed: %08x\n", hres);
2888 SysFreeString(str);
2889
2890 current_style2 = get_current_style2_iface((IUnknown*)current_style);
2891
2892 b = 100;
2893 hres = IHTMLCurrentStyle2_get_hasLayout(current_style2, &b);
2894 ok(hres == S_OK, "get_hasLayout failed: %08x\n", hres);
2895 ok(b == VARIANT_TRUE, "hasLayout = %x\n", b);
2896
2897 IHTMLCurrentStyle2_Release(current_style2);
2898
2899 hres = IHTMLCurrentStyle_QueryInterface(current_style, &IID_IHTMLCurrentStyle3, (void**)¤t_style3);
2900 ok(hres == S_OK, "Could not get IHTMLCurrentStyle3 iface: %08x\n", hres);
2901
2902 hres = IHTMLCurrentStyle3_get_whiteSpace(current_style3, &str);
2903 ok(hres == S_OK, "get_whiteSpace failed: %08x\n", hres);
2904 ok(!strcmp_wa(str, "normal"), "whiteSpace = %s\n", wine_dbgstr_w(str));
2905 SysFreeString(str);
2906
2907 IHTMLCurrentStyle3_Release(current_style3);
2908 }
2909
2910 static const char basic_test_str[] = "<html><body><div id=\"divid\"></div/</body></html>";
2911
basic_style_test(IHTMLDocument2 * doc)2912 static void basic_style_test(IHTMLDocument2 *doc)
2913 {
2914 IHTMLCurrentStyle *cstyle;
2915 IHTMLElement *elem;
2916 IHTMLStyle *style;
2917 HRESULT hres;
2918
2919 hres = IHTMLDocument2_get_body(doc, &elem);
2920 ok(hres == S_OK, "get_body failed: %08x\n", hres);
2921
2922 hres = IHTMLElement_get_style(elem, &style);
2923 ok(hres == S_OK, "get_style failed: %08x\n", hres);
2924
2925 test_body_style(style);
2926
2927 cstyle = get_current_style(elem);
2928 test_current_style(cstyle);
2929 IHTMLCurrentStyle_Release(cstyle);
2930 IHTMLElement_Release(elem);
2931
2932 elem = get_element_by_id(doc, "divid");
2933 test_style_filters(elem);
2934
2935 test_set_csstext(style);
2936 IHTMLStyle_Release(style);
2937 IHTMLElement_Release(elem);
2938 }
2939
2940 static const char runtimestyle_test_str[] =
2941 "<html><head><style>body {text-decoration: auto}</style></head><body></body></html>";
2942
runtimestyle_test(IHTMLDocument2 * doc)2943 static void runtimestyle_test(IHTMLDocument2 *doc)
2944 {
2945 IHTMLStyle *style, *runtime_style;
2946 IHTMLElement2 *elem2;
2947 IHTMLElement *elem;
2948 BSTR str;
2949 HRESULT hres;
2950
2951 hres = IHTMLDocument2_get_body(doc, &elem);
2952 ok(hres == S_OK, "get_body failed: %08x\n", hres);
2953
2954 elem2 = get_elem2_iface((IUnknown*)elem);
2955
2956 hres = IHTMLElement2_get_runtimeStyle(elem2, &runtime_style);
2957 ok(hres == S_OK, "get_runtimeStyle failed: %08x\n", hres);
2958
2959 hres = IHTMLElement_get_style(elem, &style);
2960 ok(hres == S_OK, "get_style failed: %08x\n", hres);
2961
2962 test_text_decoration(style, NULL);
2963 test_text_decoration(runtime_style, NULL);
2964 set_text_decoration(style, "underline");
2965 test_text_decoration(style, "underline");
2966
2967 hres = IHTMLStyle_get_textDecoration(style, &str);
2968 ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
2969 ok(broken(!str) || !strcmp_wa(str, "underline"), "textDecoration = %s\n", wine_dbgstr_w(str));
2970 SysFreeString(str);
2971
2972 set_text_decoration(runtime_style, "blink");
2973 test_text_decoration(runtime_style, "blink");
2974
2975 hres = IHTMLStyle_get_textDecoration(style, &str);
2976 ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres);
2977 todo_wine
2978 ok(!strcmp_wa(str, "underline"), "textDecoration = %s\n", wine_dbgstr_w(str));
2979 SysFreeString(str);
2980
2981 IHTMLStyle_Release(runtime_style);
2982 IHTMLStyle_Release(style);
2983 IHTMLElement2_Release(elem2);
2984 IHTMLElement_Release(elem);
2985 }
2986
2987 static IHTMLDocument2 *notif_doc;
2988 static BOOL doc_complete;
2989
create_document(void)2990 static IHTMLDocument2 *create_document(void)
2991 {
2992 IHTMLDocument2 *doc;
2993 IHTMLDocument5 *doc5;
2994 HRESULT hres;
2995
2996 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2997 &IID_IHTMLDocument2, (void**)&doc);
2998 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
2999 if(FAILED(hres))
3000 return NULL;
3001
3002 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
3003 if(FAILED(hres)) {
3004 win_skip("Could not get IHTMLDocument5, probably too old IE\n");
3005 IHTMLDocument2_Release(doc);
3006 return NULL;
3007 }
3008
3009 IHTMLDocument5_Release(doc5);
3010 return doc;
3011 }
3012
PropertyNotifySink_QueryInterface(IPropertyNotifySink * iface,REFIID riid,void ** ppv)3013 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
3014 REFIID riid, void**ppv)
3015 {
3016 if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
3017 *ppv = iface;
3018 return S_OK;
3019 }
3020
3021 ok(0, "unexpected call\n");
3022 return E_NOINTERFACE;
3023 }
3024
PropertyNotifySink_AddRef(IPropertyNotifySink * iface)3025 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
3026 {
3027 return 2;
3028 }
3029
PropertyNotifySink_Release(IPropertyNotifySink * iface)3030 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
3031 {
3032 return 1;
3033 }
3034
PropertyNotifySink_OnChanged(IPropertyNotifySink * iface,DISPID dispID)3035 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
3036 {
3037 if(dispID == DISPID_READYSTATE){
3038 BSTR state;
3039 HRESULT hres;
3040
3041 hres = IHTMLDocument2_get_readyState(notif_doc, &state);
3042 ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
3043
3044 if(!strcmp_wa(state, "complete"))
3045 doc_complete = TRUE;
3046
3047 SysFreeString(state);
3048 }
3049
3050 return S_OK;
3051 }
3052
PropertyNotifySink_OnRequestEdit(IPropertyNotifySink * iface,DISPID dispID)3053 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
3054 {
3055 ok(0, "unexpected call\n");
3056 return E_NOTIMPL;
3057 }
3058
3059 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
3060 PropertyNotifySink_QueryInterface,
3061 PropertyNotifySink_AddRef,
3062 PropertyNotifySink_Release,
3063 PropertyNotifySink_OnChanged,
3064 PropertyNotifySink_OnRequestEdit
3065 };
3066
3067 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
3068
create_doc_with_string(const char * str)3069 static IHTMLDocument2 *create_doc_with_string(const char *str)
3070 {
3071 IPersistStreamInit *init;
3072 IStream *stream;
3073 IHTMLDocument2 *doc;
3074 HGLOBAL mem;
3075 SIZE_T len;
3076
3077 notif_doc = doc = create_document();
3078 if(!doc)
3079 return NULL;
3080
3081 doc_complete = FALSE;
3082 len = strlen(str);
3083 mem = GlobalAlloc(0, len);
3084 memcpy(mem, str, len);
3085 CreateStreamOnHGlobal(mem, TRUE, &stream);
3086
3087 IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
3088
3089 IPersistStreamInit_Load(init, stream);
3090 IPersistStreamInit_Release(init);
3091 IStream_Release(stream);
3092
3093 return doc;
3094 }
3095
do_advise(IUnknown * unk,REFIID riid,IUnknown * unk_advise)3096 static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise)
3097 {
3098 IConnectionPointContainer *container;
3099 IConnectionPoint *cp;
3100 DWORD cookie;
3101 HRESULT hres;
3102
3103 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
3104 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
3105
3106 hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
3107 IConnectionPointContainer_Release(container);
3108 ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
3109
3110 hres = IConnectionPoint_Advise(cp, unk_advise, &cookie);
3111 IConnectionPoint_Release(cp);
3112 ok(hres == S_OK, "Advise failed: %08x\n", hres);
3113 }
3114
3115 typedef void (*style_test_t)(IHTMLDocument2*);
3116
run_test(const char * str,style_test_t test)3117 static void run_test(const char *str, style_test_t test)
3118 {
3119 IHTMLDocument2 *doc;
3120 ULONG ref;
3121 MSG msg;
3122
3123 doc = create_doc_with_string(str);
3124 if(!doc)
3125 return;
3126
3127 do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
3128
3129 while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) {
3130 TranslateMessage(&msg);
3131 DispatchMessageW(&msg);
3132 }
3133
3134 test(doc);
3135
3136 ref = IHTMLDocument2_Release(doc);
3137 ok(!ref || broken(ref == 1), /* Vista */
3138 "ref = %d\n", ref);
3139 }
3140
3141
START_TEST(style)3142 START_TEST(style)
3143 {
3144 CoInitialize(NULL);
3145
3146 run_test(basic_test_str, basic_style_test);
3147 run_test(runtimestyle_test_str, runtimestyle_test);
3148
3149 CoUninitialize();
3150 }
3151