Jacek Caban : mshtml: Properly convert VT_NULL to string in get_elem_attr_value_by_dispid.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 6 14:50:56 CST 2016


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan  5 18:53:21 2016 +0100

mshtml: Properly convert VT_NULL to string in 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/htmlelem.c  |  8 ++++++++
 dlls/mshtml/tests/dom.c | 13 ++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index ce9d859..e5ae4e0 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -644,6 +644,8 @@ HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, DWORD fl
     EXCEPINFO excep;
     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))
@@ -653,6 +655,12 @@ HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, DWORD fl
         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;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index bcb016d..1be81e5 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1411,8 +1411,19 @@ static void test_get_set_attr(IHTMLDocument2 *doc)
     ok(V_VT(&val) == VT_BOOL, "variant type should have been VT_BOOL (0x%x), was: 0x%x\n", VT_BOOL, V_VT(&val));
     ok(V_BOOL(&val) == VARIANT_TRUE, "variant value should have been VARIANT_TRUE (0x%x), was %d\n", VARIANT_TRUE, V_BOOL(&val));
     VariantClear(&val);
-    SysFreeString(bstr);
 
+    /* overwrite the attribute with null */
+    V_VT(&val) = VT_NULL;
+    hres = IHTMLElement_setAttribute(elem, bstr, val, 0);
+    ok(hres == S_OK, "setAttribute failed: %08x\n", hres);
+
+    hres = IHTMLElement_getAttribute(elem, bstr, 2, &val);
+    ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
+    ok(V_VT(&val) == VT_BSTR, "V_VT(val) = %u, expected VT_BSTR", V_VT(&val));
+    ok(!strcmp_wa(V_BSTR(&val), "null"), "V_BSTR(val) = %s, expected \"null\"\n", wine_dbgstr_w(V_BSTR(&val)));
+    VariantClear(&val);
+
+    SysFreeString(bstr);
     IHTMLElement_Release(elem);
 }
 




More information about the wine-cvs mailing list