1 /*
2  * Copyright 2007-2011 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include "precomp.h"
20 
21 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 
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 
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 
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)
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)
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)
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**)&current_style2);
94     ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres);
95     return current_style2;
96 }
97 
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)
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)
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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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, &params, &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)
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)
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)
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)
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)
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 
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 
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 
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 
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 
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 
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 
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)
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)
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)
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 
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, &current_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 
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**)&current_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 
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 
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 
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 
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 
3025 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
3026 {
3027     return 2;
3028 }
3029 
3030 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
3031 {
3032     return 1;
3033 }
3034 
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 
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 
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 
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 
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 
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