From 990e20c9922d4b058242f4eb7b9da845af8d38de Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 9 Feb 2006 12:19:33 +0100 Subject: [PATCH] mshtml: Get rid of HTMLDocument_OnLoad and move its job to AsyncOpen. --- dlls/mshtml/mshtml_private.h | 4 +- dlls/mshtml/nsembed.c | 46 +++++++-------------- dlls/mshtml/nsio.c | 80 ++++++++++++++++++++++++++++++++++++ dlls/mshtml/persist.c | 41 +++--------------- 4 files changed, 102 insertions(+), 69 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index a4f0e987ce8..a4ab36fabf9 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -32,6 +32,7 @@ #define NS_NOINTERFACE ((nsresult)0x80004002L) #define NS_ERROR_NOT_IMPLEMENTED ((nsresult)0x80004001L) #define NS_ERROR_INVALID_ARG ((nsresult)0x80070057L) +#define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL) #define NS_FAILED(res) ((res) & 0x80000000) #define NS_SUCCEEDED(res) (!NS_FAILED(res)) @@ -93,7 +94,7 @@ struct NSContainer { HWND hwnd; - LPOLESTR url; /* hack */ + BOOL load_call; /* hack */ }; #define HTMLDOC(x) ((IHTMLDocument2*) &(x)->lpHTMLDocument2Vtbl) @@ -139,7 +140,6 @@ void HTMLDocument_NSContainer_Destroy(HTMLDocument*); void HTMLDocument_LockContainer(HTMLDocument*,BOOL); void HTMLDocument_ShowContextMenu(HTMLDocument*,DWORD,POINT*); -BOOL HTMLDocument_OnLoad(HTMLDocument*,LPCWSTR); HRESULT ProtocolFactory_Create(REFCLSID,REFIID,void**); diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 93533afaaf2..eaa19d22cbc 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -663,41 +663,28 @@ static nsrefcnt NSAPI nsURIContentListener_Release(nsIURIContentListener *iface) return nsIWebBrowserChrome_Release(NSWBCHROME(This)); } -static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface, nsIURI *aURI, - PRBool *_retval) +static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface, + nsIURI *aURI, PRBool *_retval) { NSContainer *This = NSURICL_THIS(iface); - BOOL do_load = TRUE; - nsresult nsres; + nsIWineURI *wine_uri; nsACString *spec_str = nsACString_Create(); + const char *spec; + nsresult nsres; - TRACE("(%p)->(%p %p)\n", This, aURI, _retval); + nsIURI_GetSpec(aURI, spec_str); + nsACString_GetData(spec_str, &spec, NULL); - nsres = nsIURI_GetSpec(aURI, spec_str); - if(NS_SUCCEEDED(nsres)) { - const char *spec = NULL; - LPWSTR specw; - int len; - - nsACString_GetData(spec_str, &spec, NULL); - - len = MultiByteToWideChar(CP_ACP, 0, spec, -1, NULL, 0); - specw = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, spec, -1, specw, -1); - - if(strcmpW(This->url, specw)) /* hack */ - do_load = HTMLDocument_OnLoad(This->doc, specw); - - HeapFree(GetProcessHeap(), 0, specw); - }else { - ERR("GetSpec failed: %08lx\n", nsres); - } + TRACE("(%p)->(%p(%s) %p)\n", This, aURI, debugstr_a(spec), _retval); nsACString_Destroy(spec_str); - if(!do_load) { - *_retval = TRUE; - return NS_OK; + nsres = nsIURI_QueryInterface(aURI, &IID_nsIWineURI, (void**)&wine_uri); + if(NS_SUCCEEDED(nsres)) { + nsIWineURI_SetNSContainer(wine_uri, This); + nsIWineURI_Release(wine_uri); + }else { + WARN("Could not get nsIWineURI interface: %08lx\n", nsres); } return NS_ERROR_NOT_IMPLEMENTED; @@ -977,7 +964,7 @@ void HTMLDocument_NSContainer_Init(HTMLDocument *This) if(NS_FAILED(nsres)) ERR("SetParentURIContentListener failed: %08lx\n", nsres); - This->nscontainer->url = NULL; + This->nscontainer->load_call = FALSE; } void HTMLDocument_NSContainer_Destroy(HTMLDocument *This) @@ -992,7 +979,4 @@ void HTMLDocument_NSContainer_Destroy(HTMLDocument *This) nsIWebBrowserStream_Release(This->nscontainer->stream); HeapFree(GetProcessHeap(), 0, This->nscontainer); - - if(This->nscontainer->url) - CoTaskMemFree(This->nscontainer->url); } diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index e09a076d34f..a13def7285b 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -26,6 +26,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "shlguid.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -34,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +#define LOAD_INITIAL_DOCUMENT_URI 0x80000 + #define NS_IOSERVICE_CLASSNAME "nsIOService" #define NS_IOSERVICE_CONTRACTID "@mozilla.org/network/io-service;1" @@ -65,6 +68,76 @@ typedef struct { #define NSHTTPCHANNEL(x) ((nsIHttpChannel*) &(x)->lpHttpChannelVtbl) #define NSURI(x) ((nsIURI*) &(x)->lpWineURIVtbl) +static BOOL exec_shldocvw_67(NSContainer *container, LPCWSTR url) +{ + IOleCommandTarget *cmdtrg = NULL; + HRESULT hres; + + hres = IOleClientSite_QueryInterface(container->doc->client, &IID_IOleCommandTarget, + (void**)&cmdtrg); + if(SUCCEEDED(hres)) { + VARIANT varUrl, varRes; + + V_VT(&varUrl) = VT_BSTR; + V_BSTR(&varUrl) = SysAllocString(url); + V_VT(&varRes) = VT_BOOL; + + hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &varUrl, &varRes); + + IOleCommandTarget_Release(cmdtrg); + SysFreeString(V_BSTR(&varUrl)); + + if(SUCCEEDED(hres) && !V_BOOL(&varRes)) { + TRACE("got VARIANT_FALSE, do not load\n"); + return FALSE; + } + } + + return TRUE; +} + +static BOOL before_async_open(nsChannel *This) +{ + nsACString *uri_str; + NSContainer *container; + PRUint32 load_flags = 0; + const char *uria; + LPWSTR uri; + DWORD len; + BOOL ret = TRUE; + + nsIChannel_GetLoadFlags(This->channel, &load_flags); + TRACE("load_flags = %08lx\n", load_flags); + if(!(load_flags & LOAD_INITIAL_DOCUMENT_URI)) + return TRUE; + + nsIWineURI_GetNSContainer(This->uri, &container); + if(!container) { + WARN("container = NULL\n"); + return TRUE; + } + + if(container->load_call) { + nsIWebBrowserChrome_Release(NSWBCHROME(container)); + return TRUE; + } + + uri_str = nsACString_Create(); + nsIWineURI_GetSpec(This->uri, uri_str); + nsACString_GetData(uri_str, &uria, NULL); + len = MultiByteToWideChar(CP_ACP, 0, uria, -1, NULL, 0); + uri = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, uria, -1, uri, len); + nsACString_Destroy(uri_str); + + ret = exec_shldocvw_67(container, uri); + + nsIWebBrowserChrome_Release(NSWBCHROME(container)); + HeapFree(GetProcessHeap(), 0, uri); + + return ret; +} + #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef riid, nsQIResult result) @@ -311,7 +384,14 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen nsISupports *aContext) { nsChannel *This = NSCHANNEL_THIS(iface); + TRACE("(%p)->(%p %p)\n", This, aListener, aContext); + + if(!before_async_open(This)) { + TRACE("canceled\n"); + return NS_ERROR_UNEXPECTED; + } + return nsIChannel_AsyncOpen(This->channel, aListener, aContext); } diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index 67e771e4f96..3bef7a59851 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -362,18 +362,15 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva * It uses Gecko's LoadURI instead of IMoniker's BindToStorage. Should we improve * it (to do so we'd have to use not frozen interfaces)? */ - LPOLESTR old_url = This->nscontainer->url; - - This->nscontainer->url = url; + This->nscontainer->load_call = TRUE; nsres = nsIWebNavigation_LoadURI(This->nscontainer->navigation, url, LOAD_FLAGS_NONE, NULL, NULL, NULL); - if(NS_SUCCEEDED(nsres)) { - CoTaskMemFree(old_url); + This->nscontainer->load_call = FALSE; + + if(NS_SUCCEEDED(nsres)) return S_OK; - }else { + else WARN("LoadURI failed: %08lx\n", nsres); - This->nscontainer->url = old_url; - } } /* FIXME: Use grfMode */ @@ -563,34 +560,6 @@ static const IPersistFileVtbl PersistFileVtbl = { PersistFile_GetCurFile }; -BOOL HTMLDocument_OnLoad(HTMLDocument *This, LPCWSTR url) -{ - IOleCommandTarget *cmdtrg = NULL; - HRESULT hres; - - TRACE("(%p)->(%s)\n", This, debugstr_w(url)); - - hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg); - if(SUCCEEDED(hres)) { - VARIANT varUrl, varRes; - - V_VT(&varUrl) = VT_BSTR; - V_BSTR(&varUrl) = SysAllocString(url); - V_VT(&varRes) = VT_BOOL; - - hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &varUrl, &varRes); - SysFreeString(V_BSTR(&varUrl)); - - if(SUCCEEDED(hres) && !V_BOOL(&varRes)) { - TRACE("got VARIANT_FALSE, do not load\n"); - IOleCommandTarget_Release(cmdtrg); - return FALSE; - } - } - - return TRUE; -} - void HTMLDocument_Persist_Init(HTMLDocument *This) { This->lpPersistMonikerVtbl = &PersistMonikerVtbl;