diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index ccb2a56f10a..28c071e124c 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -264,8 +264,12 @@ static void release_inner_window(HTMLInnerWindow *This) if(This->screen) IHTMLScreen_Release(This->screen); - if(This->history) - IOmHistory_Release(This->history); + + if(This->history) { + This->history->window = NULL; + IOmHistory_Release(&This->history->IOmHistory_iface); + } + if(This->mon) IMoniker_Release(This->mon); @@ -763,13 +767,13 @@ static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory ** if(!window->history) { HRESULT hres; - hres = create_history(&window->history); + hres = create_history(window, &window->history); if(FAILED(hres)) return hres; } - IOmHistory_AddRef(window->history); - *p = window->history; + IOmHistory_AddRef(&window->history->IOmHistory_iface); + *p = &window->history->IOmHistory_iface; return S_OK; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c610ef52e69..08c48ce2427 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -28,6 +28,7 @@ #include "objsafe.h" #include "htiframe.h" #include "tlogstg.h" +#include "shdeprecated.h" #include "wine/list.h" #include "wine/unicode.h" @@ -338,6 +339,15 @@ struct HTMLLocation { HTMLInnerWindow *window; }; +typedef struct { + DispatchEx dispex; + IOmHistory IOmHistory_iface; + + LONG ref; + + HTMLInnerWindow *window; +} OmHistory; + typedef struct { HTMLOuterWindow *window; LONG ref; @@ -403,7 +413,7 @@ struct HTMLInnerWindow { HTMLImageElementFactory *image_factory; HTMLOptionElementFactory *option_factory; IHTMLScreen *screen; - IOmHistory *history; + OmHistory *history; IHTMLStorage *session_storage; unsigned parser_callback_cnt; @@ -545,6 +555,8 @@ struct HTMLDocumentObj { IAdviseSink *view_sink; IDocObjectService *doc_object_service; IUnknown *webbrowser; + ITravelLog *travel_log; + IUnknown *browser_service; DOCHOSTUIINFO hostinfo; @@ -738,7 +750,7 @@ HRESULT HTMLImageElementFactory_Create(HTMLInnerWindow*,HTMLImageElementFactory* HRESULT HTMLLocation_Create(HTMLInnerWindow*,HTMLLocation**) DECLSPEC_HIDDEN; IOmNavigator *OmNavigator_Create(void) DECLSPEC_HIDDEN; HRESULT HTMLScreen_Create(IHTMLScreen**) DECLSPEC_HIDDEN; -HRESULT create_history(IOmHistory**) DECLSPEC_HIDDEN; +HRESULT create_history(HTMLInnerWindow*,OmHistory**) DECLSPEC_HIDDEN; HRESULT create_storage(IHTMLStorage**) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c index c463ebe192e..ac15cdf78c2 100644 --- a/dlls/mshtml/oleobj.c +++ b/dlls/mshtml/oleobj.c @@ -215,6 +215,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite HTMLDocument *This = impl_from_IOleObject(iface); IOleCommandTarget *cmdtrg = NULL; IOleWindow *ole_window; + IBrowserService *browser_service; BOOL hostui_setup; VARIANT silent; HWND hwnd; @@ -251,6 +252,16 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite This->doc_obj->webbrowser = NULL; } + if(This->doc_obj->browser_service) { + IUnknown_Release(This->doc_obj->browser_service); + This->doc_obj->browser_service = NULL; + } + + if(This->doc_obj->travel_log) { + ITravelLog_Release(This->doc_obj->travel_log); + This->doc_obj->travel_log = NULL; + } + memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO)); if(!pClientSite) @@ -323,6 +334,20 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite IOleWindow_Release(ole_window); } + hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser, + &IID_IBrowserService, (void**)&browser_service); + if(SUCCEEDED(hres)) { + ITravelLog *travel_log; + + This->doc_obj->browser_service = (IUnknown*)browser_service; + + hres = IBrowserService_GetTravelLog(browser_service, &travel_log); + if(SUCCEEDED(hres)) + This->doc_obj->travel_log = travel_log; + }else { + browser_service = NULL; + } + hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var; @@ -332,16 +357,13 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite if(!hostui_setup) { IDocObjectService *doc_object_service; - IBrowserService *browser_service; IWebBrowser2 *wb; V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&This->window->base.IHTMLWindow2_iface; IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL); - hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser, - &IID_IBrowserService, (void**)&browser_service); - if(SUCCEEDED(hres)) { + if(browser_service) { hres = IBrowserService_QueryInterface(browser_service, &IID_IDocObjectService, (void**)&doc_object_service); if(SUCCEEDED(hres)) { @@ -354,7 +376,6 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite hres = do_query_service((IUnknown*)pClientSite, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb); if(SUCCEEDED(hres)) This->doc_obj->webbrowser = (IUnknown*)wb; - IBrowserService_Release(browser_service); } } } diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 51421d3a9ca..5b564a1c782 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -44,13 +44,6 @@ typedef struct { HTMLMimeTypesCollection *mime_types; } OmNavigator; -typedef struct { - DispatchEx dispex; - IOmHistory IOmHistory_iface; - - LONG ref; -} OmHistory; - static inline OmHistory *impl_from_IOmHistory(IOmHistory *iface) { return CONTAINING_RECORD(iface, OmHistory, IOmHistory_iface); @@ -142,8 +135,17 @@ static HRESULT WINAPI OmHistory_Invoke(IOmHistory *iface, DISPID dispIdMember, R static HRESULT WINAPI OmHistory_get_length(IOmHistory *iface, short *p) { OmHistory *This = impl_from_IOmHistory(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if(!This->window || !This->window->base.outer_window->doc_obj + || !This->window->base.outer_window->doc_obj->travel_log) { + *p = 0; + }else { + *p = ITravelLog_CountEntries(This->window->base.outer_window->doc_obj->travel_log, + This->window->base.outer_window->doc_obj->browser_service); + } + return S_OK; } static HRESULT WINAPI OmHistory_back(IOmHistory *iface, VARIANT *pvargdistance) @@ -193,7 +195,7 @@ static dispex_static_data_t OmHistory_dispex = { }; -HRESULT create_history(IOmHistory **ret) +HRESULT create_history(HTMLInnerWindow *window, OmHistory **ret) { OmHistory *history; @@ -205,7 +207,9 @@ HRESULT create_history(IOmHistory **ret) history->IOmHistory_iface.lpVtbl = &OmHistoryVtbl; history->ref = 1; - *ret = &history->IOmHistory_iface; + history->window = window; + + *ret = history; return S_OK; } diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index f1fa06e63c7..7531a402001 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -5291,7 +5291,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) CHECK_CALLED(Exec_ShellDocView_37); todo_wine CHECK_CALLED_BROKEN(IsErrorUrl); }else { - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); } CHECK_CALLED_BROKEN(Exec_ShellDocView_84); todo_wine CHECK_CALLED(GetPendingUrl); @@ -6377,7 +6377,7 @@ static void test_ClientSite(IOleObject *oleobj, DWORD flags) CHECK_CALLED(Invoke_AMBIENT_USERAGENT); CLEAR_CALLED(Invoke_AMBIENT_PALETTE); /* not called on IE9 */ CLEAR_CALLED(GetOverrideKeyPath); /* Called by IE9 */ - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); CHECK_CALLED_BROKEN(Exec_ShellDocView_84); set_clientsite = TRUE; @@ -7706,7 +7706,7 @@ static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw) CHECK_CALLED(QueryStatus_SETPROGRESSTEXT); CHECK_CALLED(Exec_SETPROGRESSMAX); CHECK_CALLED(Exec_SETPROGRESSPOS); - todo_wine CHECK_CALLED(GetTravelLog); + CHECK_CALLED(GetTravelLog); CHECK_CALLED_BROKEN(Exec_ShellDocView_84); hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);