Jacek Caban : mshtml: Use return_nsstr_variant in HTMLTable_get_width.

Alexandre Julliard julliard at winehq.org
Thu May 28 17:11:11 CDT 2020


Module: wine
Branch: master
Commit: 0dfc101e1702b7415f7acffd11534f034854c973
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0dfc101e1702b7415f7acffd11534f034854c973

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 28 23:06:38 2020 +0200

mshtml: Use return_nsstr_variant in HTMLTable_get_width.

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

---

 dlls/mshtml/htmlnode.c       |  4 ++--
 dlls/mshtml/htmltable.c      | 38 +++-----------------------------------
 dlls/mshtml/mshtml_private.h |  4 +++-
 dlls/mshtml/nsembed.c        | 22 +++++++++++++++++-----
 dlls/mshtml/tests/dom.c      | 10 ++++++++++
 5 files changed, 35 insertions(+), 43 deletions(-)

diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index d80c615e72..b2d35f4660 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -1234,7 +1234,7 @@ static HRESULT WINAPI HTMLDOMNode3_get_namespaceURI(IHTMLDOMNode3 *iface, VARIAN
 
     nsAString_InitDepend(&nsstr, NULL);
     nsres = nsIDOMNode_GetNamespaceURI(This->nsnode, &nsstr);
-    return return_nsstr_variant(nsres, &nsstr, p);
+    return return_nsstr_variant(nsres, &nsstr, 0, p);
 }
 
 static HRESULT WINAPI HTMLDOMNode3_put_textContent(IHTMLDOMNode3 *iface, VARIANT v)
@@ -1266,7 +1266,7 @@ static HRESULT WINAPI HTMLDOMNode3_get_textContent(IHTMLDOMNode3 *iface, VARIANT
 
     nsAString_Init(&nsstr, NULL);
     nsres = nsIDOMNode_GetTextContent(This->nsnode, &nsstr);
-    return return_nsstr_variant(nsres, &nsstr, p);
+    return return_nsstr_variant(nsres, &nsstr, 0, p);
 }
 
 static HRESULT WINAPI HTMLDOMNode3_isEqualNode(IHTMLDOMNode3 *iface, IHTMLDOMNode3 *otherNode, VARIANT_BOOL *isEqual)
diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c
index a37ab35413..2f40bb078d 100644
--- a/dlls/mshtml/htmltable.c
+++ b/dlls/mshtml/htmltable.c
@@ -1014,26 +1014,6 @@ static HRESULT var2str(const VARIANT *p, nsAString *nsstr)
     return ret ? S_OK : E_OUTOFMEMORY;
 }
 
-static HRESULT nsstr_to_truncated_bstr(const nsAString *nsstr, BSTR *ret_ptr)
-{
-    const PRUnichar *str, *ptr, *end = NULL;
-    BSTR ret;
-
-    nsAString_GetData(nsstr, &str);
-
-    for(ptr = str; is_digit(*ptr); ptr++);
-    if(*ptr == '.') {
-        for(end = ptr++; is_digit(*ptr); ptr++);
-        if(*ptr)
-            end = NULL;
-    }
-
-    ret = end ? SysAllocStringLen(str, end-str) : SysAllocString(str);
-
-    *ret_ptr = ret;
-    return ret ? S_OK : E_OUTOFMEMORY;
-}
-
 static HRESULT WINAPI HTMLTable_QueryInterface(IHTMLTable *iface,
                                                          REFIID riid, void **ppv)
 {
@@ -1244,7 +1224,7 @@ static HRESULT WINAPI HTMLTable_get_cellPadding(IHTMLTable *iface, VARIANT *p)
 
     nsAString_Init(&val, NULL);
     nsres = nsIDOMHTMLTableElement_GetCellPadding(This->nstable, &val);
-    return return_nsstr_variant(nsres, &val, p);
+    return return_nsstr_variant(nsres, &val, 0, p);
 }
 
 static HRESULT WINAPI HTMLTable_put_background(IHTMLTable *iface, BSTR v)
@@ -1440,25 +1420,13 @@ static HRESULT WINAPI HTMLTable_get_width(IHTMLTable *iface, VARIANT *p)
 {
     HTMLTable *This = impl_from_IHTMLTable(iface);
     nsAString val;
-    BSTR bstr;
     nsresult nsres;
-    HRESULT hres;
 
     TRACE("(%p)->(%p)\n", This, p);
+
     nsAString_Init(&val, NULL);
     nsres = nsIDOMHTMLTableElement_GetWidth(This->nstable, &val);
-    if (NS_FAILED(nsres)){
-        ERR("Get Width failed!\n");
-        nsAString_Finish(&val);
-        return E_FAIL;
-    }
-
-    hres = nsstr_to_truncated_bstr(&val, &bstr);
-    nsAString_Finish(&val);
-
-    V_VT(p) = VT_BSTR;
-    V_BSTR(p) = bstr;
-    return hres;
+    return return_nsstr_variant(nsres, &val, NSSTR_IMPLICIT_PX, p);
 }
 
 static HRESULT WINAPI HTMLTable_put_height(IHTMLTable *iface, VARIANT v)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cc9eefc528..565a2428ba 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -981,9 +981,11 @@ void nsAString_SetData(nsAString*,const PRUnichar*) DECLSPEC_HIDDEN;
 UINT32 nsAString_GetData(const nsAString*,const PRUnichar**) DECLSPEC_HIDDEN;
 void nsAString_Finish(nsAString*) DECLSPEC_HIDDEN;
 
+#define NSSTR_IMPLICIT_PX    0x01
+
 HRESULT map_nsresult(nsresult) DECLSPEC_HIDDEN;
 HRESULT return_nsstr(nsresult,nsAString*,BSTR*) DECLSPEC_HIDDEN;
-HRESULT return_nsstr_variant(nsresult nsres, nsAString *nsstr, VARIANT *p) DECLSPEC_HIDDEN;
+HRESULT return_nsstr_variant(nsresult,nsAString*,unsigned,VARIANT*) DECLSPEC_HIDDEN;
 HRESULT variant_to_nsstr(VARIANT*,BOOL,nsAString*) DECLSPEC_HIDDEN;
 HRESULT return_nsform(nsresult,nsIDOMHTMLFormElement*,IHTMLFormElement**) DECLSPEC_HIDDEN;
 
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 2122536fc5..2d1eb817dc 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -962,10 +962,8 @@ HRESULT return_nsstr(nsresult nsres, nsAString *nsstr, BSTR *p)
     return S_OK;
 }
 
-HRESULT return_nsstr_variant(nsresult nsres, nsAString *nsstr, VARIANT *p)
+HRESULT return_nsstr_variant(nsresult nsres, nsAString *nsstr, unsigned flags, VARIANT *p)
 {
-    const PRUnichar *str;
-
     if(NS_FAILED(nsres)) {
         ERR("failed: %08x\n", nsres);
         nsAString_Finish(nsstr);
@@ -976,10 +974,24 @@ HRESULT return_nsstr_variant(nsresult nsres, nsAString *nsstr, VARIANT *p)
         TRACE("ret null\n");
         V_VT(p) = VT_NULL;
     }else {
+        const WCHAR *str;
+        size_t len;
         nsAString_GetData(nsstr, &str);
-        TRACE("ret %s\n", debugstr_w(str));
+        len = wcslen(str);
+        if(flags & NSSTR_IMPLICIT_PX) {
+            const WCHAR *iter;
+            if(len > 2 && !wcscmp(str + len - 2, L"px"))
+                len -= 2;
+            for(iter = str; iter < str + len && is_digit(*iter); iter++);
+            if(*iter == '.') {
+                const WCHAR *dot = iter++;
+                while(iter < str + len && is_digit(*iter)) iter++;
+                if(iter == str + len && dot) len = dot - str;
+            }
+        }
+        TRACE("ret %s\n", debugstr_wn(str, len));
         if(*str) {
-            V_BSTR(p) = SysAllocString(str);
+            V_BSTR(p) = SysAllocStringLen(str, len);
             if(!V_BSTR(p)) {
                 nsAString_Finish(nsstr);
                 return E_OUTOFMEMORY;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 024ea21324..cb8141da93 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -7910,6 +7910,16 @@ static void test_table_elem(IHTMLElement *elem)
     ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
     VariantClear(&vDefaultbg);
 
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = SysAllocString(L"12px");
+    hres = IHTMLTable_put_width(table, v);
+    ok(hres == S_OK, "put_width = %08x\n", hres);
+    VariantClear(&v);
+    hres = IHTMLTable_get_width(table, &v);
+    ok(hres == S_OK, "get_width = %08x\n", hres);
+    ok(!lstrcmpW(V_BSTR(&v), L"12"), "Expected 12, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+    VariantClear(&v);
+
     V_VT(&v) = VT_BSTR;
     V_BSTR(&v) = SysAllocString(L"11");
     hres = IHTMLTable_put_width(table, v);




More information about the wine-cvs mailing list