Module: wine Branch: master Commit: 9a3aa863be37f14b355a61a4df75345d9865de46 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a3aa863be37f14b355a61a4df...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Jul 27 16:45:49 2011 +0200
mshtml: Added IHTMLEventObj::put_returnValue implementation.
---
dlls/mshtml/htmlevent.c | 13 ++++++- dlls/mshtml/tests/events.c | 79 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index d0e8814..f638b9a 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -434,8 +434,17 @@ static HRESULT WINAPI HTMLEventObj_get_shiftKey(IHTMLEventObj *iface, VARIANT_BO static HRESULT WINAPI HTMLEventObj_put_returnValue(IHTMLEventObj *iface, VARIANT v) { HTMLEventObj *This = impl_from_IHTMLEventObj(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + if(V_VT(&v) != VT_BOOL) { + FIXME("unsupported vt %d\n", V_VT(&v)); + return DISP_E_BADVARTYPE; + } + + if(!V_BOOL(&v)) + This->prevent_default = TRUE; + return S_OK; }
static HRESULT WINAPI HTMLEventObj_get_returnValue(IHTMLEventObj *iface, VARIANT *p) diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index fa2fb6f..55baaca 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -77,6 +77,7 @@ DEFINE_EXPECT(form_onsubmit); DEFINE_EXPECT(form_onclick); DEFINE_EXPECT(submit_onclick); DEFINE_EXPECT(submit_onclick_attached); +DEFINE_EXPECT(submit_onclick_setret);
static HWND container_hwnd = NULL; static IHTMLWindow2 *window; @@ -989,6 +990,33 @@ static HRESULT WINAPI submit_onclick_attached(IDispatchEx *iface, DISPID id, LCI
EVENT_HANDLER_FUNC_OBJ(submit_onclick_attached);
+static VARIANT onclick_retval, onclick_event_retval; + +static HRESULT WINAPI submit_onclick_setret(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + IHTMLEventObj *event; + HRESULT hres; + + CHECK_EXPECT(submit_onclick_setret); + test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_src("INPUT"); + + event = NULL; + hres = IHTMLWindow2_get_event(window, &event); + ok(hres == S_OK, "get_event failed: %08x\n", hres); + ok(event != NULL, "event == NULL\n"); + + hres = IHTMLEventObj_put_returnValue(event, onclick_event_retval); + ok(hres == S_OK, "put_returnValue failed: %08x\n", hres); + IHTMLEventObj_Release(event); + + *pvarRes = onclick_retval; + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(submit_onclick_setret); + static HRESULT WINAPI iframedoc_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { @@ -1778,6 +1806,57 @@ static void test_submit(IHTMLDocument2 *doc)
unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, cp_cookie);
+ V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&submit_onclick_setret_obj; + hres = IHTMLElement_put_onclick(submit, v); + ok(hres == S_OK, "put_onclick failed: %08x\n", hres); + + V_VT(&onclick_retval) = VT_BOOL; + V_BOOL(&onclick_retval) = VARIANT_TRUE; + V_VT(&onclick_event_retval) = VT_BOOL; + V_BOOL(&onclick_event_retval) = VARIANT_TRUE; + + SET_EXPECT(submit_onclick_setret); + SET_EXPECT(form_onclick); + SET_EXPECT(form_onsubmit); + hres = IHTMLElement_click(submit); + ok(hres == S_OK, "click failed: %08x\n", hres); + CHECK_CALLED(submit_onclick_setret); + CHECK_CALLED(form_onclick); + CHECK_CALLED(form_onsubmit); + + V_VT(&onclick_event_retval) = VT_BOOL; + V_BOOL(&onclick_event_retval) = VARIANT_FALSE; + + SET_EXPECT(submit_onclick_setret); + SET_EXPECT(form_onclick); + hres = IHTMLElement_click(submit); + ok(hres == S_OK, "click failed: %08x\n", hres); + CHECK_CALLED(submit_onclick_setret); + CHECK_CALLED(form_onclick); + + V_VT(&onclick_retval) = VT_BOOL; + V_BOOL(&onclick_retval) = VARIANT_FALSE; + V_VT(&onclick_event_retval) = VT_BOOL; + V_BOOL(&onclick_event_retval) = VARIANT_TRUE; + + SET_EXPECT(submit_onclick_setret); + SET_EXPECT(form_onclick); + hres = IHTMLElement_click(submit); + ok(hres == S_OK, "click failed: %08x\n", hres); + CHECK_CALLED(submit_onclick_setret); + CHECK_CALLED(form_onclick); + + V_VT(&onclick_event_retval) = VT_BOOL; + V_BOOL(&onclick_event_retval) = VARIANT_FALSE; + + SET_EXPECT(submit_onclick_setret); + SET_EXPECT(form_onclick); + hres = IHTMLElement_click(submit); + ok(hres == S_OK, "click failed: %08x\n", hres); + CHECK_CALLED(submit_onclick_setret); + CHECK_CALLED(form_onclick); + IHTMLElement_Release(submit); }