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