Jacek Caban : mshtml: Store embedder' s IOleComandTarget iface in HTMLDocumentObj and use it in handle_navigation_error .

Alexandre Julliard julliard at winehq.org
Mon Nov 12 14:14:40 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 12 12:58:27 2012 +0100

mshtml: Store embedder's IOleComandTarget iface in HTMLDocumentObj and use it in handle_navigation_error.

---

 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/navigate.c       |   11 +++--------
 dlls/mshtml/oleobj.c         |    9 +++++++--
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 74f1b39..3a02416 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -531,6 +531,7 @@ struct HTMLDocumentObj {
 
     IOleClientSite *client;
     IDocHostUIHandler *hostui;
+    IOleCommandTarget *client_cmdtrg;
     BOOL custom_hostui;
     IOleInPlaceSite *ipsite;
     IOleInPlaceFrame *frame;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 9532a82..1c6b80c 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1450,7 +1450,6 @@ static void handle_navigation_error(nsChannelBSC *This, DWORD result)
 {
     HTMLOuterWindow *outer_window;
     HTMLDocumentObj *doc;
-    IOleCommandTarget *olecmd;
     BOOL is_error_url;
     SAFEARRAY *sa;
     SAFEARRAYBOUND bound;
@@ -1473,18 +1472,15 @@ static void handle_navigation_error(nsChannelBSC *This, DWORD result)
     if(FAILED(hres) || is_error_url)
         return;
 
-    hres = IOleClientSite_QueryInterface(doc->client,
-            &IID_IOleCommandTarget, (void**)&olecmd);
+    if(!doc->client_cmdtrg)
     if(FAILED(hres))
         return;
 
     bound.lLbound = 0;
     bound.cElements = 8;
     sa = SafeArrayCreate(VT_VARIANT, 1, &bound);
-    if(!sa) {
-        IOleCommandTarget_Release(olecmd);
+    if(!sa)
         return;
-    }
 
     ind = 0;
     V_VT(&var) = VT_I4;
@@ -1532,11 +1528,10 @@ static void handle_navigation_error(nsChannelBSC *This, DWORD result)
     V_ARRAY(&var) = sa;
     V_VT(&varOut) = VT_BOOL;
     V_BOOL(&varOut) = VARIANT_TRUE;
-    IOleCommandTarget_Exec(olecmd, &CGID_DocHostCmdPriv, 1, 0, &var, FAILED(hres)?NULL:&varOut);
+    IOleCommandTarget_Exec(doc->client_cmdtrg, &CGID_DocHostCmdPriv, 1, 0, &var, FAILED(hres)?NULL:&varOut);
 
     SysFreeString(unk);
     SafeArrayDestroy(sa);
-    IOleCommandTarget_Release(olecmd);
 }
 
 static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index 0a1f97c..d62c306 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -231,6 +231,11 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
         This->doc_obj->usermode = UNKNOWN_USERMODE;
     }
 
+    if(This->doc_obj->client_cmdtrg) {
+        IOleCommandTarget_Release(This->doc_obj->client_cmdtrg);
+        This->doc_obj->client_cmdtrg = NULL;
+    }
+
     if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) {
         IDocHostUIHandler_Release(This->doc_obj->hostui);
         This->doc_obj->hostui = NULL;
@@ -319,6 +324,8 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
         VARIANT var;
         OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
 
+        This->doc_obj->client_cmdtrg = cmdtrg;
+
         if(!hostui_setup) {
             IDocObjectService *doc_object_service;
             IBrowserService *browser_service;
@@ -361,8 +368,6 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
                 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
         IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, 
                 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
-
-        IOleCommandTarget_Release(cmdtrg);
     }
 
     if(This->doc_obj->usermode == UNKNOWN_USERMODE)




More information about the wine-cvs mailing list