Module: wine Branch: refs/heads/master Commit: 990e20c9922d4b058242f4eb7b9da845af8d38de URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=990e20c9922d4b058242f4eb...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Feb 9 12:19:33 2006 +0100
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 a4f0e98..a4ab36f 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(HT
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 93533af..eaa19d2 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -663,41 +663,28 @@ static nsrefcnt NSAPI nsURIContentListen 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); - - 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); + nsIURI_GetSpec(aURI, spec_str); + nsACString_GetData(spec_str, &spec, NULL);
- 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(HTMLD 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(HT 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 e09a076..a13def7 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_AsyncOpe 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 67e771e..3bef7a5 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -362,18 +362,15 @@ static HRESULT WINAPI PersistMoniker_Loa * 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 PersistFil 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;