Jacek Caban : mshtml: Use custom VT_BSTR to VT_BOOL conversion in InvokeEx implementation.

Alexandre Julliard julliard at winehq.org
Mon Sep 24 16:04:27 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 24 14:10:33 2012 +0200

mshtml: Use custom VT_BSTR to VT_BOOL conversion in InvokeEx implementation.

---

 dlls/mshtml/dispex.c          |   10 +++++++
 dlls/mshtml/tests/jstest.html |   29 ++++++++++++++++++++-
 dlls/mshtml/tests/script.c    |   57 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 1 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index cc22ce4..7ce53b2 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -927,6 +927,16 @@ static HRESULT change_type(VARIANT *dst, VARIANT *src, VARTYPE vt, IServiceProvi
         }
     }
 
+    switch(vt) {
+    case VT_BOOL:
+        if(V_VT(src) == VT_BSTR) {
+            V_VT(dst) = VT_BOOL;
+            V_BOOL(dst) = V_BSTR(src) && *V_BSTR(src) ? VARIANT_TRUE : VARIANT_FALSE;
+            return S_OK;
+        }
+        break;
+    }
+
     return VariantChangeType(dst, src, 0, vt);
 }
 
diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html
index 224e19a..70478e4 100644
--- a/dlls/mshtml/tests/jstest.html
+++ b/dlls/mshtml/tests/jstest.html
@@ -98,6 +98,24 @@ function test_clone_node() {
     ok(cloned.style.filter === "alpha(opacity=50)", "cloned.style.filter = " + cloned.style.filter);
 }
 
+function test_setAttribute() {
+    var input;
+
+    document.body.innerHTML = '<input id="inputid"></input>';
+    input = document.getElementById("inputid");
+    ok(input.checked === false, "input.checked = " + input.checked);
+
+    input.setAttribute("checked", "test");
+    ok(input.checked === true, "input.checked = " + input.checked);
+
+    input.setAttribute("checked", 0);
+    ok(input.checked === false, "input.checked = " + input.checked);
+
+    input.setAttribute("checked", "");
+    ok(input.checked === false, "input.checked = " + input.checked);
+
+}
+
 function test_getter_call() {
     document.body.innerHTML = '<div id="divid"></div>';
 
@@ -133,7 +151,7 @@ function test_override_functions() {
 
 var globalVar = false;
 
-function runTest() {
+function runTests() {
     obj = new Object();
     ok(obj === window.obj, "obj !== window.obj");
 
@@ -147,11 +165,20 @@ function runTest() {
     test_document_name_as_index();
     test_remove_style_attribute();
     test_getter_call();
+    test_setAttribute();
     test_override_functions();
 
     var r = window.execScript("globalVar = true;");
     ok(r === undefined, "execScript returned " + r);
     ok(globalVar === true, "globalVar = " + globalVar);
+}
+
+function runTest() {
+    try {
+        runTests();
+    }catch(e) {
+        ok(false, "got exception");
+    }
 
     external.reportSuccess();
 }
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index 59d03dd..0fa6eba 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -2028,6 +2028,62 @@ static void test_arg_conv(IHTMLWindow2 *window)
     IDispatchEx_Release(dispex);
 }
 
+#define test_elem_disabled(a,b) _test_elem_disabled(__LINE__,a,b)
+static void _test_elem_disabled(unsigned line, IHTMLElement *elem, VARIANT_BOOL exb)
+{
+    IHTMLElement3 *elem3;
+    VARIANT_BOOL b = 100;
+    HRESULT hres;
+
+    hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLElement3, (void**)&elem3);
+    ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLElement3 iface: %08x\n", hres);
+
+    hres = IHTMLElement3_get_disabled(elem3, &b);
+    ok_(__FILE__,line)(hres == S_OK, "get_disabled failed: %08x\n", hres);
+    ok_(__FILE__,line)(b == exb, "disabled = %x, expected %x\n", b, exb);
+
+    IHTMLElement3_Release(elem3);
+}
+
+static void test_default_arg_conv(IHTMLWindow2 *window)
+{
+    IHTMLDocument2 *doc;
+    IDispatchEx *dispex;
+    IHTMLElement *elem;
+    VARIANT v;
+    HRESULT hres;
+
+    hres = IHTMLWindow2_get_document(window, &doc);
+    ok(hres == S_OK, "get_document failed: %08x\n", hres);
+
+    hres = IHTMLDocument2_get_body(doc, &elem);
+    IHTMLDocument2_Release(doc);
+    ok(hres == S_OK, "get_body failed: %08x\n", hres);
+
+    hres = IHTMLElement_QueryInterface(elem, &IID_IDispatchEx, (void**)&dispex);
+    ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
+
+    test_elem_disabled(elem, VARIANT_FALSE);
+
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = a2bstr("test");
+    hres = dispex_propput(dispex, DISPID_IHTMLELEMENT3_DISABLED, 0, &v, NULL);
+    ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+    SysFreeString(V_BSTR(&v));
+
+    test_elem_disabled(elem, VARIANT_TRUE);
+
+    V_VT(&v) = VT_I4;
+    V_BSTR(&v) = 0;
+    hres = dispex_propput(dispex, DISPID_IHTMLELEMENT3_DISABLED, 0, &v, NULL);
+    ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+
+    test_elem_disabled(elem, VARIANT_FALSE);
+
+    IHTMLElement_Release(elem);
+    IDispatchEx_Release(dispex);
+}
+
 static void test_script_run(void)
 {
     IDispatchEx *document, *dispex;
@@ -2198,6 +2254,7 @@ static void test_script_run(void)
     test_nextdispid(dispex);
 
     test_arg_conv(window);
+    test_default_arg_conv(window);
     IHTMLWindow2_Release(window);
 
     tmp = a2bstr("test");




More information about the wine-cvs mailing list