ieframe: Fixed index of stored history when loading from history.

This commit is contained in:
Jacek Caban 2013-04-02 17:39:21 +02:00 committed by Alexandre Julliard
parent 15937c99eb
commit 00226935c7
4 changed files with 45 additions and 18 deletions

View file

@ -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,33 +337,43 @@ 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;
new_entry->url = heap_strdupW(This->url);
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);

View file

@ -158,6 +158,7 @@ struct DocHost {
unsigned size;
unsigned length;
unsigned position;
int loading_pos;
} travellog;
ConnectionPointContainer cps;

View file

@ -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);

View file

@ -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;