Jacek Caban : mshtml: Accept different VARIANT types in document_write.

Alexandre Julliard julliard at winehq.org
Mon Apr 23 13:41:38 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 23 12:48:58 2012 +0200

mshtml: Accept different VARIANT types in document_write.

---

 dlls/mshtml/htmldoc.c   |   35 +++++++++++++++++++++++------------
 dlls/mshtml/tests/dom.c |   38 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 13 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 98bdcab..71f0db9 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -799,8 +799,8 @@ static HRESULT WINAPI HTMLDocument_get_nameProp(IHTMLDocument2 *iface, BSTR *p)
 
 static HRESULT document_write(HTMLDocument *This, SAFEARRAY *psarray, BOOL ln)
 {
+    VARIANT *var, tmp;
     nsAString nsstr;
-    VARIANT *var;
     ULONG i, argc;
     nsresult nsres;
     HRESULT hres;
@@ -824,27 +824,38 @@ static HRESULT document_write(HTMLDocument *This, SAFEARRAY *psarray, BOOL ln)
         return hres;
     }
 
-    nsAString_Init(&nsstr, NULL);
+    V_VT(&tmp) = VT_EMPTY;
 
     argc = psarray->rgsabound[0].cElements;
     for(i=0; i < argc; i++) {
         if(V_VT(var+i) == VT_BSTR) {
-            nsAString_SetData(&nsstr, V_BSTR(var+i));
-            if(!ln || i != argc-1)
-                nsres = nsIDOMHTMLDocument_Write(This->doc_node->nsdoc, &nsstr, NULL /* FIXME! */);
-            else
-                nsres = nsIDOMHTMLDocument_Writeln(This->doc_node->nsdoc, &nsstr, NULL /* FIXME! */);
-            if(NS_FAILED(nsres))
-                ERR("Write failed: %08x\n", nsres);
+            nsAString_InitDepend(&nsstr, V_BSTR(var+i));
         }else {
-            FIXME("unsupported arg[%d] = %s\n", i, debugstr_variant(var+i));
+            hres = VariantChangeType(&tmp, var+i, 0, VT_BSTR);
+            if(FAILED(hres)) {
+                WARN("Could not convert %s to string\n", debugstr_variant(var+i));
+                break;
+            }
+            nsAString_InitDepend(&nsstr, V_BSTR(&tmp));
+        }
+
+        if(!ln || i != argc-1)
+            nsres = nsIDOMHTMLDocument_Write(This->doc_node->nsdoc, &nsstr, NULL /* FIXME! */);
+        else
+            nsres = nsIDOMHTMLDocument_Writeln(This->doc_node->nsdoc, &nsstr, NULL /* FIXME! */);
+        nsAString_Finish(&nsstr);
+        if(V_VT(var+i) != VT_BSTR)
+            VariantClear(&tmp);
+        if(NS_FAILED(nsres)) {
+            ERR("Write failed: %08x\n", nsres);
+            hres = E_FAIL;
+            break;
         }
     }
 
-    nsAString_Finish(&nsstr);
     SafeArrayUnaccessData(psarray);
 
-    return S_OK;
+    return hres;
 }
 
 static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarray)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 4176394..fcc2654 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -4783,6 +4783,34 @@ static void doc_write(IHTMLDocument2 *doc, BOOL ln, const char *text)
     SafeArrayDestroy(sa);
 }
 
+static void doc_complex_write(IHTMLDocument2 *doc)
+{
+    SAFEARRAYBOUND dim = {5, 0};
+    SAFEARRAY *sa;
+    VARIANT *args;
+    HRESULT hres;
+
+    sa = SafeArrayCreate(VT_VARIANT, 1, &dim);
+    SafeArrayAccessData(sa, (void**)&args);
+
+    V_VT(args) = VT_BSTR;
+    V_BSTR(args) = a2bstr("<body i4val=\"");
+    V_VT(args+1) = VT_I4;
+    V_I4(args+1) = 4;
+    V_VT(args+2) = VT_BSTR;
+    V_BSTR(args+2) = a2bstr("\" r8val=\"");
+    V_VT(args+3) = VT_R8;
+    V_R8(args+3) = 3.14;
+    V_VT(args+4) = VT_BSTR;
+    V_BSTR(args+4) = a2bstr("\">");
+    SafeArrayUnaccessData(sa);
+
+    hres = IHTMLDocument2_write(doc, sa);
+    ok(hres == S_OK, "write failed: %08x\n", hres);
+
+    SafeArrayDestroy(sa);
+}
+
 static void test_frame_doc(IUnknown *frame_elem, BOOL iframe)
 {
     IHTMLDocument2 *window_doc, *elem_doc;
@@ -4823,6 +4851,7 @@ static void test_iframe_elem(IHTMLElement *elem)
     IHTMLDocument2 *content_doc, *owner_doc;
     IHTMLElementCollection *col;
     IHTMLWindow2 *content_window;
+    IHTMLElement *body;
     IDispatch *disp;
     VARIANT errv;
     BSTR str;
@@ -4854,7 +4883,9 @@ static void test_iframe_elem(IHTMLElement *elem)
     ok(iface_cmp((IUnknown*)disp, (IUnknown*)content_window), "disp != content_window\n");
     IDispatch_Release(disp);
 
-    doc_write(content_doc, FALSE, "<html><head><title>test</title></head><body><br /></body>");
+    doc_write(content_doc, FALSE, "<html><head><title>test</title></head>");
+    doc_complex_write(content_doc);
+    doc_write(content_doc, TRUE, "<br />");
     doc_write(content_doc, TRUE, "</html>");
 
     hres = IHTMLDocument2_get_all(content_doc, &col);
@@ -4862,6 +4893,11 @@ static void test_iframe_elem(IHTMLElement *elem)
     test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
     IHTMLElementCollection_Release(col);
 
+    body = doc_get_body(content_doc);
+    test_elem_attr(body, "i4val", "4");
+    test_elem_attr(body, "r8val", "3.14");
+    IHTMLElement_Release(body);
+
     hres = IHTMLDocument2_close(content_doc);
     ok(hres == S_OK, "close failed: %08x\n", hres);
 




More information about the wine-cvs mailing list