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