Jacek Caban : mshtml:
Get rid of HTMLDocument_OnLoad and move its job to AsyncOpen.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Feb 9 05:48:06 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 990e20c9922d4b058242f4eb7b9da845af8d38de
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=990e20c9922d4b058242f4eb7b9da845af8d38de
Author: Jacek Caban <jacek at 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;
More information about the wine-cvs
mailing list