From: Gabriel Ivăncescu gabrielopcode@gmail.com
Otherwise, script56.chm's javascript will keep reloading the image and triggering onload events non-stop. It protects against this using a variable "noReentry", which is only set temporarily while setting the source, so it expects it to be triggered synchronously.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53927 Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlimg.c | 25 +++++++++++++++++++++++++ dlls/mshtml/tests/events.c | 15 ++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index e779dd2dec7..e4898e081e9 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -283,9 +283,34 @@ static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v) HTMLImg *This = impl_from_IHTMLImgElement(iface); nsAString src_str; nsresult nsres; + HRESULT hres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+ nsAString_Init(&src_str, NULL); + nsres = nsIDOMHTMLImageElement_GetSrc(This->nsimg, &src_str); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *src; + DOMEvent *event; + VARIANT_BOOL b; + BOOL same; + + nsAString_GetData(&src_str, &src); + same = !wcscmp(v, src); + nsAString_Finish(&src_str); + if(same) { + hres = IHTMLImgElement_get_complete(&This->IHTMLImgElement_iface, &b); + if(SUCCEEDED(hres) && b) { + hres = create_document_event(This->element.node.doc, EVENTID_LOAD, &event); + if(SUCCEEDED(hres)) { + dispatch_event(&This->element.node.event_target, event); + IDOMEvent_Release(&event->IDOMEvent_iface); + } + return hres; + } + } + } + nsAString_InitDepend(&src_str, v); nsres = nsIDOMHTMLImageElement_SetSrc(This->nsimg, &src_str); nsAString_Finish(&src_str); diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 643993bc475..c3223eca1d2 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -2251,6 +2251,7 @@ static void test_imgload(IHTMLDocument2 *doc) { IHTMLImgElement *img; IHTMLElement *elem; + VARIANT_BOOL b; VARIANT v; BSTR str; HRESULT hres; @@ -2292,12 +2293,24 @@ static void test_imgload(IHTMLDocument2 *doc) str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.pn..."); hres = IHTMLImgElement_put_src(img, str); ok(hres == S_OK, "put_src failed: %08lx\n", hres); - SysFreeString(str);
SET_EXPECT(img_onload); pump_msgs(&called_img_onload); CHECK_CALLED(img_onload);
+ hres = IHTMLImgElement_get_complete(img, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_TRUE, "complete = %x\n", b); + + /* same src sends synchronous load event */ + SET_EXPECT(img_onload); + hres = IHTMLImgElement_put_src(img, str); + ok(hres == S_OK, "put_src failed: %08lx\n", hres); + CHECK_CALLED(img_onload); + SysFreeString(str); + + pump_msgs(NULL); + SET_EXPECT(img_onerror);
str = SysAllocString(L"about:blank");