From: Jacek Caban Subject: mshtml: Added IHTMLMetaElement::charset property implementation. Message-Id: <53CFB8BC.2050503@codeweavers.com> Date: Wed, 23 Jul 2014 15:29:32 +0200 --- dlls/mshtml/htmlelem.c | 32 +++++++++++++++++++++++++++++--- dlls/mshtml/htmlinput.c | 2 +- dlls/mshtml/htmlmeta.c | 20 +++++++++++++------- dlls/mshtml/mshtml_private.h | 3 ++- dlls/mshtml/tests/dom.c | 39 ++++++++++++++++++++++++++++++++++++--- 5 files changed, 81 insertions(+), 15 deletions(-) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 8e246fe..8378d74 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -175,11 +175,12 @@ nsresult get_elem_attr_value(nsIDOMHTMLElement *nselem, const WCHAR *name, nsASt return NS_OK; } -HRESULT elem_string_attr_getter(HTMLElement *elem, const WCHAR *name, BSTR *p) +HRESULT elem_string_attr_getter(HTMLElement *elem, const WCHAR *name, BOOL use_null, BSTR *p) { const PRUnichar *val; nsAString val_str; nsresult nsres; + HRESULT hres = S_OK; nsres = get_elem_attr_value(elem->nselem, name, &val_str, &val); if(NS_FAILED(nsres)) @@ -187,9 +188,34 @@ HRESULT elem_string_attr_getter(HTMLElement *elem, const WCHAR *name, BSTR *p) TRACE("%s: returning %s\n", debugstr_w(name), debugstr_w(val)); - *p = SysAllocString(val); + if(*val || !use_null) { + *p = SysAllocString(val); + if(!*p) + hres = E_OUTOFMEMORY; + }else { + *p = NULL; + } nsAString_Finish(&val_str); - return *p ? S_OK : E_OUTOFMEMORY; + return hres; +} + +HRESULT elem_string_attr_setter(HTMLElement *elem, const WCHAR *name, const WCHAR *value) +{ + nsAString name_str, val_str; + nsresult nsres; + + nsAString_InitDepend(&name_str, name); + nsAString_InitDepend(&val_str, value); + nsres = nsIDOMHTMLElement_SetAttribute(elem->nselem, &name_str, &val_str); + nsAString_Finish(&name_str); + nsAString_Finish(&val_str); + + if(NS_FAILED(nsres)) { + WARN("SetAttribute failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } typedef struct diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index f5e086c..f832b88 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1337,7 +1337,7 @@ static HRESULT WINAPI HTMLLabelElement_get_htmlFor(IHTMLLabelElement *iface, BST TRACE("(%p)->(%p)\n", This, p); - return elem_string_attr_getter(&This->element, forW, p); + return elem_string_attr_getter(&This->element, forW, FALSE, p); } static HRESULT WINAPI HTMLLabelElement_put_accessKey(IHTMLLabelElement *iface, BSTR v) diff --git a/dlls/mshtml/htmlmeta.c b/dlls/mshtml/htmlmeta.c index e9783c8..ab73c3c 100644 --- a/dlls/mshtml/htmlmeta.c +++ b/dlls/mshtml/htmlmeta.c @@ -108,7 +108,7 @@ static HRESULT WINAPI HTMLMetaElement_get_httpEquiv(IHTMLMetaElement *iface, BST TRACE("(%p)->(%p)\n", This, p); - return elem_string_attr_getter(&This->element, httpEquivW, p); + return elem_string_attr_getter(&This->element, httpEquivW, TRUE, p); } static HRESULT WINAPI HTMLMetaElement_put_content(IHTMLMetaElement *iface, BSTR v) @@ -125,7 +125,7 @@ static HRESULT WINAPI HTMLMetaElement_get_content(IHTMLMetaElement *iface, BSTR TRACE("(%p)->(%p)\n", This, p); - return elem_string_attr_getter(&This->element, contentW, p); + return elem_string_attr_getter(&This->element, contentW, TRUE, p); } static HRESULT WINAPI HTMLMetaElement_put_name(IHTMLMetaElement *iface, BSTR v) @@ -142,7 +142,7 @@ static HRESULT WINAPI HTMLMetaElement_get_name(IHTMLMetaElement *iface, BSTR *p) TRACE("(%p)->(%p)\n", This, p); - return elem_string_attr_getter(&This->element, nameW, p); + return elem_string_attr_getter(&This->element, nameW, TRUE, p); } static HRESULT WINAPI HTMLMetaElement_put_url(IHTMLMetaElement *iface, BSTR v) @@ -159,18 +159,24 @@ static HRESULT WINAPI HTMLMetaElement_get_url(IHTMLMetaElement *iface, BSTR *p) return E_NOTIMPL; } +static const WCHAR charsetW[] = {'c','h','a','r','s','e','t',0}; + static HRESULT WINAPI HTMLMetaElement_put_charset(IHTMLMetaElement *iface, BSTR v) { HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + return elem_string_attr_setter(&This->element, charsetW, v); } static HRESULT WINAPI HTMLMetaElement_get_charset(IHTMLMetaElement *iface, BSTR *p) { HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return elem_string_attr_getter(&This->element, charsetW, TRUE, p); } static const IHTMLMetaElementVtbl HTMLMetaElementVtbl = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 8db2ba8..64b9087 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -959,7 +959,8 @@ IHTMLElementCollection *create_collection_from_nodelist(HTMLDocumentNode*,nsIDOM IHTMLElementCollection *create_collection_from_htmlcol(HTMLDocumentNode*,nsIDOMHTMLCollection*) DECLSPEC_HIDDEN; nsresult get_elem_attr_value(nsIDOMHTMLElement*,const WCHAR*,nsAString*,const PRUnichar**) DECLSPEC_HIDDEN; -HRESULT elem_string_attr_getter(HTMLElement*,const WCHAR*,BSTR*) DECLSPEC_HIDDEN; +HRESULT elem_string_attr_getter(HTMLElement*,const WCHAR*,BOOL,BSTR*) DECLSPEC_HIDDEN; +HRESULT elem_string_attr_setter(HTMLElement*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN; /* commands */ typedef struct { diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 533d7b7..33645c8 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -3803,7 +3803,6 @@ static void _test_meta_name(unsigned line, IUnknown *unk, const char *exname) BSTR name = NULL; HRESULT hres; - meta = _get_metaelem_iface(line, unk); hres = IHTMLMetaElement_get_name(meta, &name); ok_(__FILE__,line)(hres == S_OK, "get_name failed: %08x\n", hres); @@ -3819,7 +3818,6 @@ static void _test_meta_content(unsigned line, IUnknown *unk, const char *exconte BSTR content = NULL; HRESULT hres; - meta = _get_metaelem_iface(line, unk); hres = IHTMLMetaElement_get_content(meta, &content); ok_(__FILE__,line)(hres == S_OK, "get_content failed: %08x\n", hres); @@ -3835,7 +3833,6 @@ static void _test_meta_httpequiv(unsigned line, IUnknown *unk, const char *exval BSTR val = NULL; HRESULT hres; - meta = _get_metaelem_iface(line, unk); hres = IHTMLMetaElement_get_httpEquiv(meta, &val); ok_(__FILE__,line)(hres == S_OK, "get_httpEquiv failed: %08x\n", hres); @@ -3844,6 +3841,40 @@ static void _test_meta_httpequiv(unsigned line, IUnknown *unk, const char *exval IHTMLMetaElement_Release(meta); } +#define test_meta_charset(a,b) _test_meta_charset(__LINE__,a,b) +static void _test_meta_charset(unsigned line, IUnknown *unk, const char *exval) +{ + IHTMLMetaElement *meta; + BSTR val = NULL; + HRESULT hres; + + meta = _get_metaelem_iface(line, unk); + hres = IHTMLMetaElement_get_charset(meta, &val); + ok_(__FILE__,line)(hres == S_OK, "get_charset failed: %08x\n", hres); + if(exval) + ok_(__FILE__,line)(!strcmp_wa(val, exval), "charset = %s, expected %s\n", wine_dbgstr_w(val), exval); + else + ok_(__FILE__,line)(!val, "charset = %s, expected NULL\n", wine_dbgstr_w(val)); + SysFreeString(val); + IHTMLMetaElement_Release(meta); +} + +#define set_meta_charset(a,b) _set_meta_charset(__LINE__,a,b) +static void _set_meta_charset(unsigned line, IUnknown *unk, const char *vala) +{ + BSTR val = a2bstr(vala); + IHTMLMetaElement *meta; + HRESULT hres; + + meta = _get_metaelem_iface(line, unk); + hres = IHTMLMetaElement_put_charset(meta, val); + ok_(__FILE__,line)(hres == S_OK, "put_charset failed: %08x\n", hres); + SysFreeString(val); + IHTMLMetaElement_Release(meta); + + _test_meta_charset(line, unk, vala); +} + #define test_link_media(a,b) _test_link_media(__LINE__,a,b) static void _test_link_media(unsigned line, IHTMLElement *elem, const char *exval) { @@ -6969,6 +7000,8 @@ static void test_elems(IHTMLDocument2 *doc) test_meta_name((IUnknown*)elem, "meta name"); test_meta_content((IUnknown*)elem, "text/html; charset=utf-8"); test_meta_httpequiv((IUnknown*)elem, "Content-Type"); + test_meta_charset((IUnknown*)elem, NULL); + set_meta_charset((IUnknown*)elem, "utf-8"); IHTMLElement_Release(elem); }