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