mshtml: Ignore named and extra arguments when invoking builtin functions.

Native just ignores the named and extra arguments completely.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gabriel Ivăncescu 2021-12-07 21:10:02 +02:00 committed by Alexandre Julliard
parent a48127034d
commit 0e7d1a601c
3 changed files with 144 additions and 8 deletions

View file

@ -738,12 +738,17 @@ static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS
static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res,
EXCEPINFO *ei)
{
DISPPARAMS params = {dp->rgvarg+dp->cNamedArgs, NULL, dp->cArgs-dp->cNamedArgs, 0};
DISPPARAMS params = {dp->rgvarg, NULL, dp->cArgs, 0};
ITypeInfo *ti;
IUnknown *unk;
UINT argerr=0;
HRESULT hres;
if(params.cArgs > func->argc) {
params.rgvarg += params.cArgs - func->argc;
params.cArgs = func->argc;
}
hres = get_typeinfo(func->tid, &ti);
if(FAILED(hres)) {
ERR("Could not get type info: %08x\n", hres);
@ -1170,12 +1175,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP
IUnknown *iface;
HRESULT hres;
if(dp->cNamedArgs) {
FIXME("Named arguments not supported\n");
return E_NOTIMPL;
}
if(dp->cArgs > func->argc || dp->cArgs + func->default_value_cnt < func->argc) {
if(dp->cArgs + func->default_value_cnt < func->argc) {
FIXME("Invalid argument count (expected %u, got %u)\n", func->argc, dp->cArgs);
return E_INVALIDARG;
}

View file

@ -1113,7 +1113,7 @@ sync_test("elem_attr", function() {
r = elem.getAttribute("htmlFor");
ok(r === "for3", "htmlFor attr = " + r);
elem.setAttribute("testattr", "test");
elem.setAttribute("testattr", "test", 0, "extra arg", 0xdeadbeef);
test_exposed("class", v < 8);
test_exposed("className", true);
test_exposed("for", v < 9);

View file

@ -2170,6 +2170,141 @@ static void test_default_arg_conv(IHTMLWindow2 *window)
IDispatchEx_Release(dispex);
}
static void test_named_args(IHTMLWindow2 *window)
{
DISPID named_args[] = { 0, 2, 1, 1337, 0xdeadbeef, DISPID_THIS };
IHTMLDocument2 *doc;
IDispatchEx *dispex;
IHTMLElement *elem;
VARIANT args[4];
DISPPARAMS dp;
HRESULT hres;
VARIANT var;
DISPID id;
BSTR bstr;
hres = IHTMLWindow2_get_document(window, &doc);
ok(hres == S_OK, "get_document failed: %08x\n", hres);
bstr = SysAllocString(L"div");
hres = IHTMLDocument2_createElement(doc, bstr, &elem);
IHTMLDocument2_Release(doc);
SysFreeString(bstr);
ok(hres == S_OK, "createElement failed: %08x\n", hres);
hres = IHTMLElement_QueryInterface(elem, &IID_IDispatchEx, (void**)&dispex);
ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
bstr = SysAllocString(L"setAttribute");
hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id);
SysFreeString(bstr);
dp.cArgs = 2;
dp.cNamedArgs = 3;
dp.rgvarg = args;
dp.rgdispidNamedArgs = named_args;
V_VT(&args[0]) = VT_BSTR;
V_BSTR(&args[0]) = SysAllocString(L"testattr");
V_VT(&args[1]) = VT_I4;
V_I4(&args[1]) = 0;
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == S_OK, "InvokeEx returned: %08x\n", hres);
hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[0]), 0, &var);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_NULL, "V_VT(var)=%d\n", V_VT(&var));
bstr = SysAllocString(L"0");
hres = IHTMLElement_getAttribute(elem, bstr, 0, &var);
SysFreeString(bstr);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"testattr"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var)));
VariantClear(&var);
dp.cArgs = 3;
V_VT(&args[2]) = VT_BSTR;
V_BSTR(&args[2]) = SysAllocString(L"testval");
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
VariantClear(&args[2]);
ok(hres == DISP_E_TYPEMISMATCH, "InvokeEx returned: %08x\n", hres);
V_VT(&args[2]) = VT_I4;
V_I4(&args[2]) = 0;
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == DISP_E_TYPEMISMATCH, "InvokeEx returned: %08x\n", hres);
args[2] = args[0];
V_VT(&args[1]) = VT_BSTR;
V_BSTR(&args[1]) = SysAllocString(L"testval");
V_VT(&args[0]) = VT_I4;
V_I4(&args[0]) = 0;
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
VariantClear(&args[1]);
hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[2]), 0, &var);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"testval"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var)));
VariantClear(&var);
dp.cArgs = 2;
dp.cNamedArgs = 1;
args[1] = args[2];
V_VT(&args[0]) = VT_BSTR;
V_BSTR(&args[0]) = SysAllocString(L"newValue");
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
VariantClear(&args[0]);
hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[1]), 0, &var);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"newValue"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var)));
VariantClear(&var);
dp.cArgs = 4;
dp.cNamedArgs = ARRAY_SIZE(named_args);
args[3] = args[1];
V_VT(&args[2]) = VT_BSTR;
V_BSTR(&args[2]) = SysAllocString(L"foobar");
V_VT(&args[1]) = VT_I4;
V_I4(&args[1]) = 1;
V_VT(&args[0]) = VT_BSTR;
V_BSTR(&args[0]) = SysAllocString(L"extra");
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
VariantClear(&args[2]);
VariantClear(&args[0]);
hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[3]), 0, &var);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"foobar"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var)));
VariantClear(&var);
dp.cNamedArgs = 1;
named_args[0] = DISPID_THIS;
V_VT(&args[0]) = VT_DISPATCH;
V_DISPATCH(&args[0]) = (IDispatch*)&funcDisp;
V_VT(&args[2]) = VT_BSTR;
V_BSTR(&args[2]) = SysAllocString(L"withThis");
hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
VariantClear(&args[2]);
hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[3]), 0, &var);
ok(hres == S_OK, "getAttribute failed: %08x\n", hres);
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"withThis"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var)));
VariantClear(&args[3]);
VariantClear(&var);
IHTMLElement_Release(elem);
IDispatchEx_Release(dispex);
}
static void test_ui(void)
{
IActiveScriptSiteUIControl *ui_control;
@ -2381,6 +2516,7 @@ static void test_script_run(void)
test_arg_conv(window);
test_default_arg_conv(window);
test_named_args(window);
IHTMLWindow2_Release(window);
tmp = SysAllocString(L"test");