Commit 9fbc3b60 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Added IHTMLPrivateWindow::SuperNavigate implementation.

parent 8dd7b396
/* /*
* Copyright 2006 Jacek Caban for CodeWeavers * Copyright 2006-2010 Jacek Caban for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "winuser.h" #include "winuser.h"
#include "ole2.h" #include "ole2.h"
#include "mshtmdid.h" #include "mshtmdid.h"
#include "shlguid.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -1672,9 +1673,84 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, ...@@ -1672,9 +1673,84 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags) BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
{ {
HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 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), DWORD post_data_size = 0;
debugstr_w(arg4), debugstr_variant(post_data_var), debugstr_variant(headers_var), flags); BYTE *post_data = NULL;
return E_NOTIMPL; 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) static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url)
......
...@@ -712,6 +712,7 @@ HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD); ...@@ -712,6 +712,7 @@ HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD);
HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD,BOOL*); HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD,BOOL*);
HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*); HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*);
HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*); HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*);
HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL);
void call_property_onchanged(ConnectionPoint*,DISPID); void call_property_onchanged(ConnectionPoint*,DISPID);
HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*); HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*);
......
...@@ -169,11 +169,11 @@ static void set_downloading_proc(task_t *_task) ...@@ -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; nsChannelBSC *bscallback;
docobj_task_t *task; docobj_task_t *task;
download_proc_task_t *download_task;
nsWineURI *nsuri; nsWineURI *nsuri;
LPOLESTR url; LPOLESTR url;
HRESULT hres; HRESULT hres;
...@@ -222,11 +222,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO ...@@ -222,11 +222,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
(void**)&cmdtrg); (void**)&cmdtrg);
if(SUCCEEDED(hres)) { if(SUCCEEDED(hres)) {
VARIANT var; VARIANT var, out;
V_VT(&var) = VT_I4; if(!async_bsc) {
V_I4(&var) = 0; V_VT(&var) = VT_I4;
IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL); 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); IOleCommandTarget_Release(cmdtrg);
} }
...@@ -237,15 +246,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO ...@@ -237,15 +246,20 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback); if(async_bsc) {
if(FAILED(hres)) bscallback = async_bsc;
return hres; }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); hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
nsISupports_Release((nsISupports*)nsuri); /* FIXME */ nsISupports_Release((nsISupports*)nsuri); /* FIXME */
if(SUCCEEDED(hres)) if(SUCCEEDED(hres))
set_window_bscallback(This->window, bscallback); set_window_bscallback(This->window, bscallback);
IUnknown_Release((IUnknown*)bscallback); if(bscallback != async_bsc)
IUnknown_Release((IUnknown*)bscallback);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
...@@ -385,7 +399,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva ...@@ -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)) if(FAILED(hres))
return hres; return hres;
...@@ -646,7 +660,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM ...@@ -646,7 +660,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM
return hres; return hres;
} }
hres = set_moniker(This, mon, NULL, TRUE); hres = set_moniker(This, mon, NULL, NULL, TRUE);
IMoniker_Release(mon); IMoniker_Release(mon);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
...@@ -704,7 +718,7 @@ static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface) ...@@ -704,7 +718,7 @@ static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
return hres; return hres;
} }
hres = set_moniker(This, mon, NULL, FALSE); hres = set_moniker(This, mon, NULL, NULL, FALSE);
IMoniker_Release(mon); IMoniker_Release(mon);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment