Module: wine Branch: master Commit: 72b13c5ab844a19793760ab6a4e1c5c9b6f99cd7 URL: https://gitlab.winehq.org/wine/wine/-/commit/72b13c5ab844a19793760ab6a4e1c5c...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Tue Nov 22 18:26:22 2022 +0200
mshtml: Implement performance.timing.loadEventStart & loadEventEnd.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/nsevents.c | 4 ++++ dlls/mshtml/omnavigator.c | 8 ++++---- dlls/mshtml/tests/documentmode.js | 5 +++++ 4 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c0197195ad4..342c064bec9 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -522,6 +522,8 @@ typedef struct { ULONGLONG dom_complete_time; ULONGLONG dom_content_loaded_event_start_time; ULONGLONG dom_content_loaded_event_end_time; + ULONGLONG load_event_start_time; + ULONGLONG load_event_end_time; } HTMLPerformanceTiming;
typedef struct nsChannelBSC nsChannelBSC; diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index e35e4d7ae80..b0f55dfe35f 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -363,6 +363,8 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event IDocObjectService_FireDocumentComplete(doc_obj->doc_object_service, &doc->outer_window->base.IHTMLWindow2_iface, 0);
+ doc->window->performance_timing->load_event_start_time = get_time_stamp(); + if(doc->dom_document) { hres = create_document_event(doc, EVENTID_LOAD, &load_event); if(SUCCEEDED(hres)) { @@ -379,6 +381,8 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event IDOMEvent_Release(&load_event->IDOMEvent_iface); }
+ doc->window->performance_timing->load_event_end_time = get_time_stamp(); + IHTMLDOMNode_Release(&doc->node.IHTMLDOMNode_iface); return NS_OK; } diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 6b5555bcf44..c4133b418a0 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -1796,9 +1796,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventStart(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->load_event_start_time; return S_OK; }
@@ -1806,9 +1806,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTim { 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->load_event_end_time; return S_OK; }
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 237ac224cbb..30d4a790261 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -33,6 +33,8 @@ ok(performance.timing.domInteractive === 0, "domInteractive != 0"); ok(performance.timing.domComplete === 0, "domComplete != 0"); ok(performance.timing.domContentLoadedEventStart === 0, "domContentLoadedEventStart != 0"); ok(performance.timing.domContentLoadedEventEnd === 0, "domContentLoadedEventEnd != 0"); +ok(performance.timing.loadEventStart === 0, "loadEventStart != 0"); +ok(performance.timing.loadEventEnd === 0, "loadEventEnd != 0"); ok(performance.timing.unloadEventStart === 0, "unloadEventStart != 0"); ok(performance.timing.unloadEventEnd === 0, "unloadEventEnd != 0"); ok(performance.timing.redirectStart === 0, "redirectStart != 0"); @@ -59,6 +61,7 @@ if(window.addEventListener) { ok(r === "[object PageTransitionEvent]", "pageshow toString = " + r); ok("persisted" in e, "'persisted' not in pageshow event"); ok(document.readyState === "complete", "pageshow readyState = " + document.readyState); + ok(performance.timing.loadEventEnd > 0, "loadEventEnd <= 0 in pageshow handler"); }, true);
window.addEventListener("pagehide", function(e) { @@ -84,6 +87,8 @@ sync_test("performance timing", function() { ok(performance.timing.domContentLoadedEventStart >= performance.timing.domInteractive, "domContentLoadedEventStart < domInteractive"); ok(performance.timing.domContentLoadedEventEnd >= performance.timing.domContentLoadedEventStart, "domContentLoadedEventEnd < domContentLoadedEventStart"); ok(performance.timing.domComplete >= performance.timing.domContentLoadedEventEnd, "domComplete < domContentLoadedEventEnd"); + ok(performance.timing.loadEventStart >= performance.timing.domComplete, "loadEventStart < domComplete"); + ok(performance.timing.loadEventEnd >= performance.timing.loadEventStart, "loadEventEnd < loadEventStart"); });
sync_test("page transition events", function() {