Module: wine Branch: master Commit: 020a020df1a944985c6341726f4daf5acd85a7e1 URL: https://gitlab.winehq.org/wine/wine/-/commit/020a020df1a944985c6341726f4daf5...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Tue Nov 22 18:26:22 2022 +0200
mshtml: Implement performance.timing.unloadEventStart & unloadEventEnd.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/htmlwindow.c | 3 +++ dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/nsevents.c | 10 ++++++++++ dlls/mshtml/omnavigator.c | 8 ++++---- dlls/mshtml/tests/documentmode.js | 2 ++ 5 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 9f64e3526c6..ec7fc0d43f2 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4125,6 +4125,9 @@ HRESULT create_outer_window(GeckoBrowser *browser, mozIDOMWindowProxy *mozwindow return hres; }
+ /* Initial empty doc does not have unload events or timings */ + window->base.inner_window->doc->unload_sent = TRUE; + if(parent) { IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index db72f29e1a3..ef21507d553 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -510,6 +510,8 @@ typedef struct { LONG ref;
ULONGLONG navigation_start_time; + ULONGLONG unload_event_start_time; + ULONGLONG unload_event_end_time; ULONGLONG redirect_time; } HTMLPerformanceTiming;
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 0248737b012..1c4bdee4e1d 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -384,6 +384,7 @@ static nsresult NSAPI handle_unload(nsIDOMEventListener *iface, nsIDOMEvent *nse { nsEventListener *This = impl_from_nsIDOMEventListener(iface); HTMLDocumentNode *doc = This->This->doc; + HTMLPerformanceTiming *timing = NULL; HTMLInnerWindow *window; DOMEvent *event; HRESULT hres; @@ -392,12 +393,21 @@ static nsresult NSAPI handle_unload(nsIDOMEventListener *iface, nsIDOMEvent *nse return NS_OK; doc->unload_sent = TRUE;
+ if(window->base.outer_window->pending_window) + timing = window->base.outer_window->pending_window->performance_timing; + + if(timing) + timing->unload_event_start_time = get_time_stamp(); + hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&window->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); }
+ if(timing) + timing->unload_event_end_time = get_time_stamp(); + return NS_OK; }
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 57c59eaddca..194d3a7a931 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -1601,9 +1601,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanc { HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
- FIXME("(%p)->(%p) returning fake value\n", This, p); + TRACE("(%p)->(%p)\n", This, p);
- *p = TIMING_FAKE_TIMESTAMP; + *p = This->unload_event_start_time; return S_OK; }
@@ -1611,9 +1611,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceT { HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
- FIXME("(%p)->(%p) returning fake value\n", This, p); + TRACE("(%p)->(%p)\n", This, p);
- *p = TIMING_FAKE_TIMESTAMP; + *p = This->unload_event_end_time; return S_OK; }
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index f0a91fea545..a9c2b36ceee 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -20,6 +20,8 @@ var compat_version; var tests = [];
ok(performance.timing.navigationStart > 0, "navigationStart <= 0"); +ok(performance.timing.unloadEventStart === 0, "unloadEventStart != 0"); +ok(performance.timing.unloadEventEnd === 0, "unloadEventEnd != 0"); ok(performance.timing.redirectStart === 0, "redirectStart != 0");
var pageshow_fired = false, pagehide_fired = false;