mshtml: Return E_ABORT from postMessage called without a caller ServiceProvider.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
Gabriel Ivăncescu 2024-02-05 16:15:23 +02:00 committed by Alexandre Julliard
parent b9e4680dea
commit 69d4be9ff0
2 changed files with 6 additions and 7 deletions

View file

@ -2473,18 +2473,14 @@ static HRESULT post_message(HTMLInnerWindow *window, VARIANT msg, BSTR targetOri
static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VARIANT targetOrigin)
{
HTMLWindow *This = impl_from_IHTMLWindow6(iface);
VARIANT var, transfer;
TRACE("(%p)->(%s %s)\n", This, debugstr_w(msg), debugstr_variant(&targetOrigin));
if(V_VT(&targetOrigin) != VT_BSTR)
return E_INVALIDARG;
V_VT(&var) = VT_BSTR;
V_BSTR(&var) = msg;
V_VT(&transfer) = VT_EMPTY;
return post_message(This->inner_window, var, V_BSTR(&targetOrigin), transfer, NULL,
dispex_compat_mode(&This->inner_window->event_target.dispex));
/* This can't obtain the source, and never works even in IE9+ modes... */
return E_ABORT;
}
static HRESULT WINAPI HTMLWindow6_toStaticHTML(IHTMLWindow6 *iface, BSTR bstrHTML, BSTR *pbstrStaticHTML)

View file

@ -3218,7 +3218,6 @@ static void test_message_event(IHTMLDocument2 *doc)
ok(hres == S_OK, "get_onmessage failed: %08lx\n", hres);
ok(V_VT(&v[0]) == VT_DISPATCH, "V_VT(onmessage) = %d\n", V_VT(&v[0]));
ok(V_DISPATCH(&v[0]) == (IDispatch*)&onmessage_obj, "V_DISPATCH(onmessage) = %p\n", V_DISPATCH(&v[0]));
IHTMLWindow6_Release(window6);
if(document_mode >= 9)
add_event_listener((IUnknown*)doc, L"message", (IDispatch*)&onmessage_obj, VARIANT_TRUE);
@ -3227,6 +3226,10 @@ static void test_message_event(IHTMLDocument2 *doc)
V_BSTR(&v[1]) = SysAllocString(L"foobar");
V_VT(&v[0]) = VT_BSTR;
V_BSTR(&v[0]) = SysAllocString(L"*");
bstr = SysAllocString(L"foobar");
hres = IHTMLWindow6_postMessage(window6, V_BSTR(&v[1]), v[0]);
ok(hres == E_ABORT, "postMessage returned: %08lx\n", hres);
IHTMLWindow6_Release(window6);
hres = IHTMLWindow2_QueryInterface(window, &IID_IDispatchEx, (void**)&dispex);
ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);