Jacek Caban : mshtml: Use URL moniker to load http documents.
Alexandre Julliard
julliard at winehq.org
Mon Aug 24 10:08:10 CDT 2009
Module: wine
Branch: master
Commit: 80f02b82d68902f32578a7bcf6cfbaa715b724ce
URL: http://source.winehq.org/git/wine.git/?a=commit;h=80f02b82d68902f32578a7bcf6cfbaa715b724ce
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Aug 22 19:40:01 2009 +0200
mshtml: Use URL moniker to load http documents.
---
dlls/mshtml/mshtml_private.h | 5 ---
dlls/mshtml/nsio.c | 48 +---------------------------
dlls/mshtml/persist.c | 12 ++-----
dlls/shdocvw/navigate.c | 72 +++++------------------------------------
dlls/urlmon/tests/url.c | 8 +---
5 files changed, 15 insertions(+), 130 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 724d827..a28949b 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -33,9 +33,6 @@
#include "nsiface.h"
-#define GENERATE_MSHTML_NS_FAILURE(code) \
- ((nsresult) ((PRUint32)(1<<31) | ((PRUint32)(0x45+6)<<16) | (PRUint32)(code)))
-
#define NS_OK ((nsresult)0x00000000L)
#define NS_ERROR_FAILURE ((nsresult)0x80004005L)
#define NS_NOINTERFACE ((nsresult)0x80004002L)
@@ -44,8 +41,6 @@
#define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL)
#define NS_ERROR_UNKNOWN_PROTOCOL ((nsresult)0x804b0012L)
-#define WINE_NS_LOAD_FROM_MONIKER GENERATE_MSHTML_NS_FAILURE(0)
-
#define NS_FAILED(res) ((res) & 0x80000000)
#define NS_SUCCEEDED(res) (!NS_FAILED(res))
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 83e8602..addf1b5 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -608,37 +608,6 @@ static nsresult NSAPI nsChannel_Open(nsIHttpChannel *iface, nsIInputStream **_re
return NS_ERROR_NOT_IMPLEMENTED;
}
-static BOOL do_load_from_moniker_hack(nsChannel *This)
-{
- nsACString scheme_str;
- nsresult nsres;
- BOOL ret = TRUE;
-
- /*
- * We should always load the page from IMoniker, but Wine is not yet
- * ready for this. This function is a heuristic, that decides which
- * way of loading is better (Gecko implementation or IMoniker). The
- * aim is to always return TRUE.
- */
-
- /* Load from moniker if there is no Gecko channel available */
- if(!This->channel)
- return TRUE;
-
- nsACString_Init(&scheme_str, NULL);
- nsres = nsIWineURI_GetScheme(This->uri, &scheme_str);
-
- if(NS_SUCCEEDED(nsres)) {
- const char *scheme;
-
- nsACString_GetData(&scheme_str, &scheme);
- ret = !strcmp(scheme, "wine") || !strcmp(scheme, "about");
- }
-
- nsACString_Finish(&scheme_str);
- return ret;
-}
-
static HRESULT create_mon_for_nschannel(nsChannel *channel, IMoniker **mon)
{
nsIWineURI *wine_uri;
@@ -732,8 +701,7 @@ static nsresult async_open_doc_uri(nsChannel *This, NSContainer *container,
This->content_type = heap_strdupWtoA(container->doc->mime);
}
- if(do_load_from_moniker_hack(This))
- return WINE_NS_LOAD_FROM_MONIKER;
+ return NS_OK;
}else {
BOOL cont = before_async_open(This, container);
@@ -764,23 +732,9 @@ static nsresult async_open(nsChannel *This, NSContainer *container, nsIStreamLis
{
nsChannelBSC *bscallback;
IMoniker *mon = NULL;
- nsresult nsres;
task_t *task;
HRESULT hres;
- if(This->channel) {
- nsres = nsIChannel_AsyncOpen(This->channel, listener, context);
-
- if(mon)
- IMoniker_Release(mon);
-
- if(NS_FAILED(nsres) && (This->load_flags & LOAD_INITIAL_DOCUMENT_URI))
- return WINE_NS_LOAD_FROM_MONIKER;
- return nsres;
- }
-
- TRACE("channel == NULL\n");
-
hres = create_mon_for_nschannel(This, &mon);
if(FAILED(hres))
return NS_ERROR_UNEXPECTED;
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 55bccc2..f2a3df7 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -314,17 +314,11 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
if(post_data_stream)
nsIInputStream_Release(post_data_stream);
- if(NS_SUCCEEDED(nsres)) {
- /* FIXME: don't return here (URL Moniker needs to be good enough) */
-
+ if(NS_FAILED(nsres)) {
+ WARN("LoadURI failed: %08x\n", nsres);
IUnknown_Release((IUnknown*)bscallback);
CoTaskMemFree(url);
-
- if(bind_complete)
- *bind_complete = TRUE;
- return S_OK;
- }else if(nsres != WINE_NS_LOAD_FROM_MONIKER) {
- WARN("LoadURI failed: %08x\n", nsres);
+ return E_FAIL;
}
}
diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index 0e6f68d..4b17d33 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -513,46 +513,6 @@ static BOOL try_application_url(LPCWSTR url)
return ShellExecuteExW(&exec_info);
}
-static HRESULT http_load_hack(DocHost *This, IMoniker *mon, IBindStatusCallback *callback, IBindCtx *bindctx)
-{
- IPersistMoniker *persist;
- IUnknown *doc;
- HRESULT hres;
-
- /*
- * FIXME:
- * We should use URLMoniker's BindToObject instead creating HTMLDocument here.
- * This should be fixed when mshtml.dll and urlmon.dll will be good enough.
- */
-
- hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
- CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
- &IID_IUnknown, (void**)&doc);
-
- if(FAILED(hres)) {
- ERR("Could not create HTMLDocument: %08x\n", hres);
- return hres;
- }
-
- hres = IUnknown_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist);
- if(FAILED(hres)) {
- IUnknown_Release(doc);
- return hres;
- }
-
- hres = IPersistMoniker_Load(persist, FALSE, mon, bindctx, 0);
- IPersistMoniker_Release(persist);
-
- if(SUCCEEDED(hres))
- hres = IBindStatusCallback_OnObjectAvailable(callback, &IID_IUnknown, doc);
- else
- WARN("Load failed: %08x\n", hres);
-
- IUnknown_Release(doc);
-
- return IBindStatusCallback_OnStopBinding(callback, hres, NULL);
-}
-
static HRESULT create_moniker(LPCWSTR url, IMoniker **mon)
{
WCHAR new_url[INTERNET_MAX_URL_LENGTH];
@@ -585,14 +545,9 @@ static HRESULT create_moniker(LPCWSTR url, IMoniker **mon)
static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCtx *bindctx,
IBindStatusCallback *callback)
{
- WCHAR schema[30];
- DWORD schema_len;
+ IUnknown *unk = NULL;
HRESULT hres;
- static const WCHAR httpW[] = {'h','t','t','p',0};
- static const WCHAR httpsW[] = {'h','t','t','p','s',0};
- static const WCHAR ftpW[]= {'f','t','p',0};
-
if(mon) {
IMoniker_AddRef(mon);
}else {
@@ -609,24 +564,15 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM,
(IUnknown*)CLIENTSITE(This));
- hres = CoInternetParseUrl(This->url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
- &schema_len, 0);
- if(SUCCEEDED(hres) &&
- (!strcmpW(schema, httpW) || !strcmpW(schema, httpsW) || !strcmpW(schema, ftpW))) {
- hres = http_load_hack(This, mon, callback, bindctx);
+ hres = IMoniker_BindToObject(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk);
+ if(SUCCEEDED(hres)) {
+ hres = S_OK;
+ if(unk)
+ IUnknown_Release(unk);
+ }else if(try_application_url(url)) {
+ hres = S_OK;
}else {
- IUnknown *unk = NULL;
-
- hres = IMoniker_BindToObject(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk);
- if(SUCCEEDED(hres)) {
- hres = S_OK;
- if(unk)
- IUnknown_Release(unk);
- }else if(try_application_url(url)) {
- hres = S_OK;
- }else {
- FIXME("BindToObject failed: %08x\n", hres);
- }
+ FIXME("BindToObject failed: %08x\n", hres);
}
IMoniker_Release(mon);
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index a4d873e..5badf86 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -2551,16 +2551,12 @@ static void test_BindToObject(int protocol, BOOL emul)
CHECK_CALLED(Obj_OnStopBinding);
}
- if(test_protocol != HTTP_TEST || test_protocol == HTTPS_TEST || emul || urls[test_protocol] == SHORT_RESPONSE_URL) {
+ if(test_protocol != HTTP_TEST || emul || urls[test_protocol] == SHORT_RESPONSE_URL || !(bindf & BINDF_ASYNCHRONOUS)) {
ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n");
}else {
todo_wine ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
-
- if(bindf & BINDF_ASYNCHRONOUS)
- IBindCtx_Release(bctx);
- else
- todo_wine ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n");
+ IBindCtx_Release(bctx);
}
if(emul)
More information about the wine-cvs
mailing list