Jacek Caban : mshtml: Split set_moniker implementation.

Alexandre Julliard julliard at winehq.org
Mon Jul 25 11:43:08 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Jul 23 12:51:38 2011 +0200

mshtml: Split set_moniker implementation.

---

 dlls/mshtml/binding.h    |    1 +
 dlls/mshtml/htmlwindow.c |    1 +
 dlls/mshtml/persist.c    |   60 ++++++++++++++++++++++++---------------------
 3 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index f3c4d3e..3e8b87c 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -106,6 +106,7 @@ HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsChannel*,DWORD,BOOL*) DECLS
 HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsWineURI**) DECLSPEC_HIDDEN;
 HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD) DECLSPEC_HIDDEN;
 HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL) DECLSPEC_HIDDEN;
+void prepare_for_binding(HTMLDocument*,IMoniker*,IBindCtx*,BOOL) DECLSPEC_HIDDEN;
 
 HRESULT create_channelbsc(IMoniker*,WCHAR*,BYTE*,DWORD,nsChannelBSC**) DECLSPEC_HIDDEN;
 HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 377825d..911e1f2 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -1747,6 +1747,7 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
         return hres;
     }
 
+    prepare_for_binding(&This->doc_obj->basedoc, mon, NULL, TRUE);
     hres = set_moniker(&This->doc_obj->basedoc, mon, NULL, bsc, TRUE);
     if(SUCCEEDED(hres))
         hres = async_start_doc_binding(This, bsc);
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 0907810..550414f 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -188,23 +188,10 @@ static void set_downloading_proc(task_t *_task)
     }
 }
 
-HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannelBSC *async_bsc, BOOL set_download)
+void prepare_for_binding(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL navigated_binding)
 {
-    nsChannelBSC *bscallback;
-    docobj_task_t *task;
-    download_proc_task_t *download_task;
-    nsWineURI *nsuri;
-    LPOLESTR url;
     HRESULT hres;
 
-    hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url);
-    if(FAILED(hres)) {
-        WARN("GetDiaplayName failed: %08x\n", hres);
-        return hres;
-    }
-
-    TRACE("got url: %s\n", debugstr_w(url));
-
     if(This->doc_obj->client) {
         VARIANT silent, offline;
 
@@ -233,8 +220,6 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
         set_current_mon(This->window, mon);
     }
 
-    set_ready_state(This->window, READYSTATE_LOADING);
-
     if(This->doc_obj->client) {
         IOleCommandTarget *cmdtrg = NULL;
 
@@ -243,7 +228,7 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
         if(SUCCEEDED(hres)) {
             VARIANT var, out;
 
-            if(!async_bsc) {
+            if(!navigated_binding) {
                 V_VT(&var) = VT_I4;
                 V_I4(&var) = 0;
                 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
@@ -259,24 +244,39 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
             IOleCommandTarget_Release(cmdtrg);
         }
     }
+}
 
-    hres = create_doc_uri(This->window, url, &nsuri);
+HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannelBSC *async_bsc, BOOL set_download)
+{
+    download_proc_task_t *download_task;
+    nsChannelBSC *bscallback;
+    nsWineURI *nsuri;
+    LPOLESTR url;
+    HRESULT hres;
 
-    if(SUCCEEDED(hres))
-    {
-        if(async_bsc) {
+    hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url);
+    if(FAILED(hres)) {
+        WARN("GetDiaplayName failed: %08x\n", hres);
+        return hres;
+    }
+
+    TRACE("got url: %s\n", debugstr_w(url));
+
+    set_ready_state(This->window, READYSTATE_LOADING);
+
+    hres = create_doc_uri(This->window, url, &nsuri);
+    if(SUCCEEDED(hres)) {
+        if(async_bsc)
             bscallback = async_bsc;
-        }else {
+        else
             hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
-        }
     }
 
-    if(SUCCEEDED(hres))
-    {
+    if(SUCCEEDED(hres)) {
         remove_target_tasks(This->task_magic);
         abort_document_bindings(This->doc_node);
 
-        hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
+        hres = load_nsuri(This->window, nsuri, bscallback, 0/*LOAD_INITIAL_DOCUMENT_URI*/);
         nsISupports_Release((nsISupports*)nsuri); /* FIXME */
         if(SUCCEEDED(hres))
             set_window_bscallback(This->window, bscallback);
@@ -284,8 +284,7 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
             IUnknown_Release((IUnknown*)bscallback);
     }
 
-    if(FAILED(hres))
-    {
+    if(FAILED(hres)) {
         CoTaskMemFree(url);
         return hres;
     }
@@ -293,6 +292,8 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
     HTMLDocument_LockContainer(This->doc_obj, TRUE);
 
     if(This->doc_obj->frame) {
+        docobj_task_t *task;
+
         task = heap_alloc(sizeof(docobj_task_t));
         task->doc = This->doc_obj;
         push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic);
@@ -433,6 +434,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
         }
     }
 
+    prepare_for_binding(This, pimkName, pibc, FALSE);
     hres = set_moniker(This, pimkName, pibc, NULL, TRUE);
     if(FAILED(hres))
         return hres;
@@ -703,6 +705,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM
         return hres;
     }
 
+    prepare_for_binding(This, mon, NULL, FALSE);
     hres = set_moniker(This, mon, NULL, NULL, TRUE);
     IMoniker_Release(mon);
     if(FAILED(hres))
@@ -761,6 +764,7 @@ static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
         return hres;
     }
 
+    prepare_for_binding(This, mon, NULL, FALSE);
     hres = set_moniker(This, mon, NULL, NULL, FALSE);
     IMoniker_Release(mon);
     if(FAILED(hres))




More information about the wine-cvs mailing list