Module: wine Branch: master Commit: 9fbc3b6061f75380207da061e605cc9d5784420d URL: http://source.winehq.org/git/wine.git/?a=commit;h=9fbc3b6061f75380207da061e6...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Mar 3 14:56:21 2010 +0100
mshtml: Added IHTMLPrivateWindow::SuperNavigate implementation.
---
dlls/mshtml/htmlwindow.c | 84 ++++++++++++++++++++++++++++++++++++++++-- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/persist.c | 42 ++++++++++++++------- 3 files changed, 109 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 1df97b9..491625e 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -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) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 95ae5ae..30d1edb 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -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*); diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index 540b563..720a58e 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -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;