Module: wine Branch: master Commit: 0f5badf44fb476feff7f320e0a993e79c118db9e URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f5badf44fb476feff7f320e0a...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Apr 2 17:39:45 2013 +0200
ieframe: Use IPersistHistory for history navigation, if possible.
---
dlls/ieframe/dochost.c | 28 ++++++++++++++++++++++++++++ dlls/ieframe/ieframe.h | 1 + dlls/ieframe/navigate.c | 45 +++++++++++++++++++++++++++++++-------------- 3 files changed, 60 insertions(+), 14 deletions(-)
diff --git a/dlls/ieframe/dochost.c b/dlls/ieframe/dochost.c index e1a897a..f95c4bd 100644 --- a/dlls/ieframe/dochost.c +++ b/dlls/ieframe/dochost.c @@ -20,6 +20,7 @@
#include "exdispid.h" #include "mshtml.h" +#include "perhist.h" #include "initguid.h"
#include "wine/debug.h" @@ -335,9 +336,33 @@ static LRESULT WINAPI doc_view_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l
static void free_travellog_entry(travellog_entry_t *entry) { + if(entry->stream) + IStream_Release(entry->stream); heap_free(entry->url); }
+static IStream *get_travellog_stream(DocHost *This) +{ + IPersistHistory *persist_history; + IStream *stream; + HRESULT hres; + + hres = IUnknown_QueryInterface(This->document, &IID_IPersistHistory, (void**)&persist_history); + if(FAILED(hres)) + return NULL; + + hres = CreateStreamOnHGlobal(NULL, TRUE, &stream); + if(SUCCEEDED(hres)) + hres = IPersistHistory_SaveHistory(persist_history, stream); + IPersistHistory_Release(persist_history); + if(FAILED(hres)) { + IStream_Release(stream); + return NULL; + } + + return stream; +} + static void update_travellog(DocHost *This) { travellog_entry_t *new_entry; @@ -368,9 +393,12 @@ static void update_travellog(DocHost *This) new_entry = This->travellog.log + This->travellog.position;
new_entry->url = heap_strdupW(This->url); + TRACE("Adding %s at %d\n", debugstr_w(This->url), This->travellog.position); if(!new_entry->url) return;
+ new_entry->stream = get_travellog_stream(This); + if(This->travellog.loading_pos == -1) { This->travellog.position++; }else { diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h index 2508ef2..4140e05 100644 --- a/dlls/ieframe/ieframe.h +++ b/dlls/ieframe/ieframe.h @@ -96,6 +96,7 @@ typedef struct {
typedef struct { WCHAR *url; + IStream *stream; } travellog_entry_t;
typedef struct _IDocHostContainerVtbl diff --git a/dlls/ieframe/navigate.c b/dlls/ieframe/navigate.c index b6e277c..703e32c 100644 --- a/dlls/ieframe/navigate.c +++ b/dlls/ieframe/navigate.c @@ -27,6 +27,7 @@ #include "shlwapi.h" #include "wininet.h" #include "mshtml.h" +#include "perhist.h" #include "resource.h"
#include "wine/debug.h" @@ -1058,30 +1059,46 @@ HRESULT go_home(DocHost *This) return navigate_url(This, wszPageName, NULL, NULL, NULL, NULL); }
-HRESULT go_back(DocHost *This) +static HRESULT navigate_history(DocHost *This, unsigned travellog_pos) { - WCHAR *url; + IPersistHistory *persist_history; + travellog_entry_t *entry; + LARGE_INTEGER li; HRESULT hres;
- if(!This->travellog.position) { - WARN("No history available\n"); - return E_FAIL; + if(!This->doc_navigate) { + FIXME("unsupported doc_navigate FALSE\n"); + return E_NOTIMPL; }
- This->travellog.loading_pos = This->travellog.position-1; - url = This->travellog.log[This->travellog.loading_pos].url; + This->travellog.loading_pos = travellog_pos; + entry = This->travellog.log + This->travellog.loading_pos;
- if(This->doc_navigate) { - hres = async_doc_navigate(This, url, NULL, NULL, 0, FALSE); - }else { - FIXME("unsupported doc_navigate FALSE\n"); - hres = E_NOTIMPL; - } + if(!entry->stream) + return async_doc_navigate(This, entry->url, NULL, NULL, 0, FALSE); + + hres = IUnknown_QueryInterface(This->document, &IID_IPersistHistory, (void**)&persist_history); + if(FAILED(hres)) + return hres; + + li.QuadPart = 0; + IStream_Seek(entry->stream, li, STREAM_SEEK_SET, NULL);
- heap_free(url); + hres = IPersistHistory_LoadHistory(persist_history, entry->stream, NULL); + IPersistHistory_Release(persist_history); return hres; }
+HRESULT go_back(DocHost *This) +{ + if(!This->travellog.position) { + WARN("No history available\n"); + return E_FAIL; + } + + return navigate_history(This, This->travellog.position-1); +} + HRESULT get_location_url(DocHost *This, BSTR *ret) { FIXME("semi-stub\n");