[CMAKE]
[reactos.git] / dll / win32 / shdocvw / navigate.c
index 3310cba..6d73fd9 100644 (file)
@@ -111,6 +111,23 @@ static void set_status_text(BindStatusCallback *This, LPCWSTR str)
         IOleInPlaceFrame_SetStatusText(This->doc_host->frame, str);
 }
 
+static HRESULT set_dochost_url(DocHost *This, const WCHAR *url)
+{
+    WCHAR *new_url;
+
+    if(url) {
+        new_url = heap_strdupW(url);
+        if(!new_url)
+            return E_OUTOFMEMORY;
+    }else {
+        new_url = NULL;
+    }
+
+    heap_free(This->url);
+    This->url = new_url;
+    return S_OK;
+}
+
 #define BINDSC_THIS(iface) DEFINE_THIS(BindStatusCallback, BindStatusCallback, iface)
 
 static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface,
@@ -205,6 +222,8 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface,
           debugstr_w(szStatusText));
 
     switch(ulStatusCode) {
+    case BINDSTATUS_REDIRECTING:
+        return set_dochost_url(This->doc_host, szStatusText);
     case BINDSTATUS_BEGINDOWNLOADDATA:
         set_status_text(This, szStatusText); /* FIXME: "Start downloading from site: %s" */
         return S_OK;
@@ -502,6 +521,7 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
                               IBindStatusCallback *callback)
 {
     IUnknown *unk = NULL;
+    WCHAR *display_name;
     HRESULT hres;
 
     if(mon) {
@@ -512,10 +532,16 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
             return hres;
     }
 
-    CoTaskMemFree(This->url);
-    hres = IMoniker_GetDisplayName(mon, 0, NULL, &This->url);
-    if(FAILED(hres))
+    hres = IMoniker_GetDisplayName(mon, 0, NULL, &display_name);
+    if(FAILED(hres)) {
         FIXME("GetDisplayName failed: %08x\n", hres);
+        return hres;
+    }
+
+    hres = set_dochost_url(This, display_name);
+    CoTaskMemFree(display_name);
+    if(FAILED(hres))
+        return hres;
 
     IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM,
                                  (IUnknown*)CLIENTSITE(This));
@@ -538,18 +564,12 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
 static void html_window_navigate(DocHost *This, IHTMLPrivateWindow *window, BSTR url, BSTR headers, SAFEARRAY *post_data)
 {
     VARIANT headers_var, post_data_var;
-    WCHAR *new_url;
     BSTR empty_str;
-    DWORD size;
     HRESULT hres;
 
-    size = (strlenW(url)+1)*sizeof(WCHAR);
-    new_url = CoTaskMemAlloc(size);
-    if(!new_url)
+    hres = set_dochost_url(This, url);
+    if(FAILED(hres))
         return;
-    memcpy(new_url, url, size);
-    CoTaskMemFree(This->url);
-    This->url = new_url;
 
     empty_str = SysAllocStringLen(NULL, 0);
 
@@ -739,19 +759,12 @@ HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags,
                 Flags, Flags ? V_VT(Flags) : -1, TargetFrameName,
                 TargetFrameName ? V_VT(TargetFrameName) : -1);
 
-    if(PostData) {
-        TRACE("PostData vt=%d\n", V_VT(PostData));
-
-        if(V_VT(PostData) == (VT_ARRAY | VT_UI1)) {
-            SafeArrayAccessData(V_ARRAY(PostData), (void**)&post_data);
-            post_data_len = V_ARRAY(PostData)->rgsabound[0].cElements;
-        }
+    if(PostData && V_VT(PostData) == (VT_ARRAY | VT_UI1)) {
+        SafeArrayAccessData(V_ARRAY(PostData), (void**)&post_data);
+        post_data_len = V_ARRAY(PostData)->rgsabound[0].cElements;
     }
 
-    if(Headers && V_VT(Headers) != VT_EMPTY && V_VT(Headers) != VT_ERROR) {
-        if(V_VT(Headers) != VT_BSTR)
-            return E_INVALIDARG;
-
+    if(Headers && V_VT(Headers) == VT_BSTR) {
         headers = V_BSTR(Headers);
         TRACE("Headers: %s\n", debugstr_w(headers));
     }