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

This commit is contained in:
Jacek Caban 2012-09-24 14:10:33 +02:00 committed by Alexandre Julliard
parent 4d469b55a5
commit 514e65c1e9
3 changed files with 95 additions and 1 deletions

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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");