Jacek Caban : mshtml: Added IHTMLMetaElement:: charset property implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 23 14:44:09 CDT 2014
Module: wine
Branch: master
Commit: 6031108076213818445668992d19a8ba0a483082
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6031108076213818445668992d19a8ba0a483082
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Jul 23 15:29:32 2014 +0200
mshtml: Added IHTMLMetaElement::charset property implementation.
---
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);
}
More information about the wine-cvs
mailing list