mshtml: Return nsAString from var_to_styleval.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
983774e3fa
commit
f0497aac0b
|
@ -931,41 +931,45 @@ static HRESULT set_nsstyle_property(nsIDOMCSSStyleDeclaration *nsstyle, styleid_
|
||||||
return map_nsresult(nsres);
|
return map_nsresult(nsres);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT var_to_styleval(CSSStyle *style, const VARIANT *v, const style_tbl_entry_t *entry, WCHAR *buf, const WCHAR **ret)
|
static HRESULT var_to_styleval(CSSStyle *style, VARIANT *v, const style_tbl_entry_t *entry, nsAString *nsstr)
|
||||||
{
|
{
|
||||||
|
unsigned flags = entry && dispex_compat_mode(&style->dispex) < COMPAT_MODE_IE9
|
||||||
|
? entry->flags : 0;
|
||||||
|
|
||||||
switch(V_VT(v)) {
|
switch(V_VT(v)) {
|
||||||
case VT_NULL:
|
case VT_NULL:
|
||||||
*ret = emptyW;
|
nsAString_InitDepend(nsstr, NULL);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
case VT_BSTR:
|
case VT_BSTR:
|
||||||
*ret = V_BSTR(v);
|
nsAString_InitDepend(nsstr, V_BSTR(v));
|
||||||
return S_OK;
|
break;
|
||||||
|
|
||||||
case VT_BSTR|VT_BYREF:
|
case VT_BSTR|VT_BYREF:
|
||||||
*ret = *V_BSTRREF(v);
|
nsAString_InitDepend(nsstr, *V_BSTRREF(v));
|
||||||
return S_OK;
|
break;
|
||||||
|
|
||||||
case VT_I4: {
|
case VT_I4: {
|
||||||
unsigned flags = entry && dispex_compat_mode(&style->dispex) < COMPAT_MODE_IE9 ? entry->flags : 0;
|
|
||||||
static const WCHAR formatW[] = {'%','d',0};
|
static const WCHAR formatW[] = {'%','d',0};
|
||||||
static const WCHAR hex_formatW[] = {'#','%','0','6','x',0};
|
static const WCHAR hex_formatW[] = {'#','%','0','6','x',0};
|
||||||
|
WCHAR buf[14];
|
||||||
|
|
||||||
if(flags & ATTR_HEX_INT)
|
if(flags & ATTR_HEX_INT)
|
||||||
wsprintfW(buf, hex_formatW, V_I4(v));
|
wsprintfW(buf, hex_formatW, V_I4(v));
|
||||||
else if(flags & ATTR_FIX_PX)
|
|
||||||
wsprintfW(buf, px_formatW, V_I4(v));
|
|
||||||
else
|
else
|
||||||
wsprintfW(buf, formatW, V_I4(v));
|
wsprintfW(buf, formatW, V_I4(v));
|
||||||
|
|
||||||
*ret = buf;
|
nsAString_Init(nsstr, buf);
|
||||||
return S_OK;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
FIXME("not implemented for %s\n", debugstr_variant(v));
|
FIXME("not implemented for %s\n", debugstr_variant(v));
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if(flags & ATTR_FIX_PX)
|
||||||
|
fix_px_value(nsstr);
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline HRESULT set_style_property(CSSStyle *style, styleid_t sid, const WCHAR *value)
|
static inline HRESULT set_style_property(CSSStyle *style, styleid_t sid, const WCHAR *value)
|
||||||
|
@ -1008,15 +1012,16 @@ static inline HRESULT set_style_property(CSSStyle *style, styleid_t sid, const W
|
||||||
|
|
||||||
static HRESULT set_style_property_var(CSSStyle *style, styleid_t sid, VARIANT *value)
|
static HRESULT set_style_property_var(CSSStyle *style, styleid_t sid, VARIANT *value)
|
||||||
{
|
{
|
||||||
const WCHAR *val;
|
nsAString val;
|
||||||
WCHAR buf[14];
|
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
hres = var_to_styleval(style, value, &style_tbl[sid], buf, &val);
|
hres = var_to_styleval(style, value, &style_tbl[sid], &val);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
return set_style_property(style, sid, val);
|
hres = set_nsstyle_property(style->nsstyle, sid, &val);
|
||||||
|
nsAString_Finish(&val);
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT get_nsstyle_attr_nsval(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, nsAString *value)
|
static HRESULT get_nsstyle_attr_nsval(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, nsAString *value)
|
||||||
|
@ -5038,21 +5043,20 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_setProperty(IHTMLCSSStyleDeclarati
|
||||||
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
||||||
nsAString priority_str, name_str, value_str;
|
nsAString priority_str, name_str, value_str;
|
||||||
const style_tbl_entry_t *style_entry;
|
const style_tbl_entry_t *style_entry;
|
||||||
const WCHAR *val;
|
|
||||||
WCHAR buf[14];
|
|
||||||
nsresult nsres;
|
nsresult nsres;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(name), debugstr_variant(value), debugstr_variant(priority));
|
TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(name), debugstr_variant(value), debugstr_variant(priority));
|
||||||
|
|
||||||
style_entry = lookup_style_tbl(name);
|
style_entry = lookup_style_tbl(name);
|
||||||
hres = var_to_styleval(This, value, style_entry, buf, &val);
|
hres = var_to_styleval(This, value, style_entry, &value_str);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
if(priority) {
|
if(priority) {
|
||||||
if(V_VT(priority) != VT_BSTR) {
|
if(V_VT(priority) != VT_BSTR) {
|
||||||
WARN("invalid priority type %s\n", debugstr_variant(priority));
|
WARN("invalid priority type %s\n", debugstr_variant(priority));
|
||||||
|
nsAString_Finish(&value_str);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
nsAString_InitDepend(&priority_str, V_BSTR(priority));
|
nsAString_InitDepend(&priority_str, V_BSTR(priority));
|
||||||
|
@ -5061,7 +5065,6 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_setProperty(IHTMLCSSStyleDeclarati
|
||||||
}
|
}
|
||||||
|
|
||||||
nsAString_InitDepend(&name_str, style_entry ? style_entry->name : name);
|
nsAString_InitDepend(&name_str, style_entry ? style_entry->name : name);
|
||||||
nsAString_InitDepend(&value_str, val);
|
|
||||||
nsres = nsIDOMCSSStyleDeclaration_SetProperty(This->nsstyle, &name_str, &value_str, &priority_str);
|
nsres = nsIDOMCSSStyleDeclaration_SetProperty(This->nsstyle, &name_str, &value_str, &priority_str);
|
||||||
nsAString_Finish(&name_str);
|
nsAString_Finish(&name_str);
|
||||||
nsAString_Finish(&value_str);
|
nsAString_Finish(&value_str);
|
||||||
|
@ -5263,18 +5266,19 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_get_backgroundPosition(IHTMLCSSSty
|
||||||
static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionX(IHTMLCSSStyleDeclaration *iface, VARIANT v)
|
static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionX(IHTMLCSSStyleDeclaration *iface, VARIANT v)
|
||||||
{
|
{
|
||||||
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
||||||
WCHAR buf[14], *pos_val;
|
nsAString pos_str, val_str;
|
||||||
nsAString pos_str;
|
|
||||||
const WCHAR *val;
|
const WCHAR *val;
|
||||||
|
WCHAR *pos_val;
|
||||||
DWORD val_len;
|
DWORD val_len;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
|
TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
|
||||||
|
|
||||||
hres = var_to_styleval(This, &v, &style_tbl[STYLEID_BACKGROUND_POSITION_X], buf, &val);
|
hres = var_to_styleval(This, &v, &style_tbl[STYLEID_BACKGROUND_POSITION_X], &val_str);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
|
nsAString_GetData(&val_str, &val);
|
||||||
val_len = val ? strlenW(val) : 0;
|
val_len = val ? strlenW(val) : 0;
|
||||||
|
|
||||||
nsAString_Init(&pos_str, NULL);
|
nsAString_Init(&pos_str, NULL);
|
||||||
|
@ -5305,6 +5309,7 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionX(IHTMLCSSSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nsAString_Finish(&pos_str);
|
nsAString_Finish(&pos_str);
|
||||||
|
nsAString_Finish(&val_str);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
|
@ -5356,18 +5361,19 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_get_backgroundPositionX(IHTMLCSSSt
|
||||||
static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionY(IHTMLCSSStyleDeclaration *iface, VARIANT v)
|
static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionY(IHTMLCSSStyleDeclaration *iface, VARIANT v)
|
||||||
{
|
{
|
||||||
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
CSSStyle *This = impl_from_IHTMLCSSStyleDeclaration(iface);
|
||||||
WCHAR buf[14], *pos_val;
|
nsAString pos_str, val_str;
|
||||||
nsAString pos_str;
|
|
||||||
const WCHAR *val;
|
const WCHAR *val;
|
||||||
|
WCHAR *pos_val;
|
||||||
DWORD val_len;
|
DWORD val_len;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
|
TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
|
||||||
|
|
||||||
hres = var_to_styleval(This, &v, &style_tbl[STYLEID_BACKGROUND_POSITION], buf, &val);
|
hres = var_to_styleval(This, &v, &style_tbl[STYLEID_BACKGROUND_POSITION], &val_str);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
|
nsAString_GetData(&val_str, &val);
|
||||||
val_len = val ? strlenW(val) : 0;
|
val_len = val ? strlenW(val) : 0;
|
||||||
|
|
||||||
nsAString_Init(&pos_str, NULL);
|
nsAString_Init(&pos_str, NULL);
|
||||||
|
@ -5401,6 +5407,7 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_put_backgroundPositionY(IHTMLCSSSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nsAString_Finish(&pos_str);
|
nsAString_Finish(&pos_str);
|
||||||
|
nsAString_Finish(&val_str);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
|
|
|
@ -918,6 +918,22 @@ static void test_body_style(IHTMLStyle *style)
|
||||||
ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginRight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginRight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
||||||
else
|
else
|
||||||
ok(!V_BSTR(&v), "mariginRight = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
ok(!V_BSTR(&v), "mariginRight = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
||||||
|
VariantClear(&v);
|
||||||
|
|
||||||
|
V_VT(&v) = VT_BSTR;
|
||||||
|
V_BSTR(&v) = a2bstr("5");
|
||||||
|
hres = IHTMLStyle_put_marginRight(style, v);
|
||||||
|
ok(hres == S_OK, "put_marginRight failed: %08x\n", hres);
|
||||||
|
|
||||||
|
V_VT(&v) = VT_NULL;
|
||||||
|
hres = IHTMLStyle_get_marginRight(style, &v);
|
||||||
|
ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
|
||||||
|
ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v));
|
||||||
|
if(compat_mode < COMPAT_IE9)
|
||||||
|
ok(!strcmp_wa(V_BSTR(&v), "5px"), "V_BSTR(marginRight) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
||||||
|
else
|
||||||
|
ok(!V_BSTR(&v), "mariginRight = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
||||||
|
VariantClear(&v);
|
||||||
|
|
||||||
if(css_style) {
|
if(css_style) {
|
||||||
V_VT(&v) = VT_NULL;
|
V_VT(&v) = VT_NULL;
|
||||||
|
@ -925,7 +941,7 @@ static void test_body_style(IHTMLStyle *style)
|
||||||
ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
|
ok(hres == S_OK, "get_marginRight failed: %08x\n", hres);
|
||||||
ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v));
|
ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v));
|
||||||
if(compat_mode < COMPAT_IE9)
|
if(compat_mode < COMPAT_IE9)
|
||||||
ok(!strcmp_wa(V_BSTR(&v), "6px"), "V_BSTR(marginRight) = %s\n",
|
ok(!strcmp_wa(V_BSTR(&v), "5px"), "V_BSTR(marginRight) = %s\n",
|
||||||
wine_dbgstr_w(V_BSTR(&v)));
|
wine_dbgstr_w(V_BSTR(&v)));
|
||||||
else
|
else
|
||||||
ok(!V_BSTR(&v), "mariginRight = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
ok(!V_BSTR(&v), "mariginRight = %s\n", wine_dbgstr_w(V_BSTR(&v)));
|
||||||
|
|
Loading…
Reference in New Issue