Module: wine Branch: master Commit: ebd7f4e7f2e8a6c79c387f1d03d47f2868320d0c URL: https://gitlab.winehq.org/wine/wine/-/commit/ebd7f4e7f2e8a6c79c387f1d03d47f2...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Wed Apr 12 18:34:59 2023 +0300
mshtml: Implement ProgressEvent's initProgressEvent method.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/htmlevent.c | 28 +++++++++++++++++++++++++--- dlls/mshtml/tests/es5.js | 13 +++++++++++++ dlls/mshtml/tests/xhr.js | 5 +++++ 3 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index bccdfb81121..d978b626be6 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2583,6 +2583,7 @@ typedef struct { DOMEvent event; IDOMProgressEvent IDOMProgressEvent_iface; nsIDOMProgressEvent *nsevent; + BOOL manual_init; } DOMProgressEvent;
static inline DOMProgressEvent *impl_from_IDOMProgressEvent(IDOMProgressEvent *iface) @@ -2670,7 +2671,7 @@ static HRESULT WINAPI DOMProgressEvent_get_total(IDOMProgressEvent *iface, ULONG
TRACE("(%p)->(%p)\n", This, p);
- if(NS_FAILED(nsIDOMProgressEvent_GetLengthComputable(This->nsevent, &b)) || !b) { + if(!This->manual_init && (NS_FAILED(nsIDOMProgressEvent_GetLengthComputable(This->nsevent, &b)) || !b)) { *p = ~0; return S_OK; } @@ -2683,9 +2684,30 @@ static HRESULT WINAPI DOMProgressEvent_initProgressEvent(IDOMProgressEvent *ifac ULONGLONG loaded, ULONGLONG total) { DOMProgressEvent *This = impl_from_IDOMProgressEvent(iface); - FIXME("(%p)->(%s %x %x %x %s %s)\n", This, debugstr_w(type), can_bubble, cancelable, lengthComputable, + nsAString type_str; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%s %x %x %x %s %s)\n", This, debugstr_w(type), can_bubble, cancelable, lengthComputable, wine_dbgstr_longlong(loaded), wine_dbgstr_longlong(total)); - return E_NOTIMPL; + + if(This->event.target) { + TRACE("called on already dispatched event\n"); + return S_OK; + } + + hres = IDOMEvent_initEvent(&This->event.IDOMEvent_iface, type, can_bubble, cancelable); + if(SUCCEEDED(hres)) { + nsAString_InitDepend(&type_str, type); + nsres = nsIDOMProgressEvent_InitProgressEvent(This->nsevent, &type_str, !!can_bubble, !!cancelable, + !!lengthComputable, loaded, total); + nsAString_Finish(&type_str); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + This->manual_init = TRUE; + } + + return hres; }
static const IDOMProgressEventVtbl DOMProgressEventVtbl = { diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index e13ad055f4f..b2f63c77c83 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2095,3 +2095,16 @@ sync_test("matchMedia", function() { mql = window.matchMedia("(max-width: 1000px)"); ok(mql.matches === true, "(max-width: 1000px) does not match"); }); + +sync_test("initProgressEvent", function() { + var e = document.createEvent("ProgressEvent"); + e.initProgressEvent("loadend", false, false, true, 13, 42); + ok(e.lengthComputable === true, "lengthComputable = " + e.lengthComputable); + ok(e.loaded === 13, "loaded = " + e.loaded); + ok(e.total === 42, "total = " + e.total); + + e.initProgressEvent("loadstart", false, false, false, 99, 50); + ok(e.lengthComputable === false, "lengthComputable after re-init = " + e.lengthComputable); + ok(e.loaded === 99, "loaded after re-init = " + e.loaded); + ok(e.total === 50, "total after re-init = " + e.total); +}); diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 2deb526cfe1..336f03c1b2f 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -319,6 +319,11 @@ function test_timeout() { ok(e.lengthComputable === false, "lengthComputable = " + e.lengthComputable); ok(e.loaded === 0, "loaded = " + e.loaded); ok(e.total === 18446744073709552000, "total = " + e.total); + + e.initProgressEvent("timeout", false, false, true, 13, 42); + ok(e.lengthComputable === false, "lengthComputable after initProgressEvent = " + e.lengthComputable); + ok(e.loaded === 0, "loaded after initProgressEvent = " + e.loaded); + ok(e.total === 18446744073709552000, "total after initProgressEvent = " + e.total); } next_test(); }