[IEFRAME] Sync with Wine Staging 1.7.55. CORE-10536
[reactos.git] / reactos / dll / win32 / ieframe / navigate.c
index c1b43f8..7994b09 100644 (file)
@@ -102,7 +102,7 @@ static void set_status_text(BindStatusCallback *This, ULONG statuscode, LPCWSTR
     }
 
     V_VT(&arg) = VT_BSTR;
-    V_BSTR(&arg) = str ? SysAllocString(buffer) : NULL;
+    V_BSTR(&arg) = str ? SysAllocString(buffer) : SysAllocString(emptyW);
     TRACE("=> %s\n", debugstr_w(V_BSTR(&arg)));
 
     call_sink(This->doc_host->cps.wbe2, DISPID_STATUSTEXTCHANGE, &dispparams);
@@ -129,10 +129,17 @@ HRESULT set_dochost_url(DocHost *This, const WCHAR *url)
     heap_free(This->url);
     This->url = new_url;
 
-    This->container_vtbl->SetURL(This, This->url);
+    This->container_vtbl->set_url(This, This->url);
     return S_OK;
 }
 
+void notify_download_state(DocHost *dochost, BOOL is_downloading)
+{
+    DISPPARAMS dwl_dp = {NULL};
+    TRACE("(%x)\n", is_downloading);
+    call_sink(dochost->cps.wbe2, is_downloading ? DISPID_DOWNLOADBEGIN : DISPID_DOWNLOADCOMPLETE, &dwl_dp);
+}
+
 static inline BindStatusCallback *impl_from_IBindStatusCallback(IBindStatusCallback *iface)
 {
     return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallback_iface);
@@ -344,6 +351,8 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac
     if(!This->doc_host)
         return S_OK;
 
+    if(!This->doc_host->olecmd)
+        notify_download_state(This->doc_host, FALSE);
     if(FAILED(hresult))
         handle_navigation_error(This->doc_host, hresult, This->url, NULL);
 
@@ -759,27 +768,6 @@ static void doc_navigate_task_destr(task_header_t *t)
     heap_free(task);
 }
 
-void on_commandstate_change(DocHost *doc_host, LONG command, VARIANT_BOOL enable)
-{
-    DISPPARAMS dispparams;
-    VARIANTARG params[2];
-
-    TRACE("command=%d enable=%d\n", command, enable);
-
-    dispparams.cArgs = 2;
-    dispparams.cNamedArgs = 0;
-    dispparams.rgdispidNamedArgs = NULL;
-    dispparams.rgvarg = params;
-
-    V_VT(params) = VT_BOOL;
-    V_BOOL(params) = enable;
-
-    V_VT(params+1) = VT_I4;
-    V_I4(params+1) = command;
-
-    call_sink(doc_host->cps.wbe2, DISPID_COMMANDSTATECHANGE, &dispparams);
-}
-
 static void doc_navigate_proc(DocHost *This, task_header_t *t)
 {
     task_doc_navigate_t *task = (task_doc_navigate_t*)t;
@@ -883,6 +871,7 @@ static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mo
         return S_OK;
     }
 
+    notify_download_state(This, TRUE);
     on_commandstate_change(This, CSC_NAVIGATEBACK, VARIANT_FALSE);
     on_commandstate_change(This, CSC_NAVIGATEFORWARD, VARIANT_FALSE);
 
@@ -1089,20 +1078,11 @@ static HRESULT navigate_history(DocHost *This, unsigned travellog_pos)
         return E_NOTIMPL;
     }
 
-    if (travellog_pos < This->travellog.position)
-    {
-        on_commandstate_change(This, CSC_NAVIGATEBACK, VARIANT_FALSE);
-        on_commandstate_change(This, CSC_NAVIGATEFORWARD, VARIANT_TRUE);
-    }
-    else if (travellog_pos > This->travellog.position)
-    {
-        on_commandstate_change(This, CSC_NAVIGATEBACK, VARIANT_TRUE);
-        on_commandstate_change(This, CSC_NAVIGATEFORWARD, VARIANT_FALSE);
-    }
-
     This->travellog.loading_pos = travellog_pos;
     entry = This->travellog.log + This->travellog.loading_pos;
 
+    update_navigation_commands(This);
+
     if(!entry->stream)
         return async_doc_navigate(This, entry->url, NULL, NULL, 0, FALSE);