mshtml: Move PerformanceTiming related fields to the window.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
Gabriel Ivăncescu 2023-08-30 16:05:13 +03:00 committed by Alexandre Julliard
parent 15c7470ae0
commit 7bba2546e9
7 changed files with 123 additions and 134 deletions

View file

@ -3913,7 +3913,6 @@ static void HTMLWindow_unlink(DispatchEx *dispex)
This->local_storage = NULL;
IHTMLStorage_Release(local_storage);
}
IHTMLPerformanceTiming_Release(&This->performance_timing->IHTMLPerformanceTiming_iface);
unlink_variant(&This->performance);
}
@ -4313,19 +4312,12 @@ static void *alloc_window(size_t size)
static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, HTMLInnerWindow **ret)
{
HTMLInnerWindow *window;
HRESULT hres;
window = alloc_window(sizeof(HTMLInnerWindow));
if(!window)
return E_OUTOFMEMORY;
window->base.IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
hres = create_performance_timing(&window->performance_timing);
if(FAILED(hres)) {
free(window);
return hres;
}
list_init(&window->children);
list_init(&window->script_hosts);
list_init(&window->bindings);

View file

@ -529,30 +529,6 @@ typedef struct {
HTMLInnerWindow *window;
} OmHistory;
typedef struct {
DispatchEx dispex;
IHTMLPerformanceTiming IHTMLPerformanceTiming_iface;
LONG ref;
ULONGLONG navigation_start_time;
ULONGLONG unload_event_start_time;
ULONGLONG unload_event_end_time;
ULONGLONG redirect_time;
ULONGLONG dns_lookup_time;
ULONGLONG connect_time;
ULONGLONG request_time;
ULONGLONG response_start_time;
ULONGLONG response_end_time;
ULONGLONG dom_interactive_time;
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;
ULONGLONG first_paint_time;
} HTMLPerformanceTiming;
typedef struct nsChannelBSC nsChannelBSC;
struct HTMLWindow {
@ -628,7 +604,6 @@ struct HTMLInnerWindow {
BOOL performance_initialized;
VARIANT performance;
HTMLPerformanceTiming *performance_timing;
unsigned blocking_depth;
unsigned parser_callback_cnt;
@ -647,6 +622,23 @@ struct HTMLInnerWindow {
ULONG navigation_type;
ULONG redirect_count;
ULONGLONG navigation_start_time;
ULONGLONG unload_event_start_time;
ULONGLONG unload_event_end_time;
ULONGLONG redirect_time;
ULONGLONG dns_lookup_time;
ULONGLONG connect_time;
ULONGLONG request_time;
ULONGLONG response_start_time;
ULONGLONG response_end_time;
ULONGLONG dom_interactive_time;
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;
ULONGLONG first_paint_time;
};
typedef enum {
@ -1015,7 +1007,6 @@ HRESULT create_location(HTMLOuterWindow*,HTMLLocation**);
HRESULT create_navigator(compat_mode_t,IOmNavigator**);
HRESULT create_html_screen(compat_mode_t,IHTMLScreen**);
HRESULT create_performance(HTMLInnerWindow*,IHTMLPerformance**);
HRESULT create_performance_timing(HTMLPerformanceTiming**);
HRESULT create_history(HTMLInnerWindow*,OmHistory**);
HRESULT create_namespace_collection(compat_mode_t,IHTMLNamespaceCollection**);
HRESULT create_dom_implementation(HTMLDocumentNode*,IHTMLDOMImplementation**);

View file

@ -313,7 +313,7 @@ static nsresult run_end_load(HTMLDocumentNode *This, nsISupports *arg1, nsISuppo
bind_event_scripts(This);
if(This->window == window) {
window->performance_timing->dom_interactive_time = get_time_stamp();
window->dom_interactive_time = get_time_stamp();
set_ready_state(This->outer_window, READYSTATE_INTERACTIVE);
}
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);

View file

@ -1095,7 +1095,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
IWinInetHttpInfo *wininet_info;
if(This->is_doc_channel)
This->bsc.window->performance_timing->response_start_time = get_time_stamp();
This->bsc.window->response_start_time = get_time_stamp();
This->response_processed = TRUE;
if(This->bsc.binding) {
@ -1356,7 +1356,7 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc)
This->bsc.window->navigation_type = 1; /* TYPE_RELOAD */
This->bsc.window->base.outer_window->base.inner_window->doc->skip_mutation_notif = FALSE;
This->bsc.window->performance_timing->navigation_start_time = get_time_stamp();
This->bsc.window->navigation_start_time = get_time_stamp();
}
return S_OK;
@ -1524,7 +1524,7 @@ static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
nsChannelBSC *This = nsChannelBSC_from_BSCallback(bsc);
if(This->is_doc_channel && This->bsc.window) {
This->bsc.window->performance_timing->response_end_time = get_time_stamp();
This->bsc.window->response_end_time = get_time_stamp();
if(result != E_ABORT) {
if(FAILED(result))
handle_navigation_error(This, result);
@ -1727,21 +1727,21 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG progress, ULONG t
case BINDSTATUS_REDIRECTING:
if(This->is_doc_channel) {
This->bsc.window->redirect_count++;
if(!This->bsc.window->performance_timing->redirect_time)
This->bsc.window->performance_timing->redirect_time = get_time_stamp();
if(!This->bsc.window->redirect_time)
This->bsc.window->redirect_time = get_time_stamp();
}
return handle_redirect(This, status_text);
case BINDSTATUS_FINDINGRESOURCE:
if(This->is_doc_channel && !This->bsc.window->performance_timing->dns_lookup_time)
This->bsc.window->performance_timing->dns_lookup_time = get_time_stamp();
if(This->is_doc_channel && !This->bsc.window->dns_lookup_time)
This->bsc.window->dns_lookup_time = get_time_stamp();
break;
case BINDSTATUS_CONNECTING:
if(This->is_doc_channel)
This->bsc.window->performance_timing->connect_time = get_time_stamp();
This->bsc.window->connect_time = get_time_stamp();
break;
case BINDSTATUS_SENDINGREQUEST:
if(This->is_doc_channel)
This->bsc.window->performance_timing->request_time = get_time_stamp();
This->bsc.window->request_time = get_time_stamp();
break;
case BINDSTATUS_BEGINDOWNLOADDATA: {
IWinInetHttpInfo *http_info;
@ -1798,7 +1798,7 @@ static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code,
HRESULT hres;
if(This->is_doc_channel)
This->bsc.window->performance_timing->response_start_time = get_time_stamp();
This->bsc.window->response_start_time = get_time_stamp();
This->response_processed = TRUE;
This->nschannel->response_status = response_code;

View file

@ -238,7 +238,7 @@ static nsresult handle_dom_content_loaded(HTMLDocumentNode *doc, nsIDOMEvent *ns
HRESULT hres;
if(doc->window)
doc->window->performance_timing->dom_content_loaded_event_start_time = get_time_stamp();
doc->window->dom_content_loaded_event_start_time = get_time_stamp();
hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event);
if(SUCCEEDED(hres)) {
@ -247,7 +247,7 @@ static nsresult handle_dom_content_loaded(HTMLDocumentNode *doc, nsIDOMEvent *ns
}
if(doc->window)
doc->window->performance_timing->dom_content_loaded_event_end_time = get_time_stamp();
doc->window->dom_content_loaded_event_end_time = get_time_stamp();
return NS_OK;
}
@ -345,7 +345,7 @@ static nsresult handle_load(HTMLDocumentNode *doc, nsIDOMEvent *event)
if(doc_obj)
handle_docobj_load(doc_obj);
doc->window->performance_timing->dom_complete_time = get_time_stamp();
doc->window->dom_complete_time = get_time_stamp();
set_ready_state(doc->outer_window, READYSTATE_COMPLETE);
if(doc_obj) {
@ -363,7 +363,7 @@ static nsresult handle_load(HTMLDocumentNode *doc, nsIDOMEvent *event)
IUnknown_Release(doc_obj->outer_unk);
}
doc->window->performance_timing->load_event_start_time = get_time_stamp();
doc->window->load_event_start_time = get_time_stamp();
if(doc->dom_document) {
hres = create_document_event(doc, EVENTID_LOAD, &load_event);
@ -381,7 +381,7 @@ static nsresult handle_load(HTMLDocumentNode *doc, nsIDOMEvent *event)
IDOMEvent_Release(&load_event->IDOMEvent_iface);
}
doc->window->performance_timing->load_event_end_time = get_time_stamp();
doc->window->load_event_end_time = get_time_stamp();
return NS_OK;
}
@ -406,8 +406,7 @@ static nsresult handle_beforeunload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent)
static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent)
{
HTMLPerformanceTiming *timing = NULL;
HTMLInnerWindow *window;
HTMLInnerWindow *window, *pending_window;
DOMEvent *event;
HRESULT hres;
@ -415,11 +414,9 @@ static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent)
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();
pending_window = window->base.outer_window->pending_window;
if(pending_window)
pending_window->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)) {
@ -427,8 +424,8 @@ static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent)
IDOMEvent_Release(&event->IDOMEvent_iface);
}
if(timing)
timing->unload_event_end_time = get_time_stamp();
if(pending_window)
pending_window->unload_event_end_time = get_time_stamp();
return NS_OK;
}

View file

@ -1558,6 +1558,14 @@ HRESULT create_navigator(compat_mode_t compat_mode, IOmNavigator **navigator)
return S_OK;
}
typedef struct {
DispatchEx dispex;
IHTMLPerformanceTiming IHTMLPerformanceTiming_iface;
LONG ref;
HTMLInnerWindow *window;
} HTMLPerformanceTiming;
static inline HTMLPerformanceTiming *impl_from_IHTMLPerformanceTiming(IHTMLPerformanceTiming *iface)
{
return CONTAINING_RECORD(iface, HTMLPerformanceTiming, IHTMLPerformanceTiming_iface);
@ -1602,12 +1610,8 @@ static ULONG WINAPI HTMLPerformanceTiming_Release(IHTMLPerformanceTiming *iface)
TRACE("(%p) ref=%ld\n", This, ref);
if(!ref) {
if(This->dispex.outer)
release_dispex(&This->dispex);
else
free(This);
}
if(!ref)
release_dispex(&This->dispex);
return ref;
}
@ -1649,20 +1653,22 @@ static HRESULT WINAPI HTMLPerformanceTiming_Invoke(IHTMLPerformanceTiming *iface
static ULONGLONG get_fetch_time(HTMLPerformanceTiming *This)
{
HTMLInnerWindow *window = This->window;
/* If there's no prior doc unloaded and no redirects, fetch time == navigationStart time */
if(!This->unload_event_end_time && !This->redirect_time)
return This->navigation_start_time;
if(!window->unload_event_end_time && !window->redirect_time)
return window->navigation_start_time;
if(This->dns_lookup_time)
return This->dns_lookup_time;
if(This->connect_time)
return This->connect_time;
if(This->request_time)
return This->request_time;
if(This->unload_event_end_time)
return This->unload_event_end_time;
if(window->dns_lookup_time)
return window->dns_lookup_time;
if(window->connect_time)
return window->connect_time;
if(window->request_time)
return window->request_time;
if(window->unload_event_end_time)
return window->unload_event_end_time;
return This->redirect_time;
return window->redirect_time;
}
static HRESULT WINAPI HTMLPerformanceTiming_get_navigationStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
@ -1671,7 +1677,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_navigationStart(IHTMLPerformance
TRACE("(%p)->(%p)\n", This, p);
*p = This->navigation_start_time;
*p = This->window->navigation_start_time;
return S_OK;
}
@ -1681,7 +1687,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanc
TRACE("(%p)->(%p)\n", This, p);
*p = This->unload_event_start_time;
*p = This->window->unload_event_start_time;
return S_OK;
}
@ -1691,7 +1697,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceT
TRACE("(%p)->(%p)\n", This, p);
*p = This->unload_event_end_time;
*p = This->window->unload_event_end_time;
return S_OK;
}
@ -1701,7 +1707,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_redirectStart(IHTMLPerformanceTi
TRACE("(%p)->(%p)\n", This, p);
*p = This->redirect_time;
*p = This->window->redirect_time;
return S_OK;
}
@ -1711,7 +1717,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_redirectEnd(IHTMLPerformanceTimi
TRACE("(%p)->(%p)\n", This, p);
*p = This->redirect_time ? get_fetch_time(This) : 0;
*p = This->window->redirect_time ? get_fetch_time(This) : 0;
return S_OK;
}
@ -1731,7 +1737,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domainLookupStart(IHTMLPerforman
TRACE("(%p)->(%p)\n", This, p);
*p = This->dns_lookup_time ? This->dns_lookup_time : get_fetch_time(This);
*p = This->window->dns_lookup_time ? This->window->dns_lookup_time : get_fetch_time(This);
return S_OK;
}
@ -1741,8 +1747,8 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domainLookupEnd(IHTMLPerformance
TRACE("(%p)->(%p)\n", This, p);
*p = This->connect_time ? This->connect_time :
This->dns_lookup_time ? This->dns_lookup_time : get_fetch_time(This);
*p = This->window->connect_time ? This->window->connect_time :
This->window->dns_lookup_time ? This->window->dns_lookup_time : get_fetch_time(This);
return S_OK;
}
@ -1752,8 +1758,8 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_connectStart(IHTMLPerformanceTim
TRACE("(%p)->(%p)\n", This, p);
*p = This->connect_time ? This->connect_time :
This->dns_lookup_time ? This->dns_lookup_time : get_fetch_time(This);
*p = This->window->connect_time ? This->window->connect_time :
This->window->dns_lookup_time ? This->window->dns_lookup_time : get_fetch_time(This);
return S_OK;
}
@ -1763,9 +1769,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_connectEnd(IHTMLPerformanceTimin
TRACE("(%p)->(%p)\n", This, p);
*p = This->request_time ? This->request_time :
This->connect_time ? This->connect_time :
This->dns_lookup_time ? This->dns_lookup_time : get_fetch_time(This);
*p = This->window->request_time ? This->window->request_time :
This->window->connect_time ? This->window->connect_time :
This->window->dns_lookup_time ? This->window->dns_lookup_time : get_fetch_time(This);
return S_OK;
}
@ -1775,9 +1781,9 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_requestStart(IHTMLPerformanceTim
TRACE("(%p)->(%p)\n", This, p);
*p = This->request_time ? This->request_time :
This->connect_time ? This->connect_time :
This->dns_lookup_time ? This->dns_lookup_time : get_fetch_time(This);
*p = This->window->request_time ? This->window->request_time :
This->window->connect_time ? This->window->connect_time :
This->window->dns_lookup_time ? This->window->dns_lookup_time : get_fetch_time(This);
return S_OK;
}
@ -1787,7 +1793,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_responseStart(IHTMLPerformanceTi
TRACE("(%p)->(%p)\n", This, p);
*p = This->response_start_time;
*p = This->window->response_start_time;
return S_OK;
}
@ -1797,7 +1803,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_responseEnd(IHTMLPerformanceTimi
TRACE("(%p)->(%p)\n", This, p);
*p = This->response_end_time;
*p = This->window->response_end_time;
return S_OK;
}
@ -1808,7 +1814,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domLoading(IHTMLPerformanceTimin
TRACE("(%p)->(%p)\n", This, p);
/* Make sure this is after responseEnd, when the Gecko parser starts */
*p = This->response_end_time;
*p = This->window->response_end_time;
return S_OK;
}
@ -1818,7 +1824,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domInteractive(IHTMLPerformanceT
TRACE("(%p)->(%p)\n", This, p);
*p = This->dom_interactive_time;
*p = This->window->dom_interactive_time;
return S_OK;
}
@ -1828,7 +1834,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domContentLoadedEventStart(IHTML
TRACE("(%p)->(%p)\n", This, p);
*p = This->dom_content_loaded_event_start_time;
*p = This->window->dom_content_loaded_event_start_time;
return S_OK;
}
@ -1838,7 +1844,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domContentLoadedEventEnd(IHTMLPe
TRACE("(%p)->(%p)\n", This, p);
*p = This->dom_content_loaded_event_end_time;
*p = This->window->dom_content_loaded_event_end_time;
return S_OK;
}
@ -1848,7 +1854,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_domComplete(IHTMLPerformanceTimi
TRACE("(%p)->(%p)\n", This, p);
*p = This->dom_complete_time;
*p = This->window->dom_complete_time;
return S_OK;
}
@ -1858,7 +1864,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventStart(IHTMLPerformanceT
TRACE("(%p)->(%p)\n", This, p);
*p = This->load_event_start_time;
*p = This->window->load_event_start_time;
return S_OK;
}
@ -1868,7 +1874,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTim
TRACE("(%p)->(%p)\n", This, p);
*p = This->load_event_end_time;
*p = This->window->load_event_end_time;
return S_OK;
}
@ -1878,7 +1884,7 @@ static HRESULT WINAPI HTMLPerformanceTiming_get_msFirstPaint(IHTMLPerformanceTim
TRACE("(%p)->(%p)\n", This, p);
*p = This->first_paint_time;
*p = This->window->first_paint_time;
return S_OK;
}
@ -1936,6 +1942,16 @@ static inline HTMLPerformanceTiming *HTMLPerformanceTiming_from_DispatchEx(Dispa
return CONTAINING_RECORD(iface, HTMLPerformanceTiming, dispex);
}
static void HTMLPerformanceTiming_unlink(DispatchEx *dispex)
{
HTMLPerformanceTiming *This = HTMLPerformanceTiming_from_DispatchEx(dispex);
if(This->window) {
HTMLInnerWindow *window = This->window;
This->window = NULL;
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
}
}
static void HTMLPerformanceTiming_destructor(DispatchEx *dispex)
{
HTMLPerformanceTiming *This = HTMLPerformanceTiming_from_DispatchEx(dispex);
@ -1944,6 +1960,7 @@ static void HTMLPerformanceTiming_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLPerformanceTiming_dispex_vtbl = {
.destructor = HTMLPerformanceTiming_destructor,
.unlink = HTMLPerformanceTiming_unlink
};
static const tid_t HTMLPerformanceTiming_iface_tids[] = {
@ -1957,22 +1974,6 @@ static dispex_static_data_t HTMLPerformanceTiming_dispex = {
HTMLPerformanceTiming_iface_tids
};
HRESULT create_performance_timing(HTMLPerformanceTiming **ret)
{
HTMLPerformanceTiming *timing;
timing = calloc(1, sizeof(*timing));
if(!timing)
return E_OUTOFMEMORY;
timing->IHTMLPerformanceTiming_iface.lpVtbl = &HTMLPerformanceTimingVtbl;
timing->ref = 1;
/* Defer initializing the dispex until it's actually needed (for compat mode) */
*ret = timing;
return S_OK;
}
typedef struct {
DispatchEx dispex;
IHTMLPerformanceNavigation IHTMLPerformanceNavigation_iface;
@ -2163,7 +2164,7 @@ typedef struct {
HTMLInnerWindow *window;
IHTMLPerformanceNavigation *navigation;
HTMLPerformanceTiming *timing;
IHTMLPerformanceTiming *timing;
} HTMLPerformance;
static inline HTMLPerformance *impl_from_IHTMLPerformance(IHTMLPerformance *iface)
@ -2282,7 +2283,25 @@ static HRESULT WINAPI HTMLPerformance_get_timing(IHTMLPerformance *iface, IHTMLP
TRACE("(%p)->(%p)\n", This, p);
IHTMLPerformanceTiming_AddRef(*p = &This->timing->IHTMLPerformanceTiming_iface);
if(!This->timing) {
HTMLPerformanceTiming *timing;
timing = calloc(1, sizeof(*timing));
if(!timing)
return E_OUTOFMEMORY;
timing->IHTMLPerformanceTiming_iface.lpVtbl = &HTMLPerformanceTimingVtbl;
timing->ref = 1;
timing->window = This->window;
IHTMLWindow2_AddRef(&This->window->base.IHTMLWindow2_iface);
init_dispatch(&timing->dispex, (IUnknown*)&timing->IHTMLPerformanceTiming_iface,
&HTMLPerformanceTiming_dispex, dispex_compat_mode(&This->dispex));
This->timing = &timing->IHTMLPerformanceTiming_iface;
}
IHTMLPerformanceTiming_AddRef(*p = This->timing);
return S_OK;
}
@ -2329,7 +2348,7 @@ static void HTMLPerformance_traverse(DispatchEx *dispex, nsCycleCollectionTraver
if(This->navigation)
note_cc_edge((nsISupports*)This->navigation, "navigation", cb);
if(This->timing)
note_cc_edge((nsISupports*)&This->timing->IHTMLPerformanceTiming_iface, "timing", cb);
note_cc_edge((nsISupports*)This->timing, "timing", cb);
}
static void HTMLPerformance_unlink(DispatchEx *dispex)
@ -2341,11 +2360,7 @@ static void HTMLPerformance_unlink(DispatchEx *dispex)
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
}
unlink_ref(&This->navigation);
if(This->timing) {
HTMLPerformanceTiming *timing = This->timing;
This->timing = NULL;
IHTMLPerformanceTiming_Release(&timing->IHTMLPerformanceTiming_iface);
}
unlink_ref(&This->timing);
}
static void HTMLPerformance_destructor(DispatchEx *dispex)
@ -2387,12 +2402,6 @@ HRESULT create_performance(HTMLInnerWindow *window, IHTMLPerformance **ret)
init_dispatch(&performance->dispex, (IUnknown*)&performance->IHTMLPerformance_iface,
&HTMLPerformance_dispex, compat_mode);
performance->timing = window->performance_timing;
IHTMLPerformanceTiming_AddRef(&performance->timing->IHTMLPerformanceTiming_iface);
init_dispatch(&performance->timing->dispex, (IUnknown*)&performance->timing->IHTMLPerformanceTiming_iface,
&HTMLPerformanceTiming_dispex, compat_mode);
*ret = &performance->IHTMLPerformance_iface;
return S_OK;
}

View file

@ -50,8 +50,8 @@ static void paint_document(HTMLDocumentObj *This)
RECT rect;
HDC hdc;
if(This->window && This->window->base.inner_window && !This->window->base.inner_window->performance_timing->first_paint_time)
This->window->base.inner_window->performance_timing->first_paint_time = get_time_stamp();
if(This->window && This->window->base.inner_window && !This->window->base.inner_window->first_paint_time)
This->window->base.inner_window->first_paint_time = get_time_stamp();
GetClientRect(This->hwnd, &rect);