Module: wine Branch: master Commit: 00226935c79c9fa06b597eb5526159048c114989 URL: http://source.winehq.org/git/wine.git/?a=commit;h=00226935c79c9fa06b597eb552...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Apr 2 17:39:21 2013 +0200
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 c910c74..0788132 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 a20afbc5..2508ef2 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 42d0c85..b6e277c 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 6e84264..944c7bc 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;