Jacek Caban : mshtml: Split conversion to string out of get_elem_attr_value_by_dispid.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 30 10:00:31 CDT 2016


Module: wine
Branch: master
Commit: a3ab8d679225562dc3eed427173c2966698c3529
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3ab8d679225562dc3eed427173c2966698c3529

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Mar 30 14:38:44 2016 +0200

mshtml: Split conversion to string out of get_elem_attr_value_by_dispid.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlattr.c       |  6 +++--
 dlls/mshtml/htmlelem.c       | 61 ++++++++++++++++++++++++--------------------
 dlls/mshtml/mshtml_private.h |  7 ++---
 3 files changed, 40 insertions(+), 34 deletions(-)

diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c
index 97a4ce2..8b21eea 100644
--- a/dlls/mshtml/htmlattr.c
+++ b/dlls/mshtml/htmlattr.c
@@ -169,7 +169,7 @@ static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, V
     if(!This->elem)
         return VariantCopy(p, &This->value);
 
-    return get_elem_attr_value_by_dispid(This->elem, This->dispid, 0, p);
+    return get_elem_attr_value_by_dispid(This->elem, This->dispid, p);
 }
 
 static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, VARIANT_BOOL *p)
@@ -315,7 +315,9 @@ static HRESULT WINAPI HTMLDOMAttribute2_get_value(IHTMLDOMAttribute2 *iface, BST
         return E_UNEXPECTED;
     }
 
-    hres = get_elem_attr_value_by_dispid(This->elem, This->dispid, ATTRFLAG_ASSTRING, &val);
+    hres = get_elem_attr_value_by_dispid(This->elem, This->dispid, &val);
+    if(SUCCEEDED(hres))
+        hres = attr_value_to_string(&val);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index cb0b864..c7090e6 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -63,6 +63,10 @@ static const WCHAR textareaW[] = {'T','E','X','T','A','R','E','A',0};
 static const WCHAR title_tagW[]= {'T','I','T','L','E',0};
 static const WCHAR trW[]       = {'T','R',0};
 
+#define ATTRFLAG_CASESENSITIVE  0x0001
+#define ATTRFLAG_ASSTRING       0x0002
+#define ATTRFLAG_EXPANDURL      0x0004
+
 typedef struct {
     const WCHAR *name;
     HRESULT (*constructor)(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**);
@@ -638,39 +642,39 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
             LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, NULL, &excep, NULL);
 }
 
-HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, DWORD flags, VARIANT *ret)
+HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, VARIANT *ret)
 {
     DISPPARAMS dispParams = {NULL, NULL, 0, 0};
     EXCEPINFO excep;
+
+    return IDispatchEx_InvokeEx(&elem->node.event_target.dispex.IDispatchEx_iface, dispid, LOCALE_SYSTEM_DEFAULT,
+            DISPATCH_PROPERTYGET, &dispParams, ret, &excep, NULL);
+}
+
+HRESULT attr_value_to_string(VARIANT *v)
+{
     HRESULT hres;
 
     static const WCHAR nullW[] = {'n','u','l','l',0};
 
-    hres = IDispatchEx_InvokeEx(&elem->node.event_target.dispex.IDispatchEx_iface, dispid, LOCALE_SYSTEM_DEFAULT,
-            DISPATCH_PROPERTYGET, &dispParams, ret, &excep, NULL);
-    if(FAILED(hres))
-        return hres;
-
-    if(flags & ATTRFLAG_ASSTRING) {
-        switch(V_VT(ret)) {
-        case VT_BSTR:
-            break;
-        case VT_NULL:
-            V_BSTR(ret) = SysAllocString(nullW);
-            if(!V_BSTR(ret))
-                return E_OUTOFMEMORY;
-            V_VT(ret) = VT_BSTR;
-            break;
-        case VT_DISPATCH:
-            IDispatch_Release(V_DISPATCH(ret));
-            V_VT(ret) = VT_BSTR;
-            V_BSTR(ret) = SysAllocString(NULL);
-            break;
-        default:
-            hres = VariantChangeType(ret, ret, 0, VT_BSTR);
-            if(FAILED(hres))
-                return hres;
-        }
+    switch(V_VT(v)) {
+    case VT_BSTR:
+        break;
+    case VT_NULL:
+        V_BSTR(v) = SysAllocString(nullW);
+        if(!V_BSTR(v))
+            return E_OUTOFMEMORY;
+        V_VT(v) = VT_BSTR;
+        break;
+    case VT_DISPATCH:
+        IDispatch_Release(V_DISPATCH(v));
+        V_VT(v) = VT_BSTR;
+        V_BSTR(v) = SysAllocString(NULL);
+        break;
+    default:
+        hres = VariantChangeType(v, v, 0, VT_BSTR);
+        if(FAILED(hres))
+            return hres;
     }
 
     return S_OK;
@@ -700,7 +704,10 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr
         return hres;
     }
 
-    return get_elem_attr_value_by_dispid(This, dispid, lFlags, AttributeValue);
+    hres = get_elem_attr_value_by_dispid(This, dispid, AttributeValue);
+    if(SUCCEEDED(hres) && (lFlags & ATTRFLAG_ASSTRING))
+        hres = attr_value_to_string(AttributeValue);
+    return hres;
 }
 
 static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strAttributeName,
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 36c95ce..611cb8b 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1016,11 +1016,8 @@ IHTMLElementCollection *create_all_collection(HTMLDOMNode*,BOOL) DECLSPEC_HIDDEN
 IHTMLElementCollection *create_collection_from_nodelist(HTMLDocumentNode*,nsIDOMNodeList*) DECLSPEC_HIDDEN;
 IHTMLElementCollection *create_collection_from_htmlcol(HTMLDocumentNode*,nsIDOMHTMLCollection*) DECLSPEC_HIDDEN;
 
-#define ATTRFLAG_CASESENSITIVE  0x0001
-#define ATTRFLAG_ASSTRING       0x0002
-#define ATTRFLAG_EXPANDURL      0x0004
-
-HRESULT get_elem_attr_value_by_dispid(HTMLElement*,DISPID,DWORD,VARIANT*) DECLSPEC_HIDDEN;
+HRESULT attr_value_to_string(VARIANT*) DECLSPEC_HIDDEN;
+HRESULT get_elem_attr_value_by_dispid(HTMLElement*,DISPID,VARIANT*) DECLSPEC_HIDDEN;
 HRESULT get_elem_source_index(HTMLElement*,LONG*) DECLSPEC_HIDDEN;
 
 nsresult get_elem_attr_value(nsIDOMHTMLElement*,const WCHAR*,nsAString*,const PRUnichar**) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list