hal: Add version resource.
[wine] / dlls / mshtml / htmlstyle.c
1 /*
2  * Copyright 2006 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 <stdarg.h>
20 #include <math.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28 #include "mshtmdid.h"
29
30 #include "mshtml_private.h"
31 #include "htmlstyle.h"
32
33 #include "wine/debug.h"
34 #include "wine/unicode.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37
38 static const WCHAR attrBackground[] =
39     {'b','a','c','k','g','r','o','u','n','d',0};
40 static const WCHAR attrBackgroundColor[] =
41     {'b','a','c','k','g','r','o','u','n','d','-','c','o','l','o','r',0};
42 static const WCHAR attrBackgroundImage[] =
43     {'b','a','c','k','g','r','o','u','n','d','-','i','m','a','g','e',0};
44 static const WCHAR attrBorder[] =
45     {'b','o','r','d','e','r',0};
46 static const WCHAR attrBorderLeft[] =
47     {'b','o','r','d','e','r','-','l','e','f','t',0};
48 static const WCHAR attrBorderWidth[] =
49     {'b','o','r','d','e','r','-','w','i','d','t','h',0};
50 static const WCHAR attrColor[] =
51     {'c','o','l','o','r',0};
52 static const WCHAR attrCursor[] =
53     {'c','u','r','s','o','r',0};
54 static const WCHAR attrDisplay[] =
55     {'d','i','s','p','l','a','y',0};
56 static const WCHAR attrFilter[] =
57     {'f','i','l','e','t','e','r',0};
58 static const WCHAR attrFontFamily[] =
59     {'f','o','n','t','-','f','a','m','i','l','y',0};
60 static const WCHAR attrFontSize[] =
61     {'f','o','n','t','-','s','i','z','e',0};
62 static const WCHAR attrFontStyle[] =
63     {'f','o','n','t','-','s','t','y','l','e',0};
64 static const WCHAR attrFontVariant[] =
65     {'f','o','n','t','-','v','a','r','i','a','n','t',0};
66 static const WCHAR attrFontWeight[] =
67     {'f','o','n','t','-','w','e','i','g','h','t',0};
68 static const WCHAR attrHeight[] =
69     {'h','e','i','g','h','t',0};
70 static const WCHAR attrLeft[] =
71     {'l','e','f','t',0};
72 static const WCHAR attrMargin[] =
73     {'m','a','r','g','i','n',0};
74 static const WCHAR attrMarginLeft[] =
75     {'m','a','r','g','i','n','-','l','e','f','t',0};
76 static const WCHAR attrMarginRight[] =
77     {'m','a','r','g','i','n','-','r','i','g','h','t',0};
78 static const WCHAR attrOverflow[] =
79     {'o','v','e','r','f','l','o','w',0};
80 static const WCHAR attrPaddingLeft[] =
81     {'p','a','d','d','i','n','g','-','l','e','f','t',0};
82 static const WCHAR attrPosition[] =
83     {'p','o','s','i','t','i','o','n',0};
84 static const WCHAR attrTextAlign[] =
85     {'t','e','x','t','-','a','l','i','g','n',0};
86 static const WCHAR attrTextDecoration[] =
87     {'t','e','x','t','-','d','e','c','o','r','a','t','i','o','n',0};
88 static const WCHAR attrTop[] =
89     {'t','o','p',0};
90 static const WCHAR attrVerticalAlign[] =
91     {'v','e','r','t','i','c','a','l','-','a','l','i','g','n',0};
92 static const WCHAR attrVisibility[] =
93     {'v','i','s','i','b','i','l','i','t','y',0};
94 static const WCHAR attrWidth[] =
95     {'w','i','d','t','h',0};
96 static const WCHAR attrZIndex[] =
97     {'z','-','i','n','d','e','x',0};
98
99 static const struct{
100     const WCHAR *name;
101     DISPID dispid;
102 } style_tbl[] = {
103     {attrBackground,           DISPID_IHTMLSTYLE_BACKGROUND},
104     {attrBackgroundColor,      DISPID_IHTMLSTYLE_BACKGROUNDCOLOR},
105     {attrBackgroundImage,      DISPID_IHTMLSTYLE_BACKGROUNDIMAGE},
106     {attrBorder,               DISPID_IHTMLSTYLE_BORDER},
107     {attrBorderLeft,           DISPID_IHTMLSTYLE_BORDERLEFT},
108     {attrBorderWidth,          DISPID_IHTMLSTYLE_BORDERWIDTH},
109     {attrColor,                DISPID_IHTMLSTYLE_COLOR},
110     {attrCursor,               DISPID_IHTMLSTYLE_CURSOR},
111     {attrDisplay,              DISPID_IHTMLSTYLE_DISPLAY},
112     {attrFilter,               DISPID_IHTMLSTYLE_FILTER},
113     {attrFontFamily,           DISPID_IHTMLSTYLE_FONTFAMILY},
114     {attrFontSize,             DISPID_IHTMLSTYLE_FONTSIZE},
115     {attrFontStyle,            DISPID_IHTMLSTYLE_FONTSTYLE},
116     {attrFontVariant,          DISPID_IHTMLSTYLE_FONTVARIANT},
117     {attrFontWeight,           DISPID_IHTMLSTYLE_FONTWEIGHT},
118     {attrHeight,               DISPID_IHTMLSTYLE_HEIGHT},
119     {attrLeft,                 DISPID_IHTMLSTYLE_LEFT},
120     {attrMargin,               DISPID_IHTMLSTYLE_MARGIN},
121     {attrMarginLeft,           DISPID_IHTMLSTYLE_MARGINLEFT},
122     {attrMarginRight,          DISPID_IHTMLSTYLE_MARGINRIGHT},
123     {attrOverflow,             DISPID_IHTMLSTYLE_OVERFLOW},
124     {attrPaddingLeft,          DISPID_IHTMLSTYLE_PADDINGLEFT},
125     {attrPosition,             DISPID_IHTMLSTYLE2_POSITION},
126     {attrTextAlign,            DISPID_IHTMLSTYLE_TEXTALIGN},
127     {attrTextDecoration,       DISPID_IHTMLSTYLE_TEXTDECORATION},
128     {attrTop,                  DISPID_IHTMLSTYLE_TOP},
129     {attrVerticalAlign,        DISPID_IHTMLSTYLE_VERTICALALIGN},
130     {attrVisibility,           DISPID_IHTMLSTYLE_VISIBILITY},
131     {attrWidth,                DISPID_IHTMLSTYLE_WIDTH},
132     {attrZIndex,               DISPID_IHTMLSTYLE_ZINDEX}
133 };
134
135 static const WCHAR valLineThrough[] =
136     {'l','i','n','e','-','t','h','r','o','u','g','h',0};
137 static const WCHAR valUnderline[] =
138     {'u','n','d','e','r','l','i','n','e',0};
139 static const WCHAR szNormal[] =
140     {'n','o','r','m','a','l',0};
141
142 static const WCHAR px_formatW[] = {'%','d','p','x',0};
143 static const WCHAR emptyW[] = {0};
144
145 static LPWSTR fix_px_value(LPCWSTR val)
146 {
147     LPCWSTR ptr = val;
148
149     while(*ptr) {
150         while(*ptr && isspaceW(*ptr))
151             ptr++;
152         if(!*ptr)
153             break;
154
155         while(*ptr && isdigitW(*ptr))
156             ptr++;
157
158         if(!*ptr || isspaceW(*ptr)) {
159             LPWSTR ret, p;
160             int len = strlenW(val)+1;
161
162             ret = heap_alloc((len+2)*sizeof(WCHAR));
163             memcpy(ret, val, (ptr-val)*sizeof(WCHAR));
164             p = ret + (ptr-val);
165             *p++ = 'p';
166             *p++ = 'x';
167             strcpyW(p, ptr);
168
169             TRACE("fixed %s -> %s\n", debugstr_w(val), debugstr_w(ret));
170
171             return ret;
172         }
173
174         while(*ptr && !isspaceW(*ptr))
175             ptr++;
176     }
177
178     return NULL;
179 }
180
181 static LPWSTR fix_url_value(LPCWSTR val)
182 {
183     WCHAR *ret, *ptr;
184
185     static const WCHAR urlW[] = {'u','r','l','('};
186
187     if(strncmpW(val, urlW, sizeof(urlW)/sizeof(WCHAR)) || !strchrW(val, '\\'))
188         return NULL;
189
190     ret = heap_strdupW(val);
191
192     for(ptr = ret; *ptr; ptr++) {
193         if(*ptr == '\\')
194             *ptr = '/';
195     }
196
197     return ret;
198 }
199
200 #define ATTR_FIX_PX      1
201 #define ATTR_FIX_URL     2
202 #define ATTR_STR_TO_INT  4
203
204 HRESULT set_nsstyle_attr(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, LPCWSTR value, DWORD flags)
205 {
206     nsAString str_name, str_value, str_empty;
207     LPWSTR val = NULL;
208     nsresult nsres;
209
210     static const PRUnichar wszEmpty[] = {0};
211
212     if(flags & ATTR_FIX_PX)
213         val = fix_px_value(value);
214     if(flags & ATTR_FIX_URL)
215         val = fix_url_value(value);
216
217     nsAString_Init(&str_name, style_tbl[sid].name);
218     nsAString_Init(&str_value, val ? val : value);
219     nsAString_Init(&str_empty, wszEmpty);
220     heap_free(val);
221
222     nsres = nsIDOMCSSStyleDeclaration_SetProperty(nsstyle, &str_name, &str_value, &str_empty);
223     if(NS_FAILED(nsres))
224         ERR("SetProperty failed: %08x\n", nsres);
225
226     nsAString_Finish(&str_name);
227     nsAString_Finish(&str_value);
228     nsAString_Finish(&str_empty);
229
230     return S_OK;
231 }
232
233 static HRESULT set_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, VARIANT *value, DWORD flags)
234 {
235     switch(V_VT(value)) {
236     case VT_NULL:
237         return set_nsstyle_attr(nsstyle, sid, emptyW, flags);
238
239     case VT_BSTR:
240         return set_nsstyle_attr(nsstyle, sid, V_BSTR(value), flags);
241
242     default:
243         FIXME("not implemented vt %d\n", V_VT(value));
244         return E_NOTIMPL;
245
246     }
247
248     return S_OK;
249 }
250
251 static inline HRESULT set_style_attr(HTMLStyle *This, styleid_t sid, LPCWSTR value, DWORD flags)
252 {
253     return set_nsstyle_attr(This->nsstyle, sid, value, flags);
254 }
255
256 static HRESULT get_nsstyle_attr_nsval(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, nsAString *value)
257 {
258     nsAString str_name;
259     nsresult nsres;
260
261     nsAString_Init(&str_name, style_tbl[sid].name);
262
263     nsres = nsIDOMCSSStyleDeclaration_GetPropertyValue(nsstyle, &str_name, value);
264     if(NS_FAILED(nsres)) {
265         ERR("SetProperty failed: %08x\n", nsres);
266         return E_FAIL;
267     }
268
269     nsAString_Finish(&str_name);
270
271     return NS_OK;
272 }
273
274 HRESULT get_nsstyle_attr(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, BSTR *p)
275 {
276     nsAString str_value;
277     const PRUnichar *value;
278
279     nsAString_Init(&str_value, NULL);
280
281     get_nsstyle_attr_nsval(nsstyle, sid, &str_value);
282
283     nsAString_GetData(&str_value, &value);
284     *p = *value ? SysAllocString(value) : NULL;
285
286     nsAString_Finish(&str_value);
287
288     TRACE("%s -> %s\n", debugstr_w(style_tbl[sid].name), debugstr_w(*p));
289     return S_OK;
290 }
291
292 static HRESULT get_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, VARIANT *p, DWORD flags)
293 {
294     nsAString str_value;
295     const PRUnichar *value;
296     BOOL set = FALSE;
297
298     nsAString_Init(&str_value, NULL);
299
300     get_nsstyle_attr_nsval(nsstyle, sid, &str_value);
301
302     nsAString_GetData(&str_value, &value);
303
304     if(flags & ATTR_STR_TO_INT) {
305         const PRUnichar *ptr = value;
306         BOOL neg = FALSE;
307         INT i = 0;
308
309         if(*ptr == '-') {
310             neg = TRUE;
311             ptr++;
312         }
313
314         while(isdigitW(*ptr))
315             i = i*10 + (*ptr++ - '0');
316
317         if(!*ptr) {
318             V_VT(p) = VT_I4;
319             V_I4(p) = neg ? -i : i;
320             set = TRUE;
321         }
322     }
323
324     if(!set) {
325         BSTR str = NULL;
326
327         if(*value) {
328             str = SysAllocString(value);
329             if(!str)
330                 return E_OUTOFMEMORY;
331         }
332
333         V_VT(p) = VT_BSTR;
334         V_BSTR(p) = str;
335     }
336
337     nsAString_Finish(&str_value);
338
339     TRACE("%s -> %s\n", debugstr_w(style_tbl[sid].name), debugstr_variant(p));
340     return S_OK;
341 }
342
343 static inline HRESULT get_style_attr(HTMLStyle *This, styleid_t sid, BSTR *p)
344 {
345     return get_nsstyle_attr(This->nsstyle, sid, p);
346 }
347
348 static HRESULT check_style_attr_value(HTMLStyle *This, styleid_t sid, LPCWSTR exval, VARIANT_BOOL *p)
349 {
350     nsAString str_value;
351     const PRUnichar *value;
352
353     nsAString_Init(&str_value, NULL);
354
355     get_nsstyle_attr_nsval(This->nsstyle, sid, &str_value);
356
357     nsAString_GetData(&str_value, &value);
358     *p = strcmpW(value, exval) ? VARIANT_FALSE : VARIANT_TRUE;
359     nsAString_Finish(&str_value);
360
361     TRACE("%s -> %x\n", debugstr_w(style_tbl[sid].name), *p);
362     return S_OK;
363 }
364
365 static inline HRESULT set_style_pos(HTMLStyle *This, styleid_t sid, float value)
366 {
367     WCHAR szValue[25];
368     WCHAR szFormat[] = {'%','.','0','f','p','x',0};
369
370     value = floor(value);
371
372     sprintfW(szValue, szFormat, value);
373
374     return set_style_attr(This, sid, szValue, 0);
375 }
376
377 static HRESULT get_nsstyle_pos(HTMLStyle *This, styleid_t sid, float *p)
378 {
379     nsAString str_value;
380     HRESULT hres;
381     WCHAR pxW[] = {'p','x',0};
382
383     TRACE("%p %d %p\n", This, sid, p);
384
385     *p = 0.0f;
386
387     nsAString_Init(&str_value, NULL);
388
389     hres = get_nsstyle_attr_nsval(This->nsstyle, sid, &str_value);
390     if(hres == S_OK)
391     {
392         WCHAR *ptr;
393         const PRUnichar *value;
394
395         nsAString_GetData(&str_value, &value);
396         if(value)
397         {
398             *p = strtolW(value, &ptr, 10);
399
400             if(*ptr && strcmpW(ptr, pxW))
401             {
402                 nsAString_Finish(&str_value);
403                 FIXME("only px values are currently supported\n");
404                 return E_FAIL;
405             }
406         }
407     }
408
409     TRACE("ret %f\n", *p);
410
411     nsAString_Finish(&str_value);
412
413     return hres;
414 }
415
416 #define HTMLSTYLE_THIS(iface) DEFINE_THIS(HTMLStyle, HTMLStyle, iface)
417
418 static HRESULT WINAPI HTMLStyle_QueryInterface(IHTMLStyle *iface, REFIID riid, void **ppv)
419 {
420     HTMLStyle *This = HTMLSTYLE_THIS(iface);
421
422     *ppv = NULL;
423
424     if(IsEqualGUID(&IID_IUnknown, riid)) {
425         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
426         *ppv = HTMLSTYLE(This);
427     }else if(IsEqualGUID(&IID_IHTMLStyle, riid)) {
428         TRACE("(%p)->(IID_IHTMLStyle %p)\n", This, ppv);
429         *ppv = HTMLSTYLE(This);
430     }else if(IsEqualGUID(&IID_IHTMLStyle2, riid)) {
431         TRACE("(%p)->(IID_IHTMLStyle2 %p)\n", This, ppv);
432         *ppv = HTMLSTYLE2(This);
433     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
434         return *ppv ? S_OK : E_NOINTERFACE;
435     }
436
437     if(*ppv) {
438         IUnknown_AddRef((IUnknown*)*ppv);
439         return S_OK;
440     }
441
442     WARN("unsupported %s\n", debugstr_guid(riid));
443     return E_NOINTERFACE;
444 }
445
446 static ULONG WINAPI HTMLStyle_AddRef(IHTMLStyle *iface)
447 {
448     HTMLStyle *This = HTMLSTYLE_THIS(iface);
449     LONG ref = InterlockedIncrement(&This->ref);
450
451     TRACE("(%p) ref=%d\n", This, ref);
452
453     return ref;
454 }
455
456 static ULONG WINAPI HTMLStyle_Release(IHTMLStyle *iface)
457 {
458     HTMLStyle *This = HTMLSTYLE_THIS(iface);
459     LONG ref = InterlockedDecrement(&This->ref);
460
461     TRACE("(%p) ref=%d\n", This, ref);
462
463     if(!ref) {
464         if(This->nsstyle)
465             nsIDOMCSSStyleDeclaration_Release(This->nsstyle);
466         heap_free(This);
467     }
468
469     return ref;
470 }
471
472 static HRESULT WINAPI HTMLStyle_GetTypeInfoCount(IHTMLStyle *iface, UINT *pctinfo)
473 {
474     HTMLStyle *This = HTMLSTYLE_THIS(iface);
475     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
476 }
477
478 static HRESULT WINAPI HTMLStyle_GetTypeInfo(IHTMLStyle *iface, UINT iTInfo,
479                                               LCID lcid, ITypeInfo **ppTInfo)
480 {
481     HTMLStyle *This = HTMLSTYLE_THIS(iface);
482     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
483 }
484
485 static HRESULT WINAPI HTMLStyle_GetIDsOfNames(IHTMLStyle *iface, REFIID riid,
486                                                 LPOLESTR *rgszNames, UINT cNames,
487                                                 LCID lcid, DISPID *rgDispId)
488 {
489     HTMLStyle *This = HTMLSTYLE_THIS(iface);
490     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
491 }
492
493 static HRESULT WINAPI HTMLStyle_Invoke(IHTMLStyle *iface, DISPID dispIdMember,
494                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
495                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
496 {
497     HTMLStyle *This = HTMLSTYLE_THIS(iface);
498     return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid,
499             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
500 }
501
502 static HRESULT WINAPI HTMLStyle_put_fontFamily(IHTMLStyle *iface, BSTR v)
503 {
504     HTMLStyle *This = HTMLSTYLE_THIS(iface);
505
506     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
507
508     return set_style_attr(This, STYLEID_FONT_FAMILY, v, 0);
509 }
510
511 static HRESULT WINAPI HTMLStyle_get_fontFamily(IHTMLStyle *iface, BSTR *p)
512 {
513     HTMLStyle *This = HTMLSTYLE_THIS(iface);
514
515     TRACE("(%p)->(%p)\n", This, p);
516
517     return get_style_attr(This, STYLEID_FONT_FAMILY, p);
518 }
519
520 static HRESULT WINAPI HTMLStyle_put_fontStyle(IHTMLStyle *iface, BSTR v)
521 {
522     HTMLStyle *This = HTMLSTYLE_THIS(iface);
523     static const WCHAR szItalic[]  = {'i','t','a','l','i','c',0};
524     static const WCHAR szOblique[]  = {'o','b','l','i','q','u','e',0};
525
526     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
527
528     /* fontStyle can only be one of the follow values. */
529     if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szItalic, v) == 0 ||
530              strcmpiW(szOblique, v) == 0)
531     {
532         return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_STYLE, v, 0);
533     }
534
535     return E_INVALIDARG;
536 }
537
538 static HRESULT WINAPI HTMLStyle_get_fontStyle(IHTMLStyle *iface, BSTR *p)
539 {
540     HTMLStyle *This = HTMLSTYLE_THIS(iface);
541
542     TRACE("(%p)->(%p)\n", This, p);
543
544     return get_style_attr(This, STYLEID_FONT_STYLE, p);
545 }
546
547 static HRESULT WINAPI HTMLStyle_put_fontVariant(IHTMLStyle *iface, BSTR v)
548 {
549     HTMLStyle *This = HTMLSTYLE_THIS(iface);
550     static const WCHAR szCaps[]  = {'s','m','a','l','l','-','c','a','p','s',0};
551
552     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
553
554     /* fontVariant can only be one of the follow values. */
555     if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szCaps, v) == 0)
556     {
557         return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_VARIANT, v, 0);
558     }
559
560     return E_INVALIDARG;
561 }
562
563 static HRESULT WINAPI HTMLStyle_get_fontVariant(IHTMLStyle *iface, BSTR *p)
564 {
565     HTMLStyle *This = HTMLSTYLE_THIS(iface);
566     TRACE("(%p)->(%p)\n", This, p);
567
568     if(!p)
569        return E_INVALIDARG;
570
571     return get_style_attr(This, STYLEID_FONT_VARIANT, p);
572 }
573
574 static HRESULT WINAPI HTMLStyle_put_fontWeight(IHTMLStyle *iface, BSTR v)
575 {
576     HTMLStyle *This = HTMLSTYLE_THIS(iface);
577     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
578     return E_NOTIMPL;
579 }
580
581 static HRESULT WINAPI HTMLStyle_get_fontWeight(IHTMLStyle *iface, BSTR *p)
582 {
583     HTMLStyle *This = HTMLSTYLE_THIS(iface);
584
585     TRACE("(%p)->(%p)\n", This, p);
586
587     return get_style_attr(This, STYLEID_FONT_WEIGHT, p);
588 }
589
590 static HRESULT WINAPI HTMLStyle_put_fontSize(IHTMLStyle *iface, VARIANT v)
591 {
592     HTMLStyle *This = HTMLSTYLE_THIS(iface);
593
594     TRACE("(%p)->(v%d)\n", This, V_VT(&v));
595
596     switch(V_VT(&v)) {
597     case VT_BSTR:
598         return set_style_attr(This, STYLEID_FONT_SIZE, V_BSTR(&v), 0);
599     default:
600         FIXME("not supported vt %d\n", V_VT(&v));
601     }
602
603     return S_OK;
604 }
605
606 static HRESULT WINAPI HTMLStyle_get_fontSize(IHTMLStyle *iface, VARIANT *p)
607 {
608     HTMLStyle *This = HTMLSTYLE_THIS(iface);
609
610     TRACE("(%p)->(%p)\n", This, p);
611
612     V_VT(p) = VT_BSTR;
613     return get_style_attr(This, STYLEID_FONT_SIZE, &V_BSTR(p));
614 }
615
616 static HRESULT WINAPI HTMLStyle_put_font(IHTMLStyle *iface, BSTR v)
617 {
618     HTMLStyle *This = HTMLSTYLE_THIS(iface);
619     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
620     return E_NOTIMPL;
621 }
622
623 static HRESULT WINAPI HTMLStyle_get_font(IHTMLStyle *iface, BSTR *p)
624 {
625     HTMLStyle *This = HTMLSTYLE_THIS(iface);
626     FIXME("(%p)->(%p)\n", This, p);
627     return E_NOTIMPL;
628 }
629
630 static HRESULT WINAPI HTMLStyle_put_color(IHTMLStyle *iface, VARIANT v)
631 {
632     HTMLStyle *This = HTMLSTYLE_THIS(iface);
633
634     TRACE("(%p)->(v%d)\n", This, V_VT(&v));
635
636     switch(V_VT(&v)) {
637     case VT_BSTR:
638         TRACE("%s\n", debugstr_w(V_BSTR(&v)));
639         return set_style_attr(This, STYLEID_COLOR, V_BSTR(&v), 0);
640
641     default:
642         FIXME("unsupported vt=%d\n", V_VT(&v));
643     }
644
645     return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI HTMLStyle_get_color(IHTMLStyle *iface, VARIANT *p)
649 {
650     HTMLStyle *This = HTMLSTYLE_THIS(iface);
651
652     TRACE("(%p)->(%p)\n", This, p);
653
654     V_VT(p) = VT_BSTR;
655     return get_style_attr(This, STYLEID_COLOR, &V_BSTR(p));
656 }
657
658 static HRESULT WINAPI HTMLStyle_put_background(IHTMLStyle *iface, BSTR v)
659 {
660     HTMLStyle *This = HTMLSTYLE_THIS(iface);
661
662     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
663
664     return set_style_attr(This, STYLEID_BACKGROUND, v, 0);
665 }
666
667 static HRESULT WINAPI HTMLStyle_get_background(IHTMLStyle *iface, BSTR *p)
668 {
669     HTMLStyle *This = HTMLSTYLE_THIS(iface);
670
671     TRACE("(%p)->(%p)\n", This, p);
672
673     return get_style_attr(This, STYLEID_BACKGROUND, p);
674 }
675
676 static HRESULT WINAPI HTMLStyle_put_backgroundColor(IHTMLStyle *iface, VARIANT v)
677 {
678     HTMLStyle *This = HTMLSTYLE_THIS(iface);
679
680     TRACE("(%p)->(v%d)\n", This, V_VT(&v));
681
682     switch(V_VT(&v)) {
683     case VT_BSTR:
684         return set_style_attr(This, STYLEID_BACKGROUND_COLOR, V_BSTR(&v), 0);
685     case VT_I4: {
686         WCHAR value[10];
687         static const WCHAR format[] = {'#','%','0','6','x',0};
688
689         wsprintfW(value, format, V_I4(&v));
690         return set_style_attr(This, STYLEID_BACKGROUND_COLOR, value, 0);
691     }
692     default:
693         FIXME("unsupported vt %d\n", V_VT(&v));
694     }
695
696     return S_OK;
697 }
698
699 static HRESULT WINAPI HTMLStyle_get_backgroundColor(IHTMLStyle *iface, VARIANT *p)
700 {
701     HTMLStyle *This = HTMLSTYLE_THIS(iface);
702     FIXME("(%p)->(%p)\n", This, p);
703     return E_NOTIMPL;
704 }
705
706 static HRESULT WINAPI HTMLStyle_put_backgroundImage(IHTMLStyle *iface, BSTR v)
707 {
708     HTMLStyle *This = HTMLSTYLE_THIS(iface);
709
710     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
711
712     return set_style_attr(This, STYLEID_BACKGROUND_IMAGE, v, ATTR_FIX_URL);
713 }
714
715 static HRESULT WINAPI HTMLStyle_get_backgroundImage(IHTMLStyle *iface, BSTR *p)
716 {
717     HTMLStyle *This = HTMLSTYLE_THIS(iface);
718     FIXME("(%p)->(%p)\n", This, p);
719     return E_NOTIMPL;
720 }
721
722 static HRESULT WINAPI HTMLStyle_put_backgroundRepeat(IHTMLStyle *iface, BSTR v)
723 {
724     HTMLStyle *This = HTMLSTYLE_THIS(iface);
725     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
726     return E_NOTIMPL;
727 }
728
729 static HRESULT WINAPI HTMLStyle_get_backgroundRepeat(IHTMLStyle *iface, BSTR *p)
730 {
731     HTMLStyle *This = HTMLSTYLE_THIS(iface);
732     FIXME("(%p)->(%p)\n", This, p);
733     return E_NOTIMPL;
734 }
735
736 static HRESULT WINAPI HTMLStyle_put_backgroundAttachment(IHTMLStyle *iface, BSTR v)
737 {
738     HTMLStyle *This = HTMLSTYLE_THIS(iface);
739     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
740     return E_NOTIMPL;
741 }
742
743 static HRESULT WINAPI HTMLStyle_get_backgroundAttachment(IHTMLStyle *iface, BSTR *p)
744 {
745     HTMLStyle *This = HTMLSTYLE_THIS(iface);
746     FIXME("(%p)->(%p)\n", This, p);
747     return E_NOTIMPL;
748 }
749
750 static HRESULT WINAPI HTMLStyle_put_backgroundPosition(IHTMLStyle *iface, BSTR v)
751 {
752     HTMLStyle *This = HTMLSTYLE_THIS(iface);
753     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
754     return E_NOTIMPL;
755 }
756
757 static HRESULT WINAPI HTMLStyle_get_backgroundPosition(IHTMLStyle *iface, BSTR *p)
758 {
759     HTMLStyle *This = HTMLSTYLE_THIS(iface);
760     FIXME("(%p)->(%p)\n", This, p);
761     return E_NOTIMPL;
762 }
763
764 static HRESULT WINAPI HTMLStyle_put_backgroundPositionX(IHTMLStyle *iface, VARIANT v)
765 {
766     HTMLStyle *This = HTMLSTYLE_THIS(iface);
767     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
768     return E_NOTIMPL;
769 }
770
771 static HRESULT WINAPI HTMLStyle_get_backgroundPositionX(IHTMLStyle *iface, VARIANT *p)
772 {
773     HTMLStyle *This = HTMLSTYLE_THIS(iface);
774     FIXME("(%p)->(%p)\n", This, p);
775     return E_NOTIMPL;
776 }
777
778 static HRESULT WINAPI HTMLStyle_put_backgroundPositionY(IHTMLStyle *iface, VARIANT v)
779 {
780     HTMLStyle *This = HTMLSTYLE_THIS(iface);
781     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
782     return E_NOTIMPL;
783 }
784
785 static HRESULT WINAPI HTMLStyle_get_backgroundPositionY(IHTMLStyle *iface, VARIANT *p)
786 {
787     HTMLStyle *This = HTMLSTYLE_THIS(iface);
788     FIXME("(%p)->(%p)\n", This, p);
789     return E_NOTIMPL;
790 }
791
792 static HRESULT WINAPI HTMLStyle_put_wordSpacing(IHTMLStyle *iface, VARIANT v)
793 {
794     HTMLStyle *This = HTMLSTYLE_THIS(iface);
795     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
796     return E_NOTIMPL;
797 }
798
799 static HRESULT WINAPI HTMLStyle_get_wordSpacing(IHTMLStyle *iface, VARIANT *p)
800 {
801     HTMLStyle *This = HTMLSTYLE_THIS(iface);
802     FIXME("(%p)->(%p)\n", This, p);
803     return E_NOTIMPL;
804 }
805
806 static HRESULT WINAPI HTMLStyle_put_letterSpacing(IHTMLStyle *iface, VARIANT v)
807 {
808     HTMLStyle *This = HTMLSTYLE_THIS(iface);
809     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
810     return E_NOTIMPL;
811 }
812
813 static HRESULT WINAPI HTMLStyle_get_letterSpacing(IHTMLStyle *iface, VARIANT *p)
814 {
815     HTMLStyle *This = HTMLSTYLE_THIS(iface);
816     FIXME("(%p)->(%p)\n", This, p);
817     return E_NOTIMPL;
818 }
819
820 static HRESULT WINAPI HTMLStyle_put_textDecoration(IHTMLStyle *iface, BSTR v)
821 {
822     HTMLStyle *This = HTMLSTYLE_THIS(iface);
823     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
824     return E_NOTIMPL;
825 }
826
827 static HRESULT WINAPI HTMLStyle_get_textDecoration(IHTMLStyle *iface, BSTR *p)
828 {
829     HTMLStyle *This = HTMLSTYLE_THIS(iface);
830
831     TRACE("(%p)->(%p)\n", This, p);
832
833     return get_style_attr(This, STYLEID_TEXT_DECORATION, p);
834 }
835
836 static HRESULT WINAPI HTMLStyle_put_textDecorationNone(IHTMLStyle *iface, VARIANT_BOOL v)
837 {
838     HTMLStyle *This = HTMLSTYLE_THIS(iface);
839     FIXME("(%p)->(%x)\n", This, v);
840     return E_NOTIMPL;
841 }
842
843 static HRESULT WINAPI HTMLStyle_get_textDecorationNone(IHTMLStyle *iface, VARIANT_BOOL *p)
844 {
845     HTMLStyle *This = HTMLSTYLE_THIS(iface);
846     FIXME("(%p)->(%p)\n", This, p);
847     return E_NOTIMPL;
848 }
849
850 static HRESULT WINAPI HTMLStyle_put_textDecorationUnderline(IHTMLStyle *iface, VARIANT_BOOL v)
851 {
852     HTMLStyle *This = HTMLSTYLE_THIS(iface);
853     FIXME("(%p)->(%x)\n", This, v);
854     return E_NOTIMPL;
855 }
856
857 static HRESULT WINAPI HTMLStyle_get_textDecorationUnderline(IHTMLStyle *iface, VARIANT_BOOL *p)
858 {
859     HTMLStyle *This = HTMLSTYLE_THIS(iface);
860
861     TRACE("(%p)->(%p)\n", This, p);
862
863     return check_style_attr_value(This, STYLEID_TEXT_DECORATION, valUnderline, p);
864 }
865
866 static HRESULT WINAPI HTMLStyle_put_textDecorationOverline(IHTMLStyle *iface, VARIANT_BOOL v)
867 {
868     HTMLStyle *This = HTMLSTYLE_THIS(iface);
869     FIXME("(%p)->(%x)\n", This, v);
870     return E_NOTIMPL;
871 }
872
873 static HRESULT WINAPI HTMLStyle_get_textDecorationOverline(IHTMLStyle *iface, VARIANT_BOOL *p)
874 {
875     HTMLStyle *This = HTMLSTYLE_THIS(iface);
876     FIXME("(%p)->(%p)\n", This, p);
877     return E_NOTIMPL;
878 }
879
880 static HRESULT WINAPI HTMLStyle_put_textDecorationLineThrough(IHTMLStyle *iface, VARIANT_BOOL v)
881 {
882     HTMLStyle *This = HTMLSTYLE_THIS(iface);
883     FIXME("(%p)->(%x)\n", This, v);
884     return E_NOTIMPL;
885 }
886
887 static HRESULT WINAPI HTMLStyle_get_textDecorationLineThrough(IHTMLStyle *iface, VARIANT_BOOL *p)
888 {
889     HTMLStyle *This = HTMLSTYLE_THIS(iface);
890
891     TRACE("(%p)->(%p)\n", This, p);
892
893     return check_style_attr_value(This, STYLEID_TEXT_DECORATION, valLineThrough, p);
894 }
895
896 static HRESULT WINAPI HTMLStyle_put_textDecorationBlink(IHTMLStyle *iface, VARIANT_BOOL v)
897 {
898     HTMLStyle *This = HTMLSTYLE_THIS(iface);
899     FIXME("(%p)->(%x)\n", This, v);
900     return E_NOTIMPL;
901 }
902
903 static HRESULT WINAPI HTMLStyle_get_textDecorationBlink(IHTMLStyle *iface, VARIANT_BOOL *p)
904 {
905     HTMLStyle *This = HTMLSTYLE_THIS(iface);
906     FIXME("(%p)->(%p)\n", This, p);
907     return E_NOTIMPL;
908 }
909
910 static HRESULT WINAPI HTMLStyle_put_verticalAlign(IHTMLStyle *iface, VARIANT v)
911 {
912     HTMLStyle *This = HTMLSTYLE_THIS(iface);
913
914     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
915
916     switch(V_VT(&v)) {
917     case VT_BSTR:
918         return set_style_attr(This, STYLEID_VERTICAL_ALIGN, V_BSTR(&v), 0);
919     default:
920         FIXME("not implemented vt %d\n", V_VT(&v));
921         return E_NOTIMPL;
922     }
923
924     return S_OK;
925 }
926
927 static HRESULT WINAPI HTMLStyle_get_verticalAlign(IHTMLStyle *iface, VARIANT *p)
928 {
929     HTMLStyle *This = HTMLSTYLE_THIS(iface);
930     BSTR ret;
931     HRESULT hres;
932
933     TRACE("(%p)->(%p)\n", This, p);
934
935     hres = get_style_attr(This, STYLEID_VERTICAL_ALIGN, &ret);
936     if(FAILED(hres))
937         return hres;
938
939     V_VT(p) = VT_BSTR;
940     V_BSTR(p) = ret;
941     return S_OK;
942 }
943
944 static HRESULT WINAPI HTMLStyle_put_textTransform(IHTMLStyle *iface, BSTR v)
945 {
946     HTMLStyle *This = HTMLSTYLE_THIS(iface);
947     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
948     return E_NOTIMPL;
949 }
950
951 static HRESULT WINAPI HTMLStyle_get_textTransform(IHTMLStyle *iface, BSTR *p)
952 {
953     HTMLStyle *This = HTMLSTYLE_THIS(iface);
954     FIXME("(%p)->(%p)\n", This, p);
955     return E_NOTIMPL;
956 }
957
958 static HRESULT WINAPI HTMLStyle_put_textAlign(IHTMLStyle *iface, BSTR v)
959 {
960     HTMLStyle *This = HTMLSTYLE_THIS(iface);
961
962     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
963
964     return set_style_attr(This, STYLEID_TEXT_ALIGN, v, 0);
965 }
966
967 static HRESULT WINAPI HTMLStyle_get_textAlign(IHTMLStyle *iface, BSTR *p)
968 {
969     HTMLStyle *This = HTMLSTYLE_THIS(iface);
970
971     TRACE("(%p)->(%p)\n", This, p);
972
973     return get_style_attr(This, STYLEID_TEXT_ALIGN, p);
974 }
975
976 static HRESULT WINAPI HTMLStyle_put_textIndent(IHTMLStyle *iface, VARIANT v)
977 {
978     HTMLStyle *This = HTMLSTYLE_THIS(iface);
979     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
980     return E_NOTIMPL;
981 }
982
983 static HRESULT WINAPI HTMLStyle_get_textIndent(IHTMLStyle *iface, VARIANT *p)
984 {
985     HTMLStyle *This = HTMLSTYLE_THIS(iface);
986     FIXME("(%p)->(%p)\n", This, p);
987     return E_NOTIMPL;
988 }
989
990 static HRESULT WINAPI HTMLStyle_put_lineHeight(IHTMLStyle *iface, VARIANT v)
991 {
992     HTMLStyle *This = HTMLSTYLE_THIS(iface);
993     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
994     return E_NOTIMPL;
995 }
996
997 static HRESULT WINAPI HTMLStyle_get_lineHeight(IHTMLStyle *iface, VARIANT *p)
998 {
999     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1000     FIXME("(%p)->(%p)\n", This, p);
1001     return E_NOTIMPL;
1002 }
1003
1004 static HRESULT WINAPI HTMLStyle_put_marginTop(IHTMLStyle *iface, VARIANT v)
1005 {
1006     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1007     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1008     return E_NOTIMPL;
1009 }
1010
1011 static HRESULT WINAPI HTMLStyle_get_marginTop(IHTMLStyle *iface, VARIANT *p)
1012 {
1013     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1014     FIXME("(%p)->(%p)\n", This, p);
1015     return E_NOTIMPL;
1016 }
1017
1018 static HRESULT WINAPI HTMLStyle_put_marginRight(IHTMLStyle *iface, VARIANT v)
1019 {
1020     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1021
1022     TRACE("(%p)->(v(%d))\n", This, V_VT(&v));
1023
1024     switch(V_VT(&v)) {
1025     case VT_NULL:
1026         return set_style_attr(This, STYLEID_MARGIN_RIGHT, emptyW, 0);
1027     case VT_I4: {
1028         WCHAR buf[14];
1029
1030         wsprintfW(buf, px_formatW, V_I4(&v));
1031         return set_style_attr(This, STYLEID_MARGIN_RIGHT, buf, 0);
1032     }
1033     case VT_BSTR:
1034         return set_style_attr(This, STYLEID_MARGIN_RIGHT, V_BSTR(&v), 0);
1035     default:
1036         FIXME("Unsupported vt=%d\n", V_VT(&v));
1037     }
1038
1039     return E_NOTIMPL;
1040 }
1041
1042 static HRESULT WINAPI HTMLStyle_get_marginRight(IHTMLStyle *iface, VARIANT *p)
1043 {
1044     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1045     FIXME("(%p)->(%p)\n", This, p);
1046     return E_NOTIMPL;
1047 }
1048
1049 static HRESULT WINAPI HTMLStyle_put_marginBottom(IHTMLStyle *iface, VARIANT v)
1050 {
1051     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1052     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1053     return E_NOTIMPL;
1054 }
1055
1056 static HRESULT WINAPI HTMLStyle_get_marginBottom(IHTMLStyle *iface, VARIANT *p)
1057 {
1058     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1059     FIXME("(%p)->(%p)\n", This, p);
1060     return E_NOTIMPL;
1061 }
1062
1063 static HRESULT WINAPI HTMLStyle_put_marginLeft(IHTMLStyle *iface, VARIANT v)
1064 {
1065     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1066
1067     switch(V_VT(&v)) {
1068     case VT_NULL:
1069         TRACE("(%p)->(NULL)\n", This);
1070         return set_style_attr(This, STYLEID_MARGIN_LEFT, emptyW, 0);
1071     case VT_I4: {
1072         WCHAR buf[14];
1073
1074         TRACE("(%p)->(%d)\n", This, V_I4(&v));
1075
1076         wsprintfW(buf, px_formatW, V_I4(&v));
1077         return set_style_attr(This, STYLEID_MARGIN_LEFT, buf, 0);
1078     }
1079     case VT_BSTR:
1080         TRACE("(%p)->(%s)\n", This, debugstr_w(V_BSTR(&v)));
1081         return set_style_attr(This, STYLEID_MARGIN_LEFT, V_BSTR(&v), 0);
1082     default:
1083         FIXME("Unsupported vt=%d\n", V_VT(&v));
1084     }
1085
1086     return E_NOTIMPL;
1087 }
1088
1089 static HRESULT WINAPI HTMLStyle_put_margin(IHTMLStyle *iface, BSTR v)
1090 {
1091     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1092
1093     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1094
1095     return set_style_attr(This, STYLEID_MARGIN, v, 0);
1096 }
1097
1098 static HRESULT WINAPI HTMLStyle_get_margin(IHTMLStyle *iface, BSTR *p)
1099 {
1100     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1101
1102     TRACE("(%p)->(%p)\n", This, p);
1103
1104     return get_style_attr(This, STYLEID_MARGIN, p);
1105 }
1106
1107 static HRESULT WINAPI HTMLStyle_get_marginLeft(IHTMLStyle *iface, VARIANT *p)
1108 {
1109     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1110     FIXME("(%p)->(%p)\n", This, p);
1111     return E_NOTIMPL;
1112 }
1113
1114 static HRESULT WINAPI HTMLStyle_put_paddingTop(IHTMLStyle *iface, VARIANT v)
1115 {
1116     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1117     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1118     return E_NOTIMPL;
1119 }
1120
1121 static HRESULT WINAPI HTMLStyle_get_paddingTop(IHTMLStyle *iface, VARIANT *p)
1122 {
1123     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1124     FIXME("(%p)->(%p)\n", This, p);
1125     return E_NOTIMPL;
1126 }
1127
1128 static HRESULT WINAPI HTMLStyle_put_paddingRight(IHTMLStyle *iface, VARIANT v)
1129 {
1130     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1131     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1132     return E_NOTIMPL;
1133 }
1134
1135 static HRESULT WINAPI HTMLStyle_get_paddingRight(IHTMLStyle *iface, VARIANT *p)
1136 {
1137     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1138     FIXME("(%p)->(%p)\n", This, p);
1139     return E_NOTIMPL;
1140 }
1141
1142 static HRESULT WINAPI HTMLStyle_put_paddingBottom(IHTMLStyle *iface, VARIANT v)
1143 {
1144     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1145     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1146     return E_NOTIMPL;
1147 }
1148
1149 static HRESULT WINAPI HTMLStyle_get_paddingBottom(IHTMLStyle *iface, VARIANT *p)
1150 {
1151     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1152     FIXME("(%p)->(%p)\n", This, p);
1153     return E_NOTIMPL;
1154 }
1155
1156 static HRESULT WINAPI HTMLStyle_put_paddingLeft(IHTMLStyle *iface, VARIANT v)
1157 {
1158     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1159
1160     TRACE("(%p)->(vt=%d)\n", This, V_VT(&v));
1161
1162     switch(V_VT(&v)) {
1163     case VT_I4: {
1164         WCHAR buf[14];
1165
1166         wsprintfW(buf, px_formatW, V_I4(&v));
1167         return set_style_attr(This, STYLEID_PADDING_LEFT, buf, 0);
1168     }
1169     case VT_BSTR:
1170         return set_style_attr(This, STYLEID_PADDING_LEFT, V_BSTR(&v), 0);
1171     default:
1172         FIXME("unsupported vt=%d\n", V_VT(&v));
1173     }
1174
1175     return E_NOTIMPL;
1176 }
1177
1178 static HRESULT WINAPI HTMLStyle_get_paddingLeft(IHTMLStyle *iface, VARIANT *p)
1179 {
1180     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1181     FIXME("(%p)->(%p)\n", This, p);
1182     return E_NOTIMPL;
1183 }
1184
1185 static HRESULT WINAPI HTMLStyle_put_padding(IHTMLStyle *iface, BSTR v)
1186 {
1187     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1188     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1189     return E_NOTIMPL;
1190 }
1191
1192 static HRESULT WINAPI HTMLStyle_get_padding(IHTMLStyle *iface, BSTR *p)
1193 {
1194     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1195     FIXME("(%p)->(%p)\n", This, p);
1196     return E_NOTIMPL;
1197 }
1198
1199 static HRESULT WINAPI HTMLStyle_put_border(IHTMLStyle *iface, BSTR v)
1200 {
1201     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1202
1203     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1204
1205     return set_style_attr(This, STYLEID_BORDER, v, 0);
1206 }
1207
1208 static HRESULT WINAPI HTMLStyle_get_border(IHTMLStyle *iface, BSTR *p)
1209 {
1210     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1211
1212     TRACE("(%p)->(%p)\n", This, p);
1213
1214     return get_style_attr(This, STYLEID_BORDER, p);
1215 }
1216
1217 static HRESULT WINAPI HTMLStyle_put_borderTop(IHTMLStyle *iface, BSTR v)
1218 {
1219     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1220     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1221     return E_NOTIMPL;
1222 }
1223
1224 static HRESULT WINAPI HTMLStyle_get_borderTop(IHTMLStyle *iface, BSTR *p)
1225 {
1226     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1227     FIXME("(%p)->(%p)\n", This, p);
1228     return E_NOTIMPL;
1229 }
1230
1231 static HRESULT WINAPI HTMLStyle_put_borderRight(IHTMLStyle *iface, BSTR v)
1232 {
1233     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1234     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1235     return E_NOTIMPL;
1236 }
1237
1238 static HRESULT WINAPI HTMLStyle_get_borderRight(IHTMLStyle *iface, BSTR *p)
1239 {
1240     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1241     FIXME("(%p)->(%p)\n", This, p);
1242     return E_NOTIMPL;
1243 }
1244
1245 static HRESULT WINAPI HTMLStyle_put_borderBottom(IHTMLStyle *iface, BSTR v)
1246 {
1247     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1248     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1249     return E_NOTIMPL;
1250 }
1251
1252 static HRESULT WINAPI HTMLStyle_get_borderBottom(IHTMLStyle *iface, BSTR *p)
1253 {
1254     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1255     FIXME("(%p)->(%p)\n", This, p);
1256     return E_NOTIMPL;
1257 }
1258
1259 static HRESULT WINAPI HTMLStyle_put_borderLeft(IHTMLStyle *iface, BSTR v)
1260 {
1261     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1262
1263     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1264
1265     return set_style_attr(This, STYLEID_BORDER_LEFT, v, ATTR_FIX_PX);
1266 }
1267
1268 static HRESULT WINAPI HTMLStyle_get_borderLeft(IHTMLStyle *iface, BSTR *p)
1269 {
1270     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1271     FIXME("(%p)->(%p)\n", This, p);
1272     return E_NOTIMPL;
1273 }
1274
1275 static HRESULT WINAPI HTMLStyle_put_borderColor(IHTMLStyle *iface, BSTR v)
1276 {
1277     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1278     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1279     return E_NOTIMPL;
1280 }
1281
1282 static HRESULT WINAPI HTMLStyle_get_borderColor(IHTMLStyle *iface, BSTR *p)
1283 {
1284     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1285     FIXME("(%p)->(%p)\n", This, p);
1286     return E_NOTIMPL;
1287 }
1288
1289 static HRESULT WINAPI HTMLStyle_put_borderTopColor(IHTMLStyle *iface, VARIANT v)
1290 {
1291     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1292     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1293     return E_NOTIMPL;
1294 }
1295
1296 static HRESULT WINAPI HTMLStyle_get_borderTopColor(IHTMLStyle *iface, VARIANT *p)
1297 {
1298     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1299     FIXME("(%p)->(%p)\n", This, p);
1300     return E_NOTIMPL;
1301 }
1302
1303 static HRESULT WINAPI HTMLStyle_put_borderRightColor(IHTMLStyle *iface, VARIANT v)
1304 {
1305     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1306     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1307     return E_NOTIMPL;
1308 }
1309
1310 static HRESULT WINAPI HTMLStyle_get_borderRightColor(IHTMLStyle *iface, VARIANT *p)
1311 {
1312     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1313     FIXME("(%p)->(%p)\n", This, p);
1314     return E_NOTIMPL;
1315 }
1316
1317 static HRESULT WINAPI HTMLStyle_put_borderBottomColor(IHTMLStyle *iface, VARIANT v)
1318 {
1319     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1320     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1321     return E_NOTIMPL;
1322 }
1323
1324 static HRESULT WINAPI HTMLStyle_get_borderBottomColor(IHTMLStyle *iface, VARIANT *p)
1325 {
1326     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1327     FIXME("(%p)->(%p)\n", This, p);
1328     return E_NOTIMPL;
1329 }
1330
1331 static HRESULT WINAPI HTMLStyle_put_borderLeftColor(IHTMLStyle *iface, VARIANT v)
1332 {
1333     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1334     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1335     return E_NOTIMPL;
1336 }
1337
1338 static HRESULT WINAPI HTMLStyle_get_borderLeftColor(IHTMLStyle *iface, VARIANT *p)
1339 {
1340     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1341     FIXME("(%p)->(%p)\n", This, p);
1342     return E_NOTIMPL;
1343 }
1344
1345 static HRESULT WINAPI HTMLStyle_put_borderWidth(IHTMLStyle *iface, BSTR v)
1346 {
1347     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1348     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1349     return set_style_attr(This, STYLEID_BORDER_WIDTH, v, ATTR_FIX_PX);
1350 }
1351
1352 static HRESULT WINAPI HTMLStyle_get_borderWidth(IHTMLStyle *iface, BSTR *p)
1353 {
1354     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1355     TRACE("(%p)->(%p)\n", This, p);
1356     return get_style_attr(This, STYLEID_BORDER_WIDTH, p);
1357 }
1358
1359 static HRESULT WINAPI HTMLStyle_put_borderTopWidth(IHTMLStyle *iface, VARIANT v)
1360 {
1361     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1362     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1363     return E_NOTIMPL;
1364 }
1365
1366 static HRESULT WINAPI HTMLStyle_get_borderTopWidth(IHTMLStyle *iface, VARIANT *p)
1367 {
1368     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1369     FIXME("(%p)->(%p)\n", This, p);
1370     return E_NOTIMPL;
1371 }
1372
1373 static HRESULT WINAPI HTMLStyle_put_borderRightWidth(IHTMLStyle *iface, VARIANT v)
1374 {
1375     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1376     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1377     return E_NOTIMPL;
1378 }
1379
1380 static HRESULT WINAPI HTMLStyle_get_borderRightWidth(IHTMLStyle *iface, VARIANT *p)
1381 {
1382     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1383     FIXME("(%p)->(%p)\n", This, p);
1384     return E_NOTIMPL;
1385 }
1386
1387 static HRESULT WINAPI HTMLStyle_put_borderBottomWidth(IHTMLStyle *iface, VARIANT v)
1388 {
1389     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1390     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1391     return E_NOTIMPL;
1392 }
1393
1394 static HRESULT WINAPI HTMLStyle_get_borderBottomWidth(IHTMLStyle *iface, VARIANT *p)
1395 {
1396     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1397     FIXME("(%p)->(%p)\n", This, p);
1398     return E_NOTIMPL;
1399 }
1400
1401 static HRESULT WINAPI HTMLStyle_put_borderLeftWidth(IHTMLStyle *iface, VARIANT v)
1402 {
1403     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1404     FIXME("(%p)->(v%d)\n", This, V_VT(&v));
1405     return E_NOTIMPL;
1406 }
1407
1408 static HRESULT WINAPI HTMLStyle_get_borderLeftWidth(IHTMLStyle *iface, VARIANT *p)
1409 {
1410     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1411     FIXME("(%p)->(%p)\n", This, p);
1412     return E_NOTIMPL;
1413 }
1414
1415 static HRESULT WINAPI HTMLStyle_put_borderStyle(IHTMLStyle *iface, BSTR v)
1416 {
1417     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1418     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1419     return E_NOTIMPL;
1420 }
1421
1422 static HRESULT WINAPI HTMLStyle_get_borderStyle(IHTMLStyle *iface, BSTR *p)
1423 {
1424     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1425     FIXME("(%p)->(%p)\n", This, p);
1426     return E_NOTIMPL;
1427 }
1428
1429 static HRESULT WINAPI HTMLStyle_put_borderTopStyle(IHTMLStyle *iface, BSTR v)
1430 {
1431     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1432     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1433     return E_NOTIMPL;
1434 }
1435
1436 static HRESULT WINAPI HTMLStyle_get_borderTopStyle(IHTMLStyle *iface, BSTR *p)
1437 {
1438     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1439     FIXME("(%p)->(%p)\n", This, p);
1440     return E_NOTIMPL;
1441 }
1442
1443 static HRESULT WINAPI HTMLStyle_put_borderRightStyle(IHTMLStyle *iface, BSTR v)
1444 {
1445     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1446     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1447     return E_NOTIMPL;
1448 }
1449
1450 static HRESULT WINAPI HTMLStyle_get_borderRightStyle(IHTMLStyle *iface, BSTR *p)
1451 {
1452     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1453     FIXME("(%p)->(%p)\n", This, p);
1454     return E_NOTIMPL;
1455 }
1456
1457 static HRESULT WINAPI HTMLStyle_put_borderBottomStyle(IHTMLStyle *iface, BSTR v)
1458 {
1459     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1460     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1461     return E_NOTIMPL;
1462 }
1463
1464 static HRESULT WINAPI HTMLStyle_get_borderBottomStyle(IHTMLStyle *iface, BSTR *p)
1465 {
1466     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1467     FIXME("(%p)->(%p)\n", This, p);
1468     return E_NOTIMPL;
1469 }
1470
1471 static HRESULT WINAPI HTMLStyle_put_borderLeftStyle(IHTMLStyle *iface, BSTR v)
1472 {
1473     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1474     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1475     return E_NOTIMPL;
1476 }
1477
1478 static HRESULT WINAPI HTMLStyle_get_borderLeftStyle(IHTMLStyle *iface, BSTR *p)
1479 {
1480     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1481     FIXME("(%p)->(%p)\n", This, p);
1482     return E_NOTIMPL;
1483 }
1484
1485 static HRESULT WINAPI HTMLStyle_put_width(IHTMLStyle *iface, VARIANT v)
1486 {
1487     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1488
1489     TRACE("(%p)->(v%d)\n", This, V_VT(&v));
1490
1491     switch(V_VT(&v)) {
1492     case VT_BSTR:
1493         TRACE("%s\n", debugstr_w(V_BSTR(&v)));
1494         return set_style_attr(This, STYLEID_WIDTH, V_BSTR(&v), 0);
1495     default:
1496         FIXME("unsupported vt %d\n", V_VT(&v));
1497     }
1498
1499     return E_NOTIMPL;
1500 }
1501
1502 static HRESULT WINAPI HTMLStyle_get_width(IHTMLStyle *iface, VARIANT *p)
1503 {
1504     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1505
1506     TRACE("(%p)->(%p)\n", This, p);
1507
1508     V_VT(p) = VT_BSTR;
1509     return get_style_attr(This, STYLEID_WIDTH, &V_BSTR(p));
1510 }
1511
1512 static HRESULT WINAPI HTMLStyle_put_height(IHTMLStyle *iface, VARIANT v)
1513 {
1514     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1515
1516     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1517
1518     switch(V_VT(&v)) {
1519     case VT_BSTR:
1520         return set_style_attr(This, STYLEID_HEIGHT, V_BSTR(&v), 0);
1521     default:
1522         FIXME("unimplemented vt %d\n", V_VT(&v));
1523         return E_NOTIMPL;
1524     }
1525
1526     return S_OK;
1527 }
1528
1529 static HRESULT WINAPI HTMLStyle_get_height(IHTMLStyle *iface, VARIANT *p)
1530 {
1531     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1532     BSTR ret;
1533     HRESULT hres;
1534
1535     TRACE("(%p)->(%p)\n", This, p);
1536
1537     hres = get_style_attr(This, STYLEID_HEIGHT, &ret);
1538     if(FAILED(hres))
1539         return hres;
1540
1541     V_VT(p) = VT_BSTR;
1542     V_BSTR(p) = ret;
1543     return S_OK;
1544 }
1545
1546 static HRESULT WINAPI HTMLStyle_put_styleFloat(IHTMLStyle *iface, BSTR v)
1547 {
1548     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1549     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1550     return E_NOTIMPL;
1551 }
1552
1553 static HRESULT WINAPI HTMLStyle_get_styleFloat(IHTMLStyle *iface, BSTR *p)
1554 {
1555     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1556     FIXME("(%p)->(%p)\n", This, p);
1557     return E_NOTIMPL;
1558 }
1559
1560 static HRESULT WINAPI HTMLStyle_put_clear(IHTMLStyle *iface, BSTR v)
1561 {
1562     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1563     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1564     return E_NOTIMPL;
1565 }
1566
1567 static HRESULT WINAPI HTMLStyle_get_clear(IHTMLStyle *iface, BSTR *p)
1568 {
1569     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1570     FIXME("(%p)->(%p)\n", This, p);
1571     return E_NOTIMPL;
1572 }
1573
1574 static HRESULT WINAPI HTMLStyle_put_display(IHTMLStyle *iface, BSTR v)
1575 {
1576     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1577
1578     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1579
1580     return set_style_attr(This, STYLEID_DISPLAY, v, 0);
1581 }
1582
1583 static HRESULT WINAPI HTMLStyle_get_display(IHTMLStyle *iface, BSTR *p)
1584 {
1585     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1586
1587     TRACE("(%p)->(%p)\n", This, p);
1588
1589     return get_style_attr(This, STYLEID_DISPLAY, p);
1590 }
1591
1592 static HRESULT WINAPI HTMLStyle_put_visibility(IHTMLStyle *iface, BSTR v)
1593 {
1594     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1595
1596     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1597
1598     return set_style_attr(This, STYLEID_VISIBILITY, v, 0);
1599 }
1600
1601 static HRESULT WINAPI HTMLStyle_get_visibility(IHTMLStyle *iface, BSTR *p)
1602 {
1603     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1604
1605     TRACE("(%p)->(%p)\n", This, p);
1606
1607     return get_style_attr(This, STYLEID_VISIBILITY, p);
1608 }
1609
1610 static HRESULT WINAPI HTMLStyle_put_listStyleType(IHTMLStyle *iface, BSTR v)
1611 {
1612     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1613     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1614     return E_NOTIMPL;
1615 }
1616
1617 static HRESULT WINAPI HTMLStyle_get_listStyleType(IHTMLStyle *iface, BSTR *p)
1618 {
1619     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1620     FIXME("(%p)->(%p)\n", This, p);
1621     return E_NOTIMPL;
1622 }
1623
1624 static HRESULT WINAPI HTMLStyle_put_listStylePosition(IHTMLStyle *iface, BSTR v)
1625 {
1626     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1627     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1628     return E_NOTIMPL;
1629 }
1630
1631 static HRESULT WINAPI HTMLStyle_get_listStylePosition(IHTMLStyle *iface, BSTR *p)
1632 {
1633     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1634     FIXME("(%p)->(%p)\n", This, p);
1635     return E_NOTIMPL;
1636 }
1637
1638 static HRESULT WINAPI HTMLStyle_put_listStyleImage(IHTMLStyle *iface, BSTR v)
1639 {
1640     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1641     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1642     return E_NOTIMPL;
1643 }
1644
1645 static HRESULT WINAPI HTMLStyle_get_listStyleImage(IHTMLStyle *iface, BSTR *p)
1646 {
1647     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1648     FIXME("(%p)->(%p)\n", This, p);
1649     return E_NOTIMPL;
1650 }
1651
1652 static HRESULT WINAPI HTMLStyle_put_listStyle(IHTMLStyle *iface, BSTR v)
1653 {
1654     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1655     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1656     return E_NOTIMPL;
1657 }
1658
1659 static HRESULT WINAPI HTMLStyle_get_listStyle(IHTMLStyle *iface, BSTR *p)
1660 {
1661     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1662     FIXME("(%p)->(%p)\n", This, p);
1663     return E_NOTIMPL;
1664 }
1665
1666 static HRESULT WINAPI HTMLStyle_put_whiteSpace(IHTMLStyle *iface, BSTR v)
1667 {
1668     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1669     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1670     return E_NOTIMPL;
1671 }
1672
1673 static HRESULT WINAPI HTMLStyle_get_whiteSpace(IHTMLStyle *iface, BSTR *p)
1674 {
1675     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1676     FIXME("(%p)->(%p)\n", This, p);
1677     return E_NOTIMPL;
1678 }
1679
1680 static HRESULT WINAPI HTMLStyle_put_top(IHTMLStyle *iface, VARIANT v)
1681 {
1682     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1683
1684     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1685
1686     return set_nsstyle_attr_var(This->nsstyle, STYLEID_TOP, &v, 0);
1687 }
1688
1689 static HRESULT WINAPI HTMLStyle_get_top(IHTMLStyle *iface, VARIANT *p)
1690 {
1691     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1692     BSTR ret;
1693     HRESULT hres;
1694
1695     TRACE("(%p)->(%p)\n", This, p);
1696
1697     hres = get_style_attr(This, STYLEID_TOP, &ret);
1698     if(FAILED(hres))
1699         return hres;
1700
1701     V_VT(p) = VT_BSTR;
1702     V_BSTR(p) = ret;
1703     return S_OK;
1704 }
1705
1706 static HRESULT WINAPI HTMLStyle_put_left(IHTMLStyle *iface, VARIANT v)
1707 {
1708     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1709
1710     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1711
1712     return set_nsstyle_attr_var(This->nsstyle, STYLEID_LEFT, &v, 0);
1713 }
1714
1715 static HRESULT WINAPI HTMLStyle_get_left(IHTMLStyle *iface, VARIANT *p)
1716 {
1717     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1718     BSTR ret;
1719     HRESULT hres;
1720
1721     TRACE("(%p)->(%p)\n", This, p);
1722
1723     hres = get_style_attr(This, STYLEID_LEFT, &ret);
1724     if(FAILED(hres))
1725         return hres;
1726
1727     V_VT(p) = VT_BSTR;
1728     V_BSTR(p) = ret;
1729     return S_OK;
1730 }
1731
1732 static HRESULT WINAPI HTMLStyle_get_position(IHTMLStyle *iface, BSTR *p)
1733 {
1734     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1735     FIXME("(%p)->(%p)\n", This, p);
1736     return E_NOTIMPL;
1737 }
1738
1739 static HRESULT WINAPI HTMLStyle_put_zIndex(IHTMLStyle *iface, VARIANT v)
1740 {
1741     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1742
1743     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1744
1745     switch(V_VT(&v)) {
1746     case VT_BSTR:
1747         return set_style_attr(This, STYLEID_Z_INDEX, V_BSTR(&v), 0);
1748     case VT_I4: {
1749         WCHAR value[14];
1750         static const WCHAR format[] = {'%','d',0};
1751
1752         wsprintfW(value, format, V_I4(&v));
1753         return set_style_attr(This, STYLEID_Z_INDEX, value, 0);
1754     }
1755     default:
1756         FIXME("unimplemented vt %d\n", V_VT(&v));
1757         return E_NOTIMPL;
1758     }
1759
1760     return S_OK;
1761 }
1762
1763 static HRESULT WINAPI HTMLStyle_get_zIndex(IHTMLStyle *iface, VARIANT *p)
1764 {
1765     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1766
1767     TRACE("(%p)->(%p)\n", This, p);
1768
1769     return get_nsstyle_attr_var(This->nsstyle, STYLEID_Z_INDEX, p, ATTR_STR_TO_INT);
1770 }
1771
1772 static HRESULT WINAPI HTMLStyle_put_overflow(IHTMLStyle *iface, BSTR v)
1773 {
1774     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1775     static const WCHAR szVisible[] = {'v','i','s','i','b','l','e',0};
1776     static const WCHAR szScroll[]  = {'s','c','r','o','l','l',0};
1777     static const WCHAR szHidden[]  = {'h','i','d','d','e','n',0};
1778     static const WCHAR szAuto[]    = {'a','u','t','o',0};
1779
1780     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1781
1782     /* overflow can only be one of the follow values. */
1783     if(!v || strcmpiW(szVisible, v) == 0 || strcmpiW(szScroll, v) == 0 ||
1784              strcmpiW(szHidden, v) == 0  || strcmpiW(szAuto, v) == 0)
1785     {
1786         return set_nsstyle_attr(This->nsstyle, STYLEID_OVERFLOW, v, 0);
1787     }
1788
1789     return E_INVALIDARG;
1790 }
1791
1792
1793 static HRESULT WINAPI HTMLStyle_get_overflow(IHTMLStyle *iface, BSTR *p)
1794 {
1795     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1796
1797     TRACE("(%p)->(%p)\n", This, p);
1798
1799     if(!p)
1800        return E_INVALIDARG;
1801
1802     return get_style_attr(This, STYLEID_OVERFLOW, p);
1803 }
1804
1805 static HRESULT WINAPI HTMLStyle_put_pageBreakBefore(IHTMLStyle *iface, BSTR v)
1806 {
1807     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1808     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1809     return E_NOTIMPL;
1810 }
1811
1812 static HRESULT WINAPI HTMLStyle_get_pageBreakBefore(IHTMLStyle *iface, BSTR *p)
1813 {
1814     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1815     FIXME("(%p)->(%p)\n", This, p);
1816     return E_NOTIMPL;
1817 }
1818
1819 static HRESULT WINAPI HTMLStyle_put_pageBreakAfter(IHTMLStyle *iface, BSTR v)
1820 {
1821     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1822     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1823     return E_NOTIMPL;
1824 }
1825
1826 static HRESULT WINAPI HTMLStyle_get_pageBreakAfter(IHTMLStyle *iface, BSTR *p)
1827 {
1828     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1829     FIXME("(%p)->(%p)\n", This, p);
1830     return E_NOTIMPL;
1831 }
1832
1833 static HRESULT WINAPI HTMLStyle_put_cssText(IHTMLStyle *iface, BSTR v)
1834 {
1835     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1836     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1837     return E_NOTIMPL;
1838 }
1839
1840 static HRESULT WINAPI HTMLStyle_get_cssText(IHTMLStyle *iface, BSTR *p)
1841 {
1842     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1843     FIXME("(%p)->(%p)\n", This, p);
1844     return E_NOTIMPL;
1845 }
1846
1847 static HRESULT WINAPI HTMLStyle_put_pixelTop(IHTMLStyle *iface, long v)
1848 {
1849     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1850     FIXME("(%p)->()\n", This);
1851     return E_NOTIMPL;
1852 }
1853
1854 static HRESULT WINAPI HTMLStyle_get_pixelTop(IHTMLStyle *iface, long *p)
1855 {
1856     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1857     FIXME("(%p)->()\n", This);
1858     return E_NOTIMPL;
1859 }
1860
1861 static HRESULT WINAPI HTMLStyle_put_pixelLeft(IHTMLStyle *iface, long v)
1862 {
1863     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1864     FIXME("(%p)->()\n", This);
1865     return E_NOTIMPL;
1866 }
1867
1868 static HRESULT WINAPI HTMLStyle_get_pixelLeft(IHTMLStyle *iface, long *p)
1869 {
1870     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1871     FIXME("(%p)->()\n", This);
1872     return E_NOTIMPL;
1873 }
1874
1875 static HRESULT WINAPI HTMLStyle_put_pixelWidth(IHTMLStyle *iface, long v)
1876 {
1877     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1878     FIXME("(%p)->()\n", This);
1879     return E_NOTIMPL;
1880 }
1881
1882 static HRESULT WINAPI HTMLStyle_get_pixelWidth(IHTMLStyle *iface, long *p)
1883 {
1884     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1885     FIXME("(%p)->()\n", This);
1886     return E_NOTIMPL;
1887 }
1888
1889 static HRESULT WINAPI HTMLStyle_put_pixelHeight(IHTMLStyle *iface, long v)
1890 {
1891     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1892     FIXME("(%p)->()\n", This);
1893     return E_NOTIMPL;
1894 }
1895
1896 static HRESULT WINAPI HTMLStyle_get_pixelHeight(IHTMLStyle *iface, long *p)
1897 {
1898     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1899     FIXME("(%p)->()\n", This);
1900     return E_NOTIMPL;
1901 }
1902
1903 static HRESULT WINAPI HTMLStyle_put_posTop(IHTMLStyle *iface, float v)
1904 {
1905     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1906
1907     TRACE("(%p)->(%f)\n", This, v);
1908
1909     return set_style_pos(This, STYLEID_TOP, v);
1910 }
1911
1912 static HRESULT WINAPI HTMLStyle_get_posTop(IHTMLStyle *iface, float *p)
1913 {
1914     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1915
1916     TRACE("(%p)->(%p)\n", This, p);
1917
1918     if(!p)
1919         return E_POINTER;
1920
1921     return get_nsstyle_pos(This, STYLEID_TOP, p);
1922 }
1923
1924 static HRESULT WINAPI HTMLStyle_put_posLeft(IHTMLStyle *iface, float v)
1925 {
1926     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1927
1928     TRACE("(%p)->(%f)\n", This, v);
1929
1930     return set_style_pos(This, STYLEID_LEFT, v);
1931 }
1932
1933 static HRESULT WINAPI HTMLStyle_get_posLeft(IHTMLStyle *iface, float *p)
1934 {
1935     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1936
1937     TRACE("(%p)->(%p)\n", This, p);
1938
1939     if(!p)
1940         return E_POINTER;
1941
1942     return get_nsstyle_pos(This, STYLEID_LEFT, p);
1943 }
1944
1945 static HRESULT WINAPI HTMLStyle_put_posWidth(IHTMLStyle *iface, float v)
1946 {
1947     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1948
1949     TRACE("(%p)->(%f)\n", This, v);
1950
1951     return set_style_pos(This, STYLEID_WIDTH, v);
1952 }
1953
1954 static HRESULT WINAPI HTMLStyle_get_posWidth(IHTMLStyle *iface, float *p)
1955 {
1956     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1957
1958     TRACE("(%p)->(%p)\n", This, p);
1959
1960     if(!p)
1961         return E_POINTER;
1962
1963     if(get_nsstyle_pos(This, STYLEID_WIDTH, p) != S_OK)
1964         *p = 0.0f;
1965
1966     return S_OK;
1967 }
1968
1969 static HRESULT WINAPI HTMLStyle_put_posHeight(IHTMLStyle *iface, float v)
1970 {
1971     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1972
1973     TRACE("(%p)->(%f)\n", This, v);
1974
1975     return set_style_pos(This, STYLEID_HEIGHT, v);
1976 }
1977
1978 static HRESULT WINAPI HTMLStyle_get_posHeight(IHTMLStyle *iface, float *p)
1979 {
1980     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1981
1982     TRACE("(%p)->(%p)\n", This, p);
1983
1984     if(!p)
1985         return E_POINTER;
1986
1987     if(get_nsstyle_pos(This, STYLEID_HEIGHT, p) != S_OK)
1988         *p = 0.0f;
1989
1990     return S_OK;
1991 }
1992
1993 static HRESULT WINAPI HTMLStyle_put_cursor(IHTMLStyle *iface, BSTR v)
1994 {
1995     HTMLStyle *This = HTMLSTYLE_THIS(iface);
1996
1997     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1998
1999     return set_style_attr(This, STYLEID_CURSOR, v, 0);
2000 }
2001
2002 static HRESULT WINAPI HTMLStyle_get_cursor(IHTMLStyle *iface, BSTR *p)
2003 {
2004     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2005
2006     TRACE("(%p)->(%p)\n", This, p);
2007
2008     return get_style_attr(This, STYLEID_CURSOR, p);
2009 }
2010
2011 static HRESULT WINAPI HTMLStyle_put_clip(IHTMLStyle *iface, BSTR v)
2012 {
2013     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2014     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
2015     return E_NOTIMPL;
2016 }
2017
2018 static HRESULT WINAPI HTMLStyle_get_clip(IHTMLStyle *iface, BSTR *p)
2019 {
2020     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2021     FIXME("(%p)->(%p)\n", This, p);
2022     return E_NOTIMPL;
2023 }
2024
2025 static HRESULT WINAPI HTMLStyle_put_filter(IHTMLStyle *iface, BSTR v)
2026 {
2027     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2028
2029     WARN("(%p)->(%s)\n", This, debugstr_w(v));
2030
2031     /* FIXME: Handle MS-style filters */
2032     return set_style_attr(This, STYLEID_FILTER, v, 0);
2033 }
2034
2035 static HRESULT WINAPI HTMLStyle_get_filter(IHTMLStyle *iface, BSTR *p)
2036 {
2037     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2038
2039     WARN("(%p)->(%p)\n", This, p);
2040
2041     /* FIXME: Handle MS-style filters */
2042     return get_style_attr(This, STYLEID_FILTER, p);
2043 }
2044
2045 static HRESULT WINAPI HTMLStyle_setAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2046         VARIANT AttributeValue, LONG lFlags)
2047 {
2048     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2049     FIXME("(%p)->(%s v%d %08x)\n", This, debugstr_w(strAttributeName),
2050           V_VT(&AttributeValue), lFlags);
2051     return E_NOTIMPL;
2052 }
2053
2054 static HRESULT WINAPI HTMLStyle_getAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2055         LONG lFlags, VARIANT *AttributeValue)
2056 {
2057     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2058     FIXME("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName),
2059          lFlags, AttributeValue);
2060     return E_NOTIMPL;
2061 }
2062
2063 static HRESULT WINAPI HTMLStyle_removeAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2064                                                 LONG lFlags, VARIANT_BOOL *pfSuccess)
2065 {
2066     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2067     FIXME("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName),
2068          lFlags, pfSuccess);
2069     return E_NOTIMPL;
2070 }
2071
2072 static HRESULT WINAPI HTMLStyle_toString(IHTMLStyle *iface, BSTR *String)
2073 {
2074     HTMLStyle *This = HTMLSTYLE_THIS(iface);
2075     FIXME("(%p)->(%p)\n", This, String);
2076     return E_NOTIMPL;
2077 }
2078
2079 static HRESULT HTMLStyle_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid)
2080 {
2081     int c, i, min=0, max = sizeof(style_tbl)/sizeof(*style_tbl)-1;
2082
2083     while(min <= max) {
2084         i = (min+max)/2;
2085
2086         c = strcmpW(style_tbl[i].name, name);
2087         if(!c) {
2088             *dispid = style_tbl[i].dispid;
2089             return S_OK;
2090         }
2091
2092         if(c > 0)
2093             max = i-1;
2094         else
2095             min = i+1;
2096     }
2097
2098     return DISP_E_UNKNOWNNAME;
2099 }
2100
2101 static const IHTMLStyleVtbl HTMLStyleVtbl = {
2102     HTMLStyle_QueryInterface,
2103     HTMLStyle_AddRef,
2104     HTMLStyle_Release,
2105     HTMLStyle_GetTypeInfoCount,
2106     HTMLStyle_GetTypeInfo,
2107     HTMLStyle_GetIDsOfNames,
2108     HTMLStyle_Invoke,
2109     HTMLStyle_put_fontFamily,
2110     HTMLStyle_get_fontFamily,
2111     HTMLStyle_put_fontStyle,
2112     HTMLStyle_get_fontStyle,
2113     HTMLStyle_put_fontVariant,
2114     HTMLStyle_get_fontVariant,
2115     HTMLStyle_put_fontWeight,
2116     HTMLStyle_get_fontWeight,
2117     HTMLStyle_put_fontSize,
2118     HTMLStyle_get_fontSize,
2119     HTMLStyle_put_font,
2120     HTMLStyle_get_font,
2121     HTMLStyle_put_color,
2122     HTMLStyle_get_color,
2123     HTMLStyle_put_background,
2124     HTMLStyle_get_background,
2125     HTMLStyle_put_backgroundColor,
2126     HTMLStyle_get_backgroundColor,
2127     HTMLStyle_put_backgroundImage,
2128     HTMLStyle_get_backgroundImage,
2129     HTMLStyle_put_backgroundRepeat,
2130     HTMLStyle_get_backgroundRepeat,
2131     HTMLStyle_put_backgroundAttachment,
2132     HTMLStyle_get_backgroundAttachment,
2133     HTMLStyle_put_backgroundPosition,
2134     HTMLStyle_get_backgroundPosition,
2135     HTMLStyle_put_backgroundPositionX,
2136     HTMLStyle_get_backgroundPositionX,
2137     HTMLStyle_put_backgroundPositionY,
2138     HTMLStyle_get_backgroundPositionY,
2139     HTMLStyle_put_wordSpacing,
2140     HTMLStyle_get_wordSpacing,
2141     HTMLStyle_put_letterSpacing,
2142     HTMLStyle_get_letterSpacing,
2143     HTMLStyle_put_textDecoration,
2144     HTMLStyle_get_textDecoration,
2145     HTMLStyle_put_textDecorationNone,
2146     HTMLStyle_get_textDecorationNone,
2147     HTMLStyle_put_textDecorationUnderline,
2148     HTMLStyle_get_textDecorationUnderline,
2149     HTMLStyle_put_textDecorationOverline,
2150     HTMLStyle_get_textDecorationOverline,
2151     HTMLStyle_put_textDecorationLineThrough,
2152     HTMLStyle_get_textDecorationLineThrough,
2153     HTMLStyle_put_textDecorationBlink,
2154     HTMLStyle_get_textDecorationBlink,
2155     HTMLStyle_put_verticalAlign,
2156     HTMLStyle_get_verticalAlign,
2157     HTMLStyle_put_textTransform,
2158     HTMLStyle_get_textTransform,
2159     HTMLStyle_put_textAlign,
2160     HTMLStyle_get_textAlign,
2161     HTMLStyle_put_textIndent,
2162     HTMLStyle_get_textIndent,
2163     HTMLStyle_put_lineHeight,
2164     HTMLStyle_get_lineHeight,
2165     HTMLStyle_put_marginTop,
2166     HTMLStyle_get_marginTop,
2167     HTMLStyle_put_marginRight,
2168     HTMLStyle_get_marginRight,
2169     HTMLStyle_put_marginBottom,
2170     HTMLStyle_get_marginBottom,
2171     HTMLStyle_put_marginLeft,
2172     HTMLStyle_get_marginLeft,
2173     HTMLStyle_put_margin,
2174     HTMLStyle_get_margin,
2175     HTMLStyle_put_paddingTop,
2176     HTMLStyle_get_paddingTop,
2177     HTMLStyle_put_paddingRight,
2178     HTMLStyle_get_paddingRight,
2179     HTMLStyle_put_paddingBottom,
2180     HTMLStyle_get_paddingBottom,
2181     HTMLStyle_put_paddingLeft,
2182     HTMLStyle_get_paddingLeft,
2183     HTMLStyle_put_padding,
2184     HTMLStyle_get_padding,
2185     HTMLStyle_put_border,
2186     HTMLStyle_get_border,
2187     HTMLStyle_put_borderTop,
2188     HTMLStyle_get_borderTop,
2189     HTMLStyle_put_borderRight,
2190     HTMLStyle_get_borderRight,
2191     HTMLStyle_put_borderBottom,
2192     HTMLStyle_get_borderBottom,
2193     HTMLStyle_put_borderLeft,
2194     HTMLStyle_get_borderLeft,
2195     HTMLStyle_put_borderColor,
2196     HTMLStyle_get_borderColor,
2197     HTMLStyle_put_borderTopColor,
2198     HTMLStyle_get_borderTopColor,
2199     HTMLStyle_put_borderRightColor,
2200     HTMLStyle_get_borderRightColor,
2201     HTMLStyle_put_borderBottomColor,
2202     HTMLStyle_get_borderBottomColor,
2203     HTMLStyle_put_borderLeftColor,
2204     HTMLStyle_get_borderLeftColor,
2205     HTMLStyle_put_borderWidth,
2206     HTMLStyle_get_borderWidth,
2207     HTMLStyle_put_borderTopWidth,
2208     HTMLStyle_get_borderTopWidth,
2209     HTMLStyle_put_borderRightWidth,
2210     HTMLStyle_get_borderRightWidth,
2211     HTMLStyle_put_borderBottomWidth,
2212     HTMLStyle_get_borderBottomWidth,
2213     HTMLStyle_put_borderLeftWidth,
2214     HTMLStyle_get_borderLeftWidth,
2215     HTMLStyle_put_borderStyle,
2216     HTMLStyle_get_borderStyle,
2217     HTMLStyle_put_borderTopStyle,
2218     HTMLStyle_get_borderTopStyle,
2219     HTMLStyle_put_borderRightStyle,
2220     HTMLStyle_get_borderRightStyle,
2221     HTMLStyle_put_borderBottomStyle,
2222     HTMLStyle_get_borderBottomStyle,
2223     HTMLStyle_put_borderLeftStyle,
2224     HTMLStyle_get_borderLeftStyle,
2225     HTMLStyle_put_width,
2226     HTMLStyle_get_width,
2227     HTMLStyle_put_height,
2228     HTMLStyle_get_height,
2229     HTMLStyle_put_styleFloat,
2230     HTMLStyle_get_styleFloat,
2231     HTMLStyle_put_clear,
2232     HTMLStyle_get_clear,
2233     HTMLStyle_put_display,
2234     HTMLStyle_get_display,
2235     HTMLStyle_put_visibility,
2236     HTMLStyle_get_visibility,
2237     HTMLStyle_put_listStyleType,
2238     HTMLStyle_get_listStyleType,
2239     HTMLStyle_put_listStylePosition,
2240     HTMLStyle_get_listStylePosition,
2241     HTMLStyle_put_listStyleImage,
2242     HTMLStyle_get_listStyleImage,
2243     HTMLStyle_put_listStyle,
2244     HTMLStyle_get_listStyle,
2245     HTMLStyle_put_whiteSpace,
2246     HTMLStyle_get_whiteSpace,
2247     HTMLStyle_put_top,
2248     HTMLStyle_get_top,
2249     HTMLStyle_put_left,
2250     HTMLStyle_get_left,
2251     HTMLStyle_get_position,
2252     HTMLStyle_put_zIndex,
2253     HTMLStyle_get_zIndex,
2254     HTMLStyle_put_overflow,
2255     HTMLStyle_get_overflow,
2256     HTMLStyle_put_pageBreakBefore,
2257     HTMLStyle_get_pageBreakBefore,
2258     HTMLStyle_put_pageBreakAfter,
2259     HTMLStyle_get_pageBreakAfter,
2260     HTMLStyle_put_cssText,
2261     HTMLStyle_get_cssText,
2262     HTMLStyle_put_pixelTop,
2263     HTMLStyle_get_pixelTop,
2264     HTMLStyle_put_pixelLeft,
2265     HTMLStyle_get_pixelLeft,
2266     HTMLStyle_put_pixelWidth,
2267     HTMLStyle_get_pixelWidth,
2268     HTMLStyle_put_pixelHeight,
2269     HTMLStyle_get_pixelHeight,
2270     HTMLStyle_put_posTop,
2271     HTMLStyle_get_posTop,
2272     HTMLStyle_put_posLeft,
2273     HTMLStyle_get_posLeft,
2274     HTMLStyle_put_posWidth,
2275     HTMLStyle_get_posWidth,
2276     HTMLStyle_put_posHeight,
2277     HTMLStyle_get_posHeight,
2278     HTMLStyle_put_cursor,
2279     HTMLStyle_get_cursor,
2280     HTMLStyle_put_clip,
2281     HTMLStyle_get_clip,
2282     HTMLStyle_put_filter,
2283     HTMLStyle_get_filter,
2284     HTMLStyle_setAttribute,
2285     HTMLStyle_getAttribute,
2286     HTMLStyle_removeAttribute,
2287     HTMLStyle_toString
2288 };
2289
2290 static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = {
2291     HTMLStyle_get_dispid,
2292     NULL
2293 };
2294
2295 static const tid_t HTMLStyle_iface_tids[] = {
2296     IHTMLStyle_tid,
2297     IHTMLStyle2_tid,
2298     0
2299 };
2300 static dispex_static_data_t HTMLStyle_dispex = {
2301     &HTMLStyle_dispex_vtbl,
2302     DispHTMLStyle_tid,
2303     NULL,
2304     HTMLStyle_iface_tids
2305 };
2306
2307 IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle)
2308 {
2309     HTMLStyle *ret = heap_alloc_zero(sizeof(HTMLStyle));
2310
2311     ret->lpHTMLStyleVtbl = &HTMLStyleVtbl;
2312     ret->ref = 1;
2313     ret->nsstyle = nsstyle;
2314     HTMLStyle2_Init(ret);
2315
2316     nsIDOMCSSStyleDeclaration_AddRef(nsstyle);
2317
2318     init_dispex(&ret->dispex, (IUnknown*)HTMLSTYLE(ret),  &HTMLStyle_dispex);
2319
2320     return HTMLSTYLE(ret);
2321 }