Piotr Caban : mshtml: Added IOmHistory::get_length implementation.

Alexandre Julliard julliard at winehq.org
Tue Apr 23 13:52:24 CDT 2013


Module: wine
Branch: master
Commit: 019a1af76e3c5e6bab394215f075eb1545e880b0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=019a1af76e3c5e6bab394215f075eb1545e880b0

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Apr 23 16:21:04 2013 +0200

mshtml: Added IOmHistory::get_length implementation.

---

 dlls/mshtml/htmlwindow.c     |   14 +++++++++-----
 dlls/mshtml/mshtml_private.h |   16 ++++++++++++++--
 dlls/mshtml/oleobj.c         |   31 ++++++++++++++++++++++++++-----
 dlls/mshtml/omnavigator.c    |   26 +++++++++++++++-----------
 dlls/mshtml/tests/htmldoc.c  |    6 +++---
 5 files changed, 67 insertions(+), 26 deletions(-)

diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index ccb2a56..28c071e 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 c610ef5..08c48ce 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"
@@ -339,6 +340,15 @@ struct HTMLLocation {
 };
 
 typedef struct {
+    DispatchEx dispex;
+    IOmHistory IOmHistory_iface;
+
+    LONG ref;
+
+    HTMLInnerWindow *window;
+} OmHistory;
+
+typedef struct {
     HTMLOuterWindow *window;
     LONG ref;
 }  windowref_t;
@@ -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 c463ebe..ac15cdf 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 51421d3..5b564a1 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 f1fa06e..7531a40 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);




More information about the wine-cvs mailing list