diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 272b6443f80..a137b567a57 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -207,6 +207,17 @@ static const WCHAR word_wrapW[] =
static const WCHAR z_indexW[] =
{'z','-','i','n','d','e','x',0};
+static const WCHAR italicW[] = {'i','t','a','l','i','c',0};
+static const WCHAR normalW[] = {'n','o','r','m','a','l',0};
+static const WCHAR obliqueW[] = {'o','b','l','i','q','u','e',0};
+
+static const WCHAR *font_style_values[] = {
+ italicW,
+ normalW,
+ obliqueW,
+ NULL
+};
+
#define ATTR_FIX_PX 0x0001
#define ATTR_FIX_URL 0x0002
#define ATTR_STR_TO_INT 0x0004
@@ -220,6 +231,7 @@ typedef struct {
const WCHAR *name;
DISPID dispid;
unsigned flags;
+ const WCHAR **allowed_values;
} style_tbl_entry_t;
static const style_tbl_entry_t style_tbl[] = {
@@ -263,7 +275,7 @@ static const style_tbl_entry_t style_tbl[] = {
{floatW, DISPID_IHTMLSTYLE_STYLEFLOAT},
{font_familyW, DISPID_IHTMLSTYLE_FONTFAMILY},
{font_sizeW, DISPID_IHTMLSTYLE_FONTSIZE, ATTR_FIX_PX},
- {font_styleW, DISPID_IHTMLSTYLE_FONTSTYLE},
+ {font_styleW, DISPID_IHTMLSTYLE_FONTSTYLE, 0, font_style_values},
{font_variantW, DISPID_IHTMLSTYLE_FONTVARIANT},
{font_weightW, DISPID_IHTMLSTYLE_FONTWEIGHT, ATTR_STR_TO_INT},
{heightW, DISPID_IHTMLSTYLE_HEIGHT, ATTR_FIX_PX},
@@ -316,8 +328,6 @@ static const WCHAR valLineThrough[] =
{'l','i','n','e','-','t','h','r','o','u','g','h',0};
static const WCHAR valUnderline[] =
{'u','n','d','e','r','l','i','n','e',0};
-static const WCHAR szNormal[] =
- {'n','o','r','m','a','l',0};
static const WCHAR styleNone[] =
{'n','o','n','e',0};
static const WCHAR valOverline[] =
@@ -408,17 +418,31 @@ static LPWSTR fix_url_value(LPCWSTR val)
return ret;
}
-static HRESULT set_nsstyle_property(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, const WCHAR *value, unsigned flags)
+static HRESULT set_nsstyle_property(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, const WCHAR *value)
{
nsAString str_name, str_value, str_empty;
LPWSTR val = NULL;
nsresult nsres;
+ HRESULT hres = S_OK;
if(value) {
+ unsigned flags = style_tbl[sid].flags;
if(flags & ATTR_FIX_PX)
val = fix_px_value(value);
else if(flags & ATTR_FIX_URL)
val = fix_url_value(value);
+
+ if(style_tbl[sid].allowed_values) {
+ const WCHAR **iter;
+ for(iter = style_tbl[sid].allowed_values; *iter; iter++) {
+ if(!strcmpiW(*iter, value))
+ break;
+ }
+ if(!*iter) {
+ hres = E_INVALIDARG;
+ value = emptyW;
+ }
+ }
}
nsAString_InitDepend(&str_name, style_tbl[sid].name);
@@ -434,7 +458,7 @@ static HRESULT set_nsstyle_property(nsIDOMCSSStyleDeclaration *nsstyle, styleid_
nsAString_Finish(&str_empty);
heap_free(val);
- return S_OK;
+ return hres;
}
static HRESULT var_to_styleval(const VARIANT *v, styleid_t sid, WCHAR *buf, const WCHAR **ret)
@@ -477,21 +501,19 @@ static HRESULT var_to_styleval(const VARIANT *v, styleid_t sid, WCHAR *buf, cons
static HRESULT set_style_property_var(HTMLStyle *style, styleid_t sid, VARIANT *value)
{
const WCHAR *val;
- unsigned flags;
WCHAR buf[14];
HRESULT hres;
- flags = style_tbl[sid].flags;
hres = var_to_styleval(value, sid, buf, &val);
if(FAILED(hres))
return hres;
- return set_nsstyle_property(style->nsstyle, sid, val, flags);
+ return set_nsstyle_property(style->nsstyle, sid, val);
}
static inline HRESULT set_style_property(HTMLStyle *style, styleid_t sid, const WCHAR *value)
{
- return set_nsstyle_property(style->nsstyle, sid, value, style_tbl[sid].flags);
+ return set_nsstyle_property(style->nsstyle, sid, value);
}
static HRESULT get_nsstyle_attr_nsval(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, nsAString *value)
@@ -885,19 +907,10 @@ static HRESULT WINAPI HTMLStyle_get_fontFamily(IHTMLStyle *iface, BSTR *p)
static HRESULT WINAPI HTMLStyle_put_fontStyle(IHTMLStyle *iface, BSTR v)
{
HTMLStyle *This = impl_from_IHTMLStyle(iface);
- static const WCHAR szItalic[] = {'i','t','a','l','i','c',0};
- static const WCHAR szOblique[] = {'o','b','l','i','q','u','e',0};
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
- /* fontStyle can only be one of the follow values. */
- if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szItalic, v) == 0 ||
- strcmpiW(szOblique, v) == 0)
- {
- return set_style_property(This, STYLEID_FONT_STYLE, v);
- }
-
- return E_INVALIDARG;
+ return set_style_property(This, STYLEID_FONT_STYLE, v);
}
static HRESULT WINAPI HTMLStyle_get_fontStyle(IHTMLStyle *iface, BSTR *p)
@@ -917,7 +930,7 @@ static HRESULT WINAPI HTMLStyle_put_fontVariant(IHTMLStyle *iface, BSTR v)
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
/* fontVariant can only be one of the follow values. */
- if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szCaps, v) == 0)
+ if(!v || strcmpiW(normalW, v) == 0 || strcmpiW(szCaps, v) == 0)
{
return set_style_property(This, STYLEID_FONT_VARIANT, v);
}
@@ -955,7 +968,7 @@ static HRESULT WINAPI HTMLStyle_put_fontWeight(IHTMLStyle *iface, BSTR v)
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
/* fontWeight can only be one of the following */
- if(v && *v && strcmpiW(szNormal, v) && strcmpiW(styleBold, v) && strcmpiW(styleBolder, v)
+ if(v && *v && strcmpiW(normalW, v) && strcmpiW(styleBold, v) && strcmpiW(styleBolder, v)
&& strcmpiW(styleLighter, v) && strcmpiW(style100, v) && strcmpiW(style200, v)
&& strcmpiW(style300, v) && strcmpiW(style400, v) && strcmpiW(style500, v) && strcmpiW(style600, v)
&& strcmpiW(style700, v) && strcmpiW(style800, v) && strcmpiW(style900, v))
@@ -4795,7 +4808,7 @@ HRESULT set_elem_style(HTMLElement *elem, styleid_t styleid, const WCHAR *val)
if(FAILED(hres))
return hres;
- hres = set_nsstyle_property(style, styleid, val, 0);
+ hres = set_nsstyle_property(style, styleid, val);
nsIDOMCSSStyleDeclaration_Release(style);
return hres;
}