From 00226935c79c9fa06b597eb5526159048c114989 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 2 Apr 2013 17:39:21 +0200 Subject: [PATCH] ieframe: Fixed index of stored history when loading from history. --- dlls/ieframe/dochost.c | 50 ++++++++++++++++++++++++++++++--------------- dlls/ieframe/ieframe.h | 1 + dlls/ieframe/navigate.c | 3 ++- dlls/ieframe/shellbrowser.c | 9 +++++++- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/dlls/ieframe/dochost.c b/dlls/ieframe/dochost.c index c910c749b83..07881324875 100644 --- a/dlls/ieframe/dochost.c +++ b/dlls/ieframe/dochost.c @@ -195,6 +195,12 @@ void set_doc_state(DocHost *This, READYSTATE doc_state) static void update_ready_state(DocHost *This, READYSTATE ready_state) { + if(ready_state > READYSTATE_LOADING && This->travellog.loading_pos != -1) { + WARN("histupdate not notified\n"); + This->travellog.position = This->travellog.loading_pos; + This->travellog.loading_pos = -1; + } + if(ready_state > READYSTATE_LOADING && This->doc_state <= READYSTATE_LOADING && !This->browser_service /* FIXME */) notif_complete(This, DISPID_NAVIGATECOMPLETE2); @@ -331,25 +337,28 @@ static void update_travellog(DocHost *This) { travellog_entry_t *new_entry; - if(!This->travellog.log) { - This->travellog.log = heap_alloc(4 * sizeof(*This->travellog.log)); - if(!This->travellog.log) - return; + if(This->travellog.loading_pos == -1) { + /* Clear forward history. */ + if(!This->travellog.log) { + This->travellog.log = heap_alloc(4 * sizeof(*This->travellog.log)); + if(!This->travellog.log) + return; - This->travellog.size = 4; - }else if(This->travellog.size < This->travellog.position+1) { - travellog_entry_t *new_travellog; + This->travellog.size = 4; + }else if(This->travellog.size < This->travellog.position+1) { + travellog_entry_t *new_travellog; - new_travellog = heap_realloc(This->travellog.log, This->travellog.size*2*sizeof(*This->travellog.log)); - if(!new_travellog) - return; + new_travellog = heap_realloc(This->travellog.log, This->travellog.size*2*sizeof(*This->travellog.log)); + if(!new_travellog) + return; - This->travellog.log = new_travellog; - This->travellog.size *= 2; - } + This->travellog.log = new_travellog; + This->travellog.size *= 2; + } - while(This->travellog.length > This->travellog.position) - heap_free(This->travellog.log[--This->travellog.length].url); + while(This->travellog.length > This->travellog.position) + heap_free(This->travellog.log[--This->travellog.length].url); + } new_entry = This->travellog.log + This->travellog.position; @@ -357,7 +366,14 @@ static void update_travellog(DocHost *This) if(!new_entry->url) return; - This->travellog.position++; + if(This->travellog.loading_pos == -1) { + This->travellog.position++; + }else { + This->travellog.position = This->travellog.loading_pos; + This->travellog.loading_pos = -1; + } + if(This->travellog.position > This->travellog.length) + This->travellog.length = This->travellog.position; } void create_doc_view_hwnd(DocHost *This) @@ -975,6 +991,8 @@ void DocHost_Init(DocHost *This, IWebBrowser2 *wb, const IDocHostContainerVtbl* This->ready_state = READYSTATE_UNINITIALIZED; list_init(&This->task_queue); + This->travellog.loading_pos = -1; + DocHost_ClientSite_Init(This); DocHost_Frame_Init(This); diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h index a20afbc53ab..2508ef256a6 100644 --- a/dlls/ieframe/ieframe.h +++ b/dlls/ieframe/ieframe.h @@ -158,6 +158,7 @@ struct DocHost { unsigned size; unsigned length; unsigned position; + int loading_pos; } travellog; ConnectionPointContainer cps; diff --git a/dlls/ieframe/navigate.c b/dlls/ieframe/navigate.c index 42d0c855980..b6e277c0c51 100644 --- a/dlls/ieframe/navigate.c +++ b/dlls/ieframe/navigate.c @@ -1068,7 +1068,8 @@ HRESULT go_back(DocHost *This) return E_FAIL; } - url = This->travellog.log[--This->travellog.position].url; + This->travellog.loading_pos = This->travellog.position-1; + url = This->travellog.log[This->travellog.loading_pos].url; if(This->doc_navigate) { hres = async_doc_navigate(This, url, NULL, NULL, 0, FALSE); diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c index 6e842643907..944c7bcd48e 100644 --- a/dlls/ieframe/shellbrowser.c +++ b/dlls/ieframe/shellbrowser.c @@ -726,6 +726,7 @@ static HRESULT WINAPI DocObjectService_FireNavigateComplete2( DWORD dwFlags) { ShellBrowser *This = impl_from_IDocObjectService(iface); + DocHost *doc_host = This->doc_host; IHTMLPrivateWindow *priv_window; VARIANTARG params[2]; DISPPARAMS dp = {params, NULL, 2, 0}; @@ -735,6 +736,12 @@ static HRESULT WINAPI DocObjectService_FireNavigateComplete2( TRACE("%p %p %x\n", This, pHTMLWindow2, dwFlags); + if(doc_host->travellog.loading_pos != -1) { + WARN("histupdate not notified\n"); + doc_host->travellog.position = doc_host->travellog.loading_pos; + doc_host->travellog.loading_pos = -1; + } + hres = IHTMLWindow2_QueryInterface(pHTMLWindow2, &IID_IHTMLPrivateWindow, (void**)&priv_window); if(FAILED(hres)) return hres; @@ -751,7 +758,7 @@ static HRESULT WINAPI DocObjectService_FireNavigateComplete2( V_VARIANTREF(params) = &url_var; V_VT(params+1) = VT_DISPATCH; - V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb; + V_DISPATCH(params+1) = (IDispatch*)doc_host->wb; V_VT(&url_var) = VT_BSTR; V_BSTR(&url_var) = url; -- 2.11.4.GIT