mshtml: Added IHTMLPrivateWindow::SuperNavigate implementation.
authorJacek Caban <jacek@codeweavers.com>
Wed, 3 Mar 2010 13:56:21 +0000 (14:56 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 3 Mar 2010 14:29:25 +0000 (15:29 +0100)
dlls/mshtml/htmlwindow.c
dlls/mshtml/mshtml_private.h
dlls/mshtml/persist.c

index 1df97b9a12810b63f6bf3891e60e75ae2b70636d..491625ed241ced249cc33f724e27394080491780 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006 Jacek Caban for CodeWeavers
+ * Copyright 2006-2010 Jacek Caban for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
 #include "winuser.h"
 #include "ole2.h"
 #include "mshtmdid.h"
+#include "shlguid.h"
 
 #include "wine/debug.h"
 
@@ -1672,9 +1673,84 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
         BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
 {
     HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface);
-    FIXME("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3),
-          debugstr_w(arg4), debugstr_variant(post_data_var), debugstr_variant(headers_var), flags);
-    return E_NOTIMPL;
+    DWORD post_data_size = 0;
+    BYTE *post_data = NULL;
+    WCHAR *headers = NULL;
+    nsChannelBSC *bsc;
+    IMoniker *mon;
+    BSTR new_url;
+    HRESULT hres;
+
+    TRACE("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3), debugstr_w(arg4),
+          debugstr_variant(post_data_var), debugstr_variant(headers_var), flags);
+
+    new_url = url;
+    if(This->doc_obj->hostui) {
+        OLECHAR *translated_url = NULL;
+
+        hres = IDocHostUIHandler_TranslateUrl(This->doc_obj->hostui, 0, url, &translated_url);
+        if(hres == S_OK && translated_url) {
+            new_url = SysAllocString(translated_url);
+            CoTaskMemFree(translated_url);
+        }
+    }
+
+    if(This->doc_obj->client) {
+        IOleCommandTarget *cmdtrg;
+
+        hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
+        if(SUCCEEDED(hres)) {
+            VARIANT in, out;
+
+            V_VT(&in) = VT_BSTR;
+            V_BSTR(&in) = new_url;
+            V_VT(&out) = VT_BOOL;
+            V_BOOL(&out) = VARIANT_TRUE;
+            hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &in, &out);
+            IOleCommandTarget_Release(cmdtrg);
+            if(SUCCEEDED(hres))
+                VariantClear(&out);
+        }
+    }
+
+    /* FIXME: Why not set_ready_state? */
+    This->readystate = READYSTATE_UNINITIALIZED;
+
+    hres = CreateURLMoniker(NULL, new_url, &mon);
+    if(new_url != url)
+        SysFreeString(new_url);
+    if(FAILED(hres))
+        return hres;
+
+    if(post_data_var) {
+        if(V_VT(post_data_var) == (VT_ARRAY|VT_UI1)) {
+            SafeArrayAccessData(V_ARRAY(post_data_var), (void**)&post_data);
+            post_data_size = V_ARRAY(post_data_var)->rgsabound[0].cElements;
+        }
+    }
+
+    if(headers_var && V_VT(headers_var) != VT_EMPTY && V_VT(headers_var) != VT_ERROR) {
+        if(V_VT(headers_var) != VT_BSTR)
+            return E_INVALIDARG;
+
+        headers = V_BSTR(headers_var);
+    }
+
+    hres = create_channelbsc(mon, headers, post_data, post_data_size, &bsc);
+    if(post_data)
+        SafeArrayUnaccessData(V_ARRAY(post_data_var));
+    if(FAILED(hres)) {
+        IMoniker_Release(mon);
+        return hres;
+    }
+
+    hres = set_moniker(&This->doc_obj->basedoc, mon, NULL, bsc, TRUE);
+    if(SUCCEEDED(hres))
+        hres = async_start_doc_binding(This, bsc);
+
+    IUnknown_Release((IUnknown*)bsc);
+    IMoniker_Release(mon);
+    return hres;
 }
 
 static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url)
index 95ae5ae4d5a794005d253e9f60eb4583fb46d54f..30d1edbee5f68a3d7fcd3c8b324df83c2b2ac63c 100644 (file)
@@ -712,6 +712,7 @@ HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD);
 HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD,BOOL*);
 HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*);
 HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*);
+HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL);
 
 void call_property_onchanged(ConnectionPoint*,DISPID);
 HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*);
index 540b563ae72f580a82a8a2828f4d52afea4eb92c..720a58edbf86ad13a3e24084db8439bf01e159f5 100644 (file)
@@ -169,11 +169,11 @@ static void set_downloading_proc(task_t *_task)
     }
 }
 
-static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL set_download)
+HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannelBSC *async_bsc, BOOL set_download)
 {
-    download_proc_task_t *download_task;
     nsChannelBSC *bscallback;
     docobj_task_t *task;
+    download_proc_task_t *download_task;
     nsWineURI *nsuri;
     LPOLESTR url;
     HRESULT hres;
@@ -222,11 +222,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
         hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
                 (void**)&cmdtrg);
         if(SUCCEEDED(hres)) {
-            VARIANT var;
-
-            V_VT(&var) = VT_I4;
-            V_I4(&var) = 0;
-            IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
+            VARIANT var, out;
+
+            if(!async_bsc) {
+                V_VT(&var) = VT_I4;
+                V_I4(&var) = 0;
+                IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
+            }else {
+                V_VT(&var) = VT_UNKNOWN;
+                V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window);
+                V_VT(&out) = VT_EMPTY;
+                hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out);
+                if(SUCCEEDED(hres))
+                    VariantClear(&out);
+            }
 
             IOleCommandTarget_Release(cmdtrg);
         }
@@ -237,15 +246,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
     if(FAILED(hres))
         return hres;
 
-    hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
-    if(FAILED(hres))
-        return hres;
+    if(async_bsc) {
+        bscallback = async_bsc;
+    }else {
+        hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
+        if(FAILED(hres))
+            return hres;
+    }
 
     hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
     nsISupports_Release((nsISupports*)nsuri); /* FIXME */
     if(SUCCEEDED(hres))
         set_window_bscallback(This->window, bscallback);
-    IUnknown_Release((IUnknown*)bscallback);
+    if(bscallback != async_bsc)
+        IUnknown_Release((IUnknown*)bscallback);
     if(FAILED(hres))
         return hres;
 
@@ -385,7 +399,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
         }
     }
 
-    hres = set_moniker(This, pimkName, pibc, TRUE);
+    hres = set_moniker(This, pimkName, pibc, NULL, TRUE);
     if(FAILED(hres))
         return hres;
 
@@ -646,7 +660,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM
         return hres;
     }
 
-    hres = set_moniker(This, mon, NULL, TRUE);
+    hres = set_moniker(This, mon, NULL, NULL, TRUE);
     IMoniker_Release(mon);
     if(FAILED(hres))
         return hres;
@@ -704,7 +718,7 @@ static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
         return hres;
     }
 
-    hres = set_moniker(This, mon, NULL, FALSE);
+    hres = set_moniker(This, mon, NULL, NULL, FALSE);
     IMoniker_Release(mon);
     if(FAILED(hres))
         return hres;