Jacek Caban : ieframe: Fixed index of stored history when loading from history.
Alexandre Julliard
julliard at winehq.org
Tue Apr 2 13:38:37 CDT 2013
Module: wine
Branch: master
Commit: 00226935c79c9fa06b597eb5526159048c114989
URL: http://source.winehq.org/git/wine.git/?a=commit;h=00226935c79c9fa06b597eb5526159048c114989
Author: Jacek Caban <jacek at 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;
More information about the wine-cvs
mailing list