Author: cwittich Date: Sat Mar 6 12:42:03 2010 New Revision: 45918
URL: http://svn.reactos.org/svn/reactos?rev=45918&view=rev Log: [MSHTML] sync mshtml to wine 1.1.40
Modified: trunk/reactos/dll/win32/mshtml/htmldoc.c trunk/reactos/dll/win32/mshtml/htmlscript.c trunk/reactos/dll/win32/mshtml/htmlwindow.c trunk/reactos/dll/win32/mshtml/mshtml_private.h trunk/reactos/dll/win32/mshtml/navigate.c trunk/reactos/dll/win32/mshtml/nsembed.c trunk/reactos/dll/win32/mshtml/nsiface.idl trunk/reactos/dll/win32/mshtml/nsio.c trunk/reactos/dll/win32/mshtml/oleobj.c trunk/reactos/dll/win32/mshtml/persist.c trunk/reactos/dll/win32/mshtml/rsrc.rc trunk/reactos/include/psdk/mshtml.idl
Modified: trunk/reactos/dll/win32/mshtml/htmldoc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmldoc.c?... ============================================================================== --- trunk/reactos/dll/win32/mshtml/htmldoc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/htmldoc.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -1776,6 +1776,9 @@ }else if(IsEqualGUID(&IID_IExternalConnection, riid)) { TRACE("(%p)->(IID_IExternalConnection %p) returning NULL\n", This, ppv); *ppv = NULL; + }else if(IsEqualGUID(&IID_IStdMarshalInfo, riid)) { + TRACE("(%p)->(IID_IStdMarshalInfo %p) returning NULL\n", This, ppv); + *ppv = NULL; }else if(IsEqualGUID(&IID_IObjectWithSite, riid)) { TRACE("(%p)->(IID_IObjectWithSite %p)\n", This, ppv); *ppv = OBJSITE(This);
Modified: trunk/reactos/dll/win32/mshtml/htmlscript.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlscript... ============================================================================== --- trunk/reactos/dll/win32/mshtml/htmlscript.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/htmlscript.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -214,8 +214,18 @@ static HRESULT WINAPI HTMLScriptElement_put_type(IHTMLScriptElement *iface, BSTR v) { HTMLScriptElement *This = HTMLSCRIPT_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString nstype_str; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsAString_Init(&nstype_str, v); + nsres = nsIDOMHTMLScriptElement_SetType(This->nsscript, &nstype_str); + if (NS_FAILED(nsres)) + ERR("SetType failed: %08x\n", nsres); + nsAString_Finish (&nstype_str); + + return S_OK; }
static HRESULT WINAPI HTMLScriptElement_get_type(IHTMLScriptElement *iface, BSTR *p)
Modified: trunk/reactos/dll/win32/mshtml/htmlwindow.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlwindow... ============================================================================== --- trunk/reactos/dll/win32/mshtml/htmlwindow.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/htmlwindow.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -1,5 +1,5 @@ /* - * Copyright 2006 Jacek Caban for CodeWeavers + * Copyright 2006-2010 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,15 +25,17 @@ #include "winuser.h" #include "ole2.h" #include "mshtmdid.h" +#include "shlguid.h"
#include "wine/debug.h" -#include "wine/unicode.h"
#include "mshtml_private.h" #include "htmlevent.h" #include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +#define HTMLPRIVWINDOW(x) ((IHTMLPrivateWindow*) &(x)->lpIHTMLPrivateWindowVtbl)
static struct list window_list = LIST_INIT(window_list);
@@ -166,6 +168,9 @@ }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) { TRACE("(%p)->(IID_IHTMLWindow4 %p)\n", This, ppv); *ppv = HTMLWINDOW4(This); + }else if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) { + TRACE("(%p)->(IID_IHTMLPrivateWindow %p)\n", This, ppv); + *ppv = HTMLPRIVWINDOW(This); }else if(dispex_query_interface(&This->dispex, riid, ppv)) { return *ppv ? S_OK : E_NOINTERFACE; } @@ -1641,6 +1646,162 @@ HTMLWindow4_get_frameElement };
+#define HTMLPRIVWINDOW_THIS(iface) DEFINE_THIS(HTMLWindow, IHTMLPrivateWindow, iface) + +static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface, REFIID riid, void **ppv) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + + return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); +} + +static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + + return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); +} + +static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + + return IHTMLWindow2_Release(HTMLWINDOW2(This)); +} + +static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3, + BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + DWORD post_data_size = 0; + BYTE *post_data = NULL; + 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) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + FIXME("(%p)->(%p)\n", This, url); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLPrivateWindow_SetPICSTarget(IHTMLPrivateWindow *iface, IOleCommandTarget *cmdtrg) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + FIXME("(%p)->(%p)\n", This, cmdtrg); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLPrivateWindow_PICSComplete(IHTMLPrivateWindow *iface, int arg) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + FIXME("(%p)->(%x)\n", This, arg); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLPrivateWindow_FindWindowByName(IHTMLPrivateWindow *iface, LPCWSTR name, IHTMLWindow2 **ret) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLPrivateWindow_GetAddressBar(IHTMLPrivateWindow *iface, BSTR *url) +{ + HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); + FIXME("(%p)->(%p)\n", This, url); + return E_NOTIMPL; +} + +#undef HTMLPRIVWINDOW_THIS + +static const IHTMLPrivateWindowVtbl HTMLPrivateWindowVtbl = { + HTMLPrivateWindow_QueryInterface, + HTMLPrivateWindow_AddRef, + HTMLPrivateWindow_Release, + HTMLPrivateWindow_SuperNavigate, + HTMLPrivateWindow_GetPendingUrl, + HTMLPrivateWindow_SetPICSTarget, + HTMLPrivateWindow_PICSComplete, + HTMLPrivateWindow_FindWindowByName, + HTMLPrivateWindow_GetAddressBar +}; + #define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface)
static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) @@ -1954,6 +2115,7 @@ window->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl; window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl; window->lpHTMLWindow4Vtbl = &HTMLWindow4Vtbl; + window->lpIHTMLPrivateWindowVtbl = &HTMLPrivateWindowVtbl; window->lpIDispatchExVtbl = &WindowDispExVtbl; window->ref = 1; window->doc_obj = doc_obj;
Modified: trunk/reactos/dll/win32/mshtml/mshtml_private.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/mshtml_pri... ============================================================================== --- trunk/reactos/dll/win32/mshtml/mshtml_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/mshtml_private.h [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -172,9 +172,11 @@ HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); HRESULT get_dispids(tid_t,DWORD*,DISPID**);
+typedef struct HTMLWindow HTMLWindow; typedef struct HTMLDocumentNode HTMLDocumentNode; typedef struct HTMLDocumentObj HTMLDocumentObj; typedef struct HTMLFrameBase HTMLFrameBase; +typedef struct NSContainer NSContainer;
typedef enum { SCRIPTMODE_GECKO, @@ -226,11 +228,14 @@ LONG ref; } windowref_t;
+typedef struct nsChannelBSC nsChannelBSC; + struct HTMLWindow { DispatchEx dispex; const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl; const IHTMLWindow3Vtbl *lpHTMLWindow3Vtbl; const IHTMLWindow4Vtbl *lpHTMLWindow4Vtbl; + const IHTMLPrivateWindowVtbl *lpIHTMLPrivateWindowVtbl; const IDispatchExVtbl *lpIDispatchExVtbl;
LONG ref; @@ -393,7 +398,7 @@ BOOL in_place_active; BOOL ui_active; BOOL window_active; - BOOL has_key_path; + BOOL hostui_setup; BOOL container_locked; BOOL focus; INT download_state; @@ -434,6 +439,11 @@ HWND reset_focus; /* hack */ };
+typedef struct nsWineURI nsWineURI; + +HRESULT set_wine_url(nsWineURI*,LPCWSTR); +nsresult on_start_uri_open(NSContainer*,nsIURI*,PRBool*); + typedef struct { const nsIHttpChannelVtbl *lpHttpChannelVtbl; const nsIUploadChannelVtbl *lpUploadChannelVtbl; @@ -441,7 +451,7 @@
LONG ref;
- nsIWineURI *uri; + nsWineURI *uri; nsIInputStream *post_data_stream; nsILoadGroup *load_group; nsIInterfaceRequestor *notif_callback; @@ -696,12 +706,13 @@ BOOL install_wine_gecko(BOOL);
HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*); -HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsIWineURI**); - -HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD); +HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsWineURI**); +HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD); + +HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD,BOOL*); HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*); HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*); -HRESULT load_nsuri(HTMLWindow*,nsIWineURI*,DWORD); +HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL);
void call_property_onchanged(ConnectionPoint*,DISPID); HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*); @@ -730,11 +741,12 @@ void set_window_bscallback(HTMLWindow*,nsChannelBSC*); void set_current_mon(HTMLWindow*,IMoniker*); HRESULT start_binding(HTMLWindow*,HTMLDocumentNode*,BSCallback*,IBindCtx*); +HRESULT async_start_doc_binding(HTMLWindow*,nsChannelBSC*); void abort_document_bindings(HTMLDocumentNode*);
HRESULT bind_mon_to_buffer(HTMLDocumentNode*,IMoniker*,void**,DWORD*);
-nsChannelBSC *create_channelbsc(IMoniker*); +HRESULT create_channelbsc(IMoniker*,WCHAR*,BYTE*,DWORD,nsChannelBSC**); HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*); void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*); IMoniker *get_channelbsc_mon(nsChannelBSC*);
Modified: trunk/reactos/dll/win32/mshtml/navigate.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/navigate.c... ============================================================================== --- trunk/reactos/dll/win32/mshtml/navigate.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/navigate.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -717,8 +717,11 @@
/* NOTE: IE7 calls IsSystemMoniker here*/
- if(window) + if(window) { + if(bscallback->mon != window->mon) + set_current_mon(window, bscallback->mon); call_docview_84(window->doc_obj); + }
if(bctx) { RegisterBindStatusCallback(bctx, STATUSCLB(bscallback), NULL, 0); @@ -1087,7 +1090,7 @@ TRACE("redirect to %s\n", debugstr_w(status_text));
/* FIXME: We should find a better way to handle this */ - nsIWineURI_SetWineURL(This->nschannel->uri, status_text); + set_wine_url(This->nschannel->uri, status_text); }
return S_OK; @@ -1113,13 +1116,38 @@ nsChannelBSC_on_response };
-nsChannelBSC *create_channelbsc(IMoniker *mon) -{ - nsChannelBSC *ret = heap_alloc_zero(sizeof(*ret)); +HRESULT create_channelbsc(IMoniker *mon, WCHAR *headers, BYTE *post_data, DWORD post_data_size, nsChannelBSC **retval) +{ + nsChannelBSC *ret; + + ret = heap_alloc_zero(sizeof(*ret)); + if(!ret) + return E_OUTOFMEMORY;
init_bscallback(&ret->bsc, &nsChannelBSCVtbl, mon, BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA);
- return ret; + if(headers) { + ret->bsc.headers = heap_strdupW(headers); + if(!ret->bsc.headers) { + IBindStatusCallback_Release(STATUSCLB(&ret->bsc)); + return E_OUTOFMEMORY; + } + } + + if(post_data) { + ret->bsc.post_data = GlobalAlloc(0, post_data_size); + if(!ret->bsc.post_data) { + heap_free(ret->bsc.headers); + IBindStatusCallback_Release(STATUSCLB(&ret->bsc)); + return E_OUTOFMEMORY; + } + + memcpy(ret->bsc.post_data, post_data, post_data_size); + ret->bsc.post_data_len = post_data_size; + } + + *retval = ret; + return S_OK; }
IMoniker *get_channelbsc_mon(nsChannelBSC *This) @@ -1148,6 +1176,36 @@ } }
+typedef struct { + task_t header; + HTMLWindow *window; + nsChannelBSC *bscallback; +} start_doc_binding_task_t; + +static void start_doc_binding_proc(task_t *_task) +{ + start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task; + + start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL); + IBindStatusCallback_Release(STATUSCLB(&task->bscallback->bsc)); +} + +HRESULT async_start_doc_binding(HTMLWindow *window, nsChannelBSC *bscallback) +{ + start_doc_binding_task_t *task; + + task = heap_alloc(sizeof(start_doc_binding_task_t)); + if(!task) + return E_OUTOFMEMORY; + + task->window = window; + task->bscallback = bscallback; + IBindStatusCallback_AddRef(STATUSCLB(&bscallback->bsc)); + + push_task(&task->header, start_doc_binding_proc, window->task_magic); + return S_OK; +} + void abort_document_bindings(HTMLDocumentNode *doc) { BSCallback *iter; @@ -1196,37 +1254,43 @@ }
HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, - nsIInputStream *post_data_stream, DWORD hlnf) + nsIInputStream *post_data_stream, DWORD hlnf, BOOL *cancel) { IHlinkFrame *hlink_frame; + nsChannelBSC *callback; IServiceProvider *sp; - BSCallback *callback; IBindCtx *bindctx; IMoniker *mon; IHlink *hlink; HRESULT hres;
+ *cancel = FALSE; + hres = IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IServiceProvider, (void**)&sp); if(FAILED(hres)) - return hres; + return S_OK;
hres = IServiceProvider_QueryService(sp, &IID_IHlinkFrame, &IID_IHlinkFrame, (void**)&hlink_frame); IServiceProvider_Release(sp); if(FAILED(hres)) + return S_OK; + + hres = create_channelbsc(NULL, NULL, NULL, 0, &callback); + if(FAILED(hres)) { + IHlinkFrame_Release(hlink_frame); return hres; - - callback = &create_channelbsc(NULL)->bsc; + }
if(post_data_stream) { - parse_post_data(post_data_stream, &callback->headers, &callback->post_data, - &callback->post_data_len); - TRACE("headers = %s post_data = %s\n", debugstr_w(callback->headers), - debugstr_an(callback->post_data, callback->post_data_len)); - } - - hres = CreateAsyncBindCtx(0, STATUSCLB(callback), NULL, &bindctx); + parse_post_data(post_data_stream, &callback->bsc.headers, &callback->bsc.post_data, + &callback->bsc.post_data_len); + TRACE("headers = %s post_data = %s\n", debugstr_w(callback->bsc.headers), + debugstr_an(callback->bsc.post_data, callback->bsc.post_data_len)); + } + + hres = CreateAsyncBindCtx(0, STATUSCLB(&callback->bsc), NULL, &bindctx); if(SUCCEEDED(hres)) hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER, &IID_IHlink, (LPVOID*)&hlink); @@ -1242,50 +1306,22 @@ IHlink_SetTargetFrameName(hlink, wszBlank); /* FIXME */ }
- hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(callback), hlink); - + hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(&callback->bsc), hlink); IMoniker_Release(mon); + *cancel = hres == S_OK; + hres = S_OK; }
IHlinkFrame_Release(hlink_frame); IBindCtx_Release(bindctx); - IBindStatusCallback_Release(STATUSCLB(callback)); + IBindStatusCallback_Release(STATUSCLB(&callback->bsc)); return hres; }
-HRESULT load_nsuri(HTMLWindow *window, nsIWineURI *uri, DWORD flags) -{ - nsIWebNavigation *web_navigation; - nsIDocShell *doc_shell; - nsresult nsres; - - nsres = get_nsinterface((nsISupports*)window->nswindow, &IID_nsIWebNavigation, (void**)&web_navigation); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIWebNavigation interface: %08x\n", nsres); - return E_FAIL; - } - - nsres = nsIWebNavigation_QueryInterface(web_navigation, &IID_nsIDocShell, (void**)&doc_shell); - nsIWebNavigation_Release(web_navigation); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIDocShell: %08x\n", nsres); - return E_FAIL; - } - - nsres = nsIDocShell_LoadURI(doc_shell, (nsIURI*)uri, NULL, flags, FALSE); - nsIDocShell_Release(doc_shell); - if(NS_FAILED(nsres)) { - WARN("LoadURI failed: %08x\n", nsres); - return E_FAIL; - } - - return S_OK; -} - HRESULT navigate_url(HTMLWindow *window, const WCHAR *new_url, const WCHAR *base_url) { WCHAR url[INTERNET_MAX_URL_LENGTH]; - nsIWineURI *uri; + nsWineURI *uri; HRESULT hres;
if(!new_url) { @@ -1307,23 +1343,30 @@ hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, url, &translated_url); if(hres == S_OK) { + TRACE("%08x %s -> %s\n", hres, debugstr_w(url), debugstr_w(translated_url)); strcpyW(url, translated_url); CoTaskMemFree(translated_url); } }
if(window->doc_obj && window == window->doc_obj->basedoc.window) { - hres = hlink_frame_navigate(&window->doc->basedoc, url, NULL, 0); - if(SUCCEEDED(hres)) + BOOL cancel; + + hres = hlink_frame_navigate(&window->doc->basedoc, url, NULL, 0, &cancel); + if(FAILED(hres)) + return hres; + + if(cancel) { + TRACE("Navigation handled by hlink frame\n"); return S_OK; - TRACE("hlink_frame_navigate failed: %08x\n", hres); + } }
hres = create_doc_uri(window, url, &uri); if(FAILED(hres)) return hres;
- hres = load_nsuri(window, uri, LOAD_FLAGS_NONE); - nsIWineURI_Release(uri); + hres = load_nsuri(window, uri, NULL, LOAD_FLAGS_NONE); + nsISupports_Release((nsISupports*)uri); return hres; }
Modified: trunk/reactos/dll/win32/mshtml/nsembed.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/nsembed.c?... ============================================================================== --- trunk/reactos/dll/win32/mshtml/nsembed.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/nsembed.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -1124,41 +1124,12 @@ return nsIWebBrowserChrome_Release(NSWBCHROME(This)); }
-static BOOL translate_url(HTMLDocumentObj *doc, nsIWineURI *nsuri) -{ - OLECHAR *new_url = NULL, *url; - BOOL ret = FALSE; - LPCWSTR wine_url; - HRESULT hres; - - if(!doc->hostui) - return FALSE; - - nsIWineURI_GetWineURL(nsuri, &wine_url); - - url = heap_strdupW(wine_url); - hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url); - heap_free(url); - if(hres != S_OK || !new_url) - return FALSE; - - if(strcmpW(url, new_url)) { - FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url)); - ret = TRUE; - } - - CoTaskMemFree(new_url); - return ret; -} - static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface, nsIURI *aURI, PRBool *_retval) { NSContainer *This = NSURICL_THIS(iface); - nsIWineURI *wine_uri; nsACString spec_str; const char *spec; - BOOL is_doc_uri; nsresult nsres;
nsACString_Init(&spec_str, NULL); @@ -1169,22 +1140,9 @@
nsACString_Finish(&spec_str);
- nsres = nsIURI_QueryInterface(aURI, &IID_nsIWineURI, (void**)&wine_uri); - if(NS_FAILED(nsres)) { - WARN("Could not get nsIWineURI interface: %08x\n", nsres); - return NS_ERROR_NOT_IMPLEMENTED; - } - - nsIWineURI_GetIsDocumentURI(wine_uri, &is_doc_uri); - - if(!is_doc_uri) { - nsIWineURI_SetNSContainer(wine_uri, This); - nsIWineURI_SetIsDocumentURI(wine_uri, TRUE); - - *_retval = translate_url(This->doc->basedoc.doc_obj, wine_uri); - } - - nsIWineURI_Release(wine_uri); + nsres = on_start_uri_open(This, aURI, _retval); + if(NS_FAILED(nsres)) + return nsres;
return !*_retval && This->content_listener ? nsIURIContentListener_OnStartURIOpen(This->content_listener, aURI, _retval)
Modified: trunk/reactos/dll/win32/mshtml/nsiface.idl URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/nsiface.id... ============================================================================== --- trunk/reactos/dll/win32/mshtml/nsiface.idl [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/nsiface.idl [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -2820,32 +2820,3 @@ void BindToDocument(nsIDocument *aDocument, nsIContent *aContent); void DoneAddingChildren(nsIContent *aContent, PRBool aHaveNotified); } - -/* - * NOTE: - * This is a private Wine interface that is implemented by our implementation - * of nsIURI to store its owner. - */ -[ - object, - uuid(5088272e-900b-11da-c687-000fea57f21a), - local - /* INTERNAL */ -] -interface nsIWineURI : nsIURL -{ - typedef struct NSContainer NSContainer; - typedef struct HTMLWindow HTMLWindow; - typedef struct nsChannelBSC nsChannelBSC; - - nsresult GetNSContainer(NSContainer **aNSContainer); - nsresult SetNSContainer(NSContainer *aNSContainer); - nsresult GetWindow(HTMLWindow **aHTMLWindow); - nsresult SetWindow(HTMLWindow *aHTMLWindow); - nsresult GetChannelBSC(nsChannelBSC **aChannelBSC); - nsresult SetChannelBSC(nsChannelBSC *aChannelBSC); - nsresult GetIsDocumentURI(PRBool *aIsDocumentURI); - nsresult SetIsDocumentURI(PRBool aIsDocumentURI); - nsresult GetWineURL(LPCWSTR *aURL); - nsresult SetWineURL(LPCWSTR aURL); -}
Modified: trunk/reactos/dll/win32/mshtml/nsio.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/nsio.c?rev... ============================================================================== --- trunk/reactos/dll/win32/mshtml/nsio.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/nsio.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -43,14 +43,16 @@
static const IID NS_IOSERVICE_CID = {0x9ac9e770, 0x18bc, 0x11d3, {0x93, 0x37, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40}}; +static const IID IID_nsWineURI = + {0x5088272e, 0x900b, 0x11da, {0xc6,0x87, 0x00,0x0f,0xea,0x57,0xf2,0x1a}};
static nsIIOService *nsio = NULL; static nsINetUtil *net_util;
static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
-typedef struct { - const nsIWineURIVtbl *lpWineURIVtbl; +struct nsWineURI { + const nsIURLVtbl *lpIURLVtbl;
LONG ref;
@@ -60,14 +62,14 @@ windowref_t *window_ref; nsChannelBSC *channel_bsc; LPWSTR wine_url; - PRBool is_doc_uri; + BOOL is_doc_uri; BOOL use_wine_url; -} nsURI; - -#define NSURI(x) ((nsIURI*) &(x)->lpWineURIVtbl) -#define NSWINEURI(x) ((nsIWineURI*) &(x)->lpWineURIVtbl) - -static nsresult create_uri(nsIURI*,HTMLWindow*,NSContainer*,nsIWineURI**); +}; + +#define NSURI(x) ((nsIURI*) &(x)->lpIURLVtbl) +#define NSURL(x) ((nsIURL*) &(x)->lpIURLVtbl) + +static nsresult create_uri(nsIURI*,HTMLWindow*,NSContainer*,nsWineURI**);
static const char *debugstr_nsacstr(const nsACString *nsstr) { @@ -129,14 +131,8 @@ { HTMLDocumentObj *doc = container->doc; DWORD hlnf = 0; - LPCWSTR uri; + BOOL cancel; HRESULT hres; - - nsIWineURI_GetWineURL(channel->uri, &uri); - if(!uri) { - ERR("GetWineURL returned NULL\n"); - return TRUE; - }
if(!doc) { NSContainer *container_iter = container; @@ -150,11 +146,163 @@ if(!doc->client) return TRUE;
- if(!hlnf && !exec_shldocvw_67(doc, uri)) + if(!hlnf && !exec_shldocvw_67(doc, channel->uri->wine_url)) return FALSE;
- hres = hlink_frame_navigate(&doc->basedoc, uri, channel->post_data_stream, hlnf); - return hres != S_OK; + hres = hlink_frame_navigate(&doc->basedoc, channel->uri->wine_url, channel->post_data_stream, hlnf, &cancel); + return FAILED(hres) || cancel; +} + +HRESULT load_nsuri(HTMLWindow *window, nsWineURI *uri, nsChannelBSC *channelbsc, DWORD flags) +{ + nsIWebNavigation *web_navigation; + nsIDocShell *doc_shell; + nsresult nsres; + + nsres = get_nsinterface((nsISupports*)window->nswindow, &IID_nsIWebNavigation, (void**)&web_navigation); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIWebNavigation interface: %08x\n", nsres); + return E_FAIL; + } + + nsres = nsIWebNavigation_QueryInterface(web_navigation, &IID_nsIDocShell, (void**)&doc_shell); + nsIWebNavigation_Release(web_navigation); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDocShell: %08x\n", nsres); + return E_FAIL; + } + + + uri->channel_bsc = channelbsc; + nsres = nsIDocShell_LoadURI(doc_shell, NSURI(uri), NULL, flags, FALSE); + uri->channel_bsc = NULL; + nsIDocShell_Release(doc_shell); + if(NS_FAILED(nsres)) { + WARN("LoadURI failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; +} + +static BOOL translate_url(HTMLDocumentObj *doc, nsWineURI *uri) +{ + OLECHAR *new_url = NULL, *url; + BOOL ret = FALSE; + HRESULT hres; + + if(!doc->hostui) + return FALSE; + + url = heap_strdupW(uri->wine_url); + hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url); + heap_free(url); + if(hres != S_OK || !new_url) + return FALSE; + + if(strcmpW(url, new_url)) { + FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url)); + ret = TRUE; + } + + CoTaskMemFree(new_url); + return ret; +} + +nsresult on_start_uri_open(NSContainer *nscontainer, nsIURI *uri, PRBool *_retval) +{ + nsWineURI *wine_uri; + nsresult nsres; + + *_retval = FALSE; + + nsres = nsIURI_QueryInterface(uri, &IID_nsWineURI, (void**)&wine_uri); + if(NS_FAILED(nsres)) { + WARN("Could not get nsWineURI: %08x\n", nsres); + return NS_ERROR_NOT_IMPLEMENTED; + } + + if(!wine_uri->is_doc_uri) { + if(!wine_uri->container) { + nsIWebBrowserChrome_AddRef(NSWBCHROME(nscontainer)); + wine_uri->container = nscontainer; + } + + wine_uri->is_doc_uri = TRUE; + *_retval = translate_url(nscontainer->doc->basedoc.doc_obj, wine_uri); + } + + nsIURI_Release(NSURI(wine_uri)); + return NS_OK; +} + +HRESULT set_wine_url(nsWineURI *This, LPCWSTR url) +{ + static const WCHAR wszFtp[] = {'f','t','p',':'}; + static const WCHAR wszHttp[] = {'h','t','t','p',':'}; + static const WCHAR wszHttps[] = {'h','t','t','p','s',':'}; + + TRACE("(%p)->(%s)\n", This, debugstr_w(url)); + + if(url) { + WCHAR *new_url; + + new_url = heap_strdupW(url); + if(!new_url) + return E_OUTOFMEMORY; + heap_free(This->wine_url); + This->wine_url = new_url; + + if(This->uri) { + /* FIXME: Always use wine url */ + This->use_wine_url = + strncmpW(url, wszFtp, sizeof(wszFtp)/sizeof(WCHAR)) + && strncmpW(url, wszHttp, sizeof(wszHttp)/sizeof(WCHAR)) + && strncmpW(url, wszHttps, sizeof(wszHttps)/sizeof(WCHAR)); + }else { + This->use_wine_url = TRUE; + } + }else { + heap_free(This->wine_url); + This->wine_url = NULL; + This->use_wine_url = FALSE; + } + + return S_OK; +} + +static void set_uri_nscontainer(nsWineURI *This, NSContainer *nscontainer) +{ + if(This->container) { + if(This->container == nscontainer) + return; + TRACE("Changing %p -> %p\n", This->container, nscontainer); + nsIWebBrowserChrome_Release(NSWBCHROME(This->container)); + } + + if(nscontainer) + nsIWebBrowserChrome_AddRef(NSWBCHROME(nscontainer)); + This->container = nscontainer; +} + +static void set_uri_window(nsWineURI *This, HTMLWindow *window) +{ + if(This->window_ref) { + if(This->window_ref->window == window) + return; + TRACE("Changing %p -> %p\n", This->window_ref->window, window); + windowref_release(This->window_ref); + } + + if(window) { + windowref_addref(window->window_ref); + This->window_ref = window->window_ref; + + if(window->doc_obj) + set_uri_nscontainer(This, window->doc_obj->nscontainer); + }else { + This->window_ref = NULL; + } }
static inline BOOL is_http_channel(nsChannel *This) @@ -215,7 +363,7 @@ LONG ref = InterlockedDecrement(&This->ref);
if(!ref) { - nsIWineURI_Release(This->uri); + nsIURI_Release(NSURI(This->uri)); if(This->owner) nsISupports_Release(This->owner); if(This->post_data_stream) @@ -369,7 +517,7 @@
TRACE("(%p)->(%p)\n", This, aURI);
- nsIWineURI_AddRef(This->uri); + nsIURI_AddRef(NSURI(This->uri)); *aURI = (nsIURI*)This->uri;
return NS_OK; @@ -531,8 +679,7 @@
static HRESULT create_mon_for_nschannel(nsChannel *channel, IMoniker **mon) { - nsIWineURI *wine_uri; - LPCWSTR wine_url; + nsWineURI *wine_uri; nsresult nsres; HRESULT hres;
@@ -541,22 +688,22 @@ return E_FAIL; }
- nsres = nsIURI_QueryInterface(channel->original_uri, &IID_nsIWineURI, (void**)&wine_uri); + nsres = nsIURI_QueryInterface(channel->original_uri, &IID_nsWineURI, (void**)&wine_uri); if(NS_FAILED(nsres)) { - ERR("Could not get nsIWineURI: %08x\n", nsres); + ERR("Could not get nsWineURI: %08x\n", nsres); return E_FAIL; }
- nsIWineURI_GetWineURL(wine_uri, &wine_url); - nsIWineURI_Release(wine_uri); - if(!wine_url) { + if(wine_uri->wine_url) { + hres = CreateURLMoniker(NULL, wine_uri->wine_url, mon); + if(FAILED(hres)) + WARN("CreateURLMoniker failed: %08x\n", hres); + }else { TRACE("wine_url == NULL\n"); - return E_FAIL; - } - - hres = CreateURLMoniker(NULL, wine_url, mon); - if(FAILED(hres)) - WARN("CreateURLMoniker failed: %08x\n", hres); + hres = E_FAIL; + } + + nsIURI_Release(NSURI(wine_uri));
return hres; } @@ -566,7 +713,7 @@ HTMLWindow *window; nsIChannel *channel; nsIRequest *req; - nsIWineURI *wine_uri; + nsWineURI *wine_uri; nsIURI *uri; nsresult nsres;
@@ -593,15 +740,17 @@ return NULL; }
- nsres = nsIURI_QueryInterface(uri, &IID_nsIWineURI, (void**)&wine_uri); + nsres = nsIURI_QueryInterface(uri, &IID_nsWineURI, (void**)&wine_uri); nsIURI_Release(uri); if(NS_FAILED(nsres)) { - TRACE("Could not get nsIWineURI: %08x\n", nsres); + TRACE("Could not get nsWineURI: %08x\n", nsres); return NULL; }
- nsIWineURI_GetWindow(wine_uri, &window); - nsIWineURI_Release(wine_uri); + window = wine_uri->window_ref ? wine_uri->window_ref->window : NULL; + if(window) + IHTMLWindow2_AddRef(HTMLWINDOW2(window)); + nsIURI_Release(NSURI(wine_uri));
return window; } @@ -660,19 +809,7 @@ start_binding_task_t *task = (start_binding_task_t*)_task;
start_binding(NULL, task->doc, (BSCallback*)task->bscallback, NULL); -} - -typedef struct { - task_t header; - HTMLWindow *window; - nsChannelBSC *bscallback; -} start_doc_binding_task_t; - -static void start_doc_binding_proc(task_t *_task) -{ - start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task; - - start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL); + IUnknown_Release((IUnknown*)task->bscallback); }
@@ -690,20 +827,17 @@ if(is_doc_channel) set_current_mon(window, mon);
- bscallback = create_channelbsc(mon); + hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback); IMoniker_Release(mon); + if(FAILED(hres)) + return NS_ERROR_UNEXPECTED;
channelbsc_set_channel(bscallback, This, listener, context);
if(is_doc_channel) { - start_doc_binding_task_t *task; - set_window_bscallback(window, bscallback); - - task = heap_alloc(sizeof(start_doc_binding_task_t)); - task->window = window; - task->bscallback = bscallback; - push_task(&task->header, start_doc_binding_proc, window->task_magic); + async_start_doc_binding(window, bscallback); + IUnknown_Release((IUnknown*)bscallback); }else { start_binding_task_t *task = heap_alloc(sizeof(start_binding_task_t));
@@ -720,51 +854,37 @@ { nsChannel *This = NSCHANNEL_THIS(iface); HTMLWindow *window = NULL; - PRBool is_doc_uri; BOOL open = TRUE; nsresult nsres = NS_OK;
- TRACE("(%p)->(%p %p)\n", This, aListener, aContext); - - if(TRACE_ON(mshtml)) { - LPCWSTR url; - - nsIWineURI_GetWineURL(This->uri, &url); - TRACE("opening %s\n", debugstr_w(url)); - } - - nsIWineURI_GetIsDocumentURI(This->uri, &is_doc_uri); - if(is_doc_uri) { + TRACE("(%p)->(%p %p) opening %s\n", This, aListener, aContext, debugstr_w(This->uri->wine_url)); + + if(This->uri->is_doc_uri) { window = get_channel_window(This); if(window) { - nsIWineURI_SetWindow(This->uri, window); - }else { - NSContainer *nscontainer; - - nsIWineURI_GetNSContainer(This->uri, &nscontainer); - if(nscontainer) { - BOOL b; - - /* nscontainer->doc should be NULL which means navigation to a new window */ - if(nscontainer->doc) - FIXME("nscontainer->doc = %p\n", nscontainer->doc); - - b = before_async_open(This, nscontainer); - nsIWebBrowserChrome_Release(NSWBCHROME(nscontainer)); - if(b) - FIXME("Navigation not cancelled\n"); - return NS_ERROR_UNEXPECTED; - } + set_uri_window(This->uri, window); + }else if(This->uri->container) { + BOOL b; + + /* nscontainer->doc should be NULL which means navigation to a new window */ + if(This->uri->container->doc) + FIXME("nscontainer->doc = %p\n", This->uri->container->doc); + + b = before_async_open(This, This->uri->container); + if(b) + FIXME("Navigation not cancelled\n"); + return NS_ERROR_UNEXPECTED; } }
if(!window) { - nsIWineURI_GetWindow(This->uri, &window); - - if(!window && This->load_group) { + if(This->uri->window_ref && This->uri->window_ref->window) { + window = This->uri->window_ref->window; + IHTMLWindow2_AddRef(HTMLWINDOW2(window)); + }else if(This->load_group) { window = get_window_from_load_group(This); if(window) - nsIWineURI_SetWindow(This->uri, window); + set_uri_window(This->uri, window); } }
@@ -773,13 +893,9 @@ return NS_ERROR_UNEXPECTED; }
- if(is_doc_uri && window == window->doc_obj->basedoc.window) { - nsChannelBSC *channel_bsc; - - nsIWineURI_GetChannelBSC(This->uri, &channel_bsc); - if(channel_bsc) { - channelbsc_set_channel(channel_bsc, This, aListener, aContext); - IUnknown_Release((IUnknown*)channel_bsc); + if(This->uri->is_doc_uri && window == window->doc_obj->basedoc.window) { + if(This->uri->channel_bsc) { + channelbsc_set_channel(This->uri->channel_bsc, This, aListener, aContext);
if(window->doc_obj->mime) { heap_free(This->content_type); @@ -797,7 +913,7 @@ }
if(open) - nsres = async_open(This, window, is_doc_uri, aListener, aContext); + nsres = async_open(This, window, This->uri->is_doc_uri, aListener, aContext);
IHTMLWindow2_Release(HTMLWINDOW2(window)); return nsres; @@ -1225,11 +1341,11 @@ nsHttpChannelInternal_SetForceAllowThirdPartyCookie };
-#define NSURI_THIS(iface) DEFINE_THIS(nsURI, WineURI, iface) - -static nsresult NSAPI nsURI_QueryInterface(nsIWineURI *iface, nsIIDRef riid, nsQIResult result) -{ - nsURI *This = NSURI_THIS(iface); +#define NSURI_THIS(iface) DEFINE_THIS(nsWineURI, IURL, iface) + +static nsresult NSAPI nsURI_QueryInterface(nsIURL *iface, nsIIDRef riid, nsQIResult result) +{ + nsWineURI *This = NSURI_THIS(iface);
*result = NULL;
@@ -1241,10 +1357,10 @@ *result = NSURI(This); }else if(IsEqualGUID(&IID_nsIURL, riid)) { TRACE("(%p)->(IID_nsIURL %p)\n", This, result); - *result = NSURI(This); - }else if(IsEqualGUID(&IID_nsIWineURI, riid)) { - TRACE("(%p)->(IID_nsIWineURI %p)\n", This, result); - *result = NSURI(This); + *result = NSURL(This); + }else if(IsEqualGUID(&IID_nsWineURI, riid)) { + TRACE("(%p)->(IID_nsWineURI %p)\n", This, result); + *result = This; }
if(*result) { @@ -1256,9 +1372,9 @@ return This->uri ? nsIURI_QueryInterface(This->uri, riid, result) : NS_NOINTERFACE; }
-static nsrefcnt NSAPI nsURI_AddRef(nsIWineURI *iface) -{ - nsURI *This = NSURI_THIS(iface); +static nsrefcnt NSAPI nsURI_AddRef(nsIURL *iface) +{ + nsWineURI *This = NSURI_THIS(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref); @@ -1266,9 +1382,9 @@ return ref; }
-static nsrefcnt NSAPI nsURI_Release(nsIWineURI *iface) -{ - nsURI *This = NSURI_THIS(iface); +static nsrefcnt NSAPI nsURI_Release(nsIURL *iface) +{ + nsWineURI *This = NSURI_THIS(iface); LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref); @@ -1289,9 +1405,9 @@ return ref; }
-static nsresult NSAPI nsURI_GetSpec(nsIWineURI *iface, nsACString *aSpec) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetSpec(nsIURL *iface, nsACString *aSpec) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aSpec);
@@ -1311,9 +1427,9 @@
}
-static nsresult NSAPI nsURI_SetSpec(nsIWineURI *iface, const nsACString *aSpec) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetSpec(nsIURL *iface, const nsACString *aSpec) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aSpec);
@@ -1324,9 +1440,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetPrePath(nsIWineURI *iface, nsACString *aPrePath) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetPrePath(nsIURL *iface, nsACString *aPrePath) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aPrePath);
@@ -1337,9 +1453,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetScheme(nsIWineURI *iface, nsACString *aScheme) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetScheme(nsIURL *iface, nsACString *aScheme) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aScheme);
@@ -1359,9 +1475,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetScheme(nsIWineURI *iface, const nsACString *aScheme) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetScheme(nsIURL *iface, const nsACString *aScheme) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aScheme);
@@ -1372,9 +1488,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetUserPass(nsIWineURI *iface, nsACString *aUserPass) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetUserPass(nsIURL *iface, nsACString *aUserPass) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aUserPass);
@@ -1385,9 +1501,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetUserPass(nsIWineURI *iface, const nsACString *aUserPass) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetUserPass(nsIURL *iface, const nsACString *aUserPass) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aUserPass);
@@ -1398,9 +1514,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetUsername(nsIWineURI *iface, nsACString *aUsername) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetUsername(nsIURL *iface, nsACString *aUsername) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aUsername);
@@ -1411,9 +1527,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetUsername(nsIWineURI *iface, const nsACString *aUsername) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetUsername(nsIURL *iface, const nsACString *aUsername) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aUsername);
@@ -1424,9 +1540,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetPassword(nsIWineURI *iface, nsACString *aPassword) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetPassword(nsIURL *iface, nsACString *aPassword) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aPassword);
@@ -1437,9 +1553,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetPassword(nsIWineURI *iface, const nsACString *aPassword) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetPassword(nsIURL *iface, const nsACString *aPassword) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aPassword);
@@ -1450,9 +1566,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetHostPort(nsIWineURI *iface, nsACString *aHostPort) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetHostPort(nsIURL *iface, nsACString *aHostPort) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aHostPort);
@@ -1463,9 +1579,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetHostPort(nsIWineURI *iface, const nsACString *aHostPort) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetHostPort(nsIURL *iface, const nsACString *aHostPort) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aHostPort);
@@ -1476,9 +1592,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetHost(nsIWineURI *iface, nsACString *aHost) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetHost(nsIURL *iface, nsACString *aHost) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aHost);
@@ -1489,9 +1605,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetHost(nsIWineURI *iface, const nsACString *aHost) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetHost(nsIURL *iface, const nsACString *aHost) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aHost);
@@ -1502,9 +1618,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetPort(nsIWineURI *iface, PRInt32 *aPort) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetPort(nsIURL *iface, PRInt32 *aPort) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aPort);
@@ -1515,9 +1631,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetPort(nsIWineURI *iface, PRInt32 aPort) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetPort(nsIURL *iface, PRInt32 aPort) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%d)\n", This, aPort);
@@ -1528,9 +1644,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetPath(nsIWineURI *iface, nsACString *aPath) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetPath(nsIURL *iface, nsACString *aPath) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aPath);
@@ -1541,9 +1657,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_SetPath(nsIWineURI *iface, const nsACString *aPath) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SetPath(nsIURL *iface, const nsACString *aPath) +{ + nsWineURI *This = NSURI_THIS(iface); const char *path;
nsACString_GetData(aPath, &path); @@ -1560,7 +1676,7 @@ hres = UrlCombineW(This->wine_url, pathw, new_url, &size, 0); heap_free(pathw); if(SUCCEEDED(hres)) - nsIWineURI_SetWineURL(NSWINEURI(This), new_url); + set_wine_url(This, new_url); else WARN("UrlCombine failed: %08x\n", hres); } @@ -1571,11 +1687,10 @@ return nsIURI_SetPath(This->uri, aPath); }
-static nsresult NSAPI nsURI_Equals(nsIWineURI *iface, nsIURI *other, PRBool *_retval) -{ - nsURI *This = NSURI_THIS(iface); - nsIWineURI *wine_uri; - LPCWSTR other_url = NULL; +static nsresult NSAPI nsURI_Equals(nsIURL *iface, nsIURI *other, PRBool *_retval) +{ + nsWineURI *This = NSURI_THIS(iface); + nsWineURI *wine_uri; nsresult nsres;
TRACE("(%p)->(%p %p)\n", This, other, _retval); @@ -1583,23 +1698,22 @@ if(This->uri) return nsIURI_Equals(This->uri, other, _retval);
- nsres = nsIURI_QueryInterface(other, &IID_nsIWineURI, (void**)&wine_uri); + nsres = nsIURI_QueryInterface(other, &IID_nsWineURI, (void**)&wine_uri); if(NS_FAILED(nsres)) { - TRACE("Could not get nsIWineURI interface\n"); + TRACE("Could not get nsWineURI interface\n"); *_retval = FALSE; return NS_OK; }
- nsIWineURI_GetWineURL(wine_uri, &other_url); - *_retval = other_url && !UrlCompareW(This->wine_url, other_url, TRUE); - nsIWineURI_Release(wine_uri); + *_retval = wine_uri->wine_url && !UrlCompareW(This->wine_url, wine_uri->wine_url, TRUE); + nsIURI_Release(NSURI(wine_uri));
return NS_OK; }
-static nsresult NSAPI nsURI_SchemeIs(nsIWineURI *iface, const char *scheme, PRBool *_retval) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_SchemeIs(nsIURL *iface, const char *scheme, PRBool *_retval) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_a(scheme), _retval);
@@ -1620,11 +1734,11 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_Clone(nsIWineURI *iface, nsIURI **_retval) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_Clone(nsIURL *iface, nsIURI **_retval) +{ + nsWineURI *This = NSURI_THIS(iface); nsIURI *nsuri = NULL; - nsIWineURI *wine_uri; + nsWineURI *wine_uri; nsresult nsres;
TRACE("(%p)->(%p)\n", This, _retval); @@ -1643,14 +1757,16 @@ return nsres; }
- *_retval = (nsIURI*)wine_uri; - return nsIWineURI_SetWineURL(wine_uri, This->wine_url); -} - -static nsresult NSAPI nsURI_Resolve(nsIWineURI *iface, const nsACString *arelativePath, + set_wine_url(wine_uri, This->wine_url); + + *_retval = NSURI(wine_uri); + return NS_OK; +} + +static nsresult NSAPI nsURI_Resolve(nsIURL *iface, const nsACString *arelativePath, nsACString *_retval) { - nsURI *This = NSURI_THIS(iface); + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p %p)\n", This, arelativePath, _retval);
@@ -1661,9 +1777,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetAsciiSpec(nsIWineURI *iface, nsACString *aAsciiSpec) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetAsciiSpec(nsIURL *iface, nsACString *aAsciiSpec) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aAsciiSpec);
@@ -1677,9 +1793,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetAsciiHost(nsIWineURI *iface, nsACString *aAsciiHost) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetAsciiHost(nsIURL *iface, nsACString *aAsciiHost) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aAsciiHost);
@@ -1690,9 +1806,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetOriginCharset(nsIWineURI *iface, nsACString *aOriginCharset) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURI_GetOriginCharset(nsIURL *iface, nsACString *aOriginCharset) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aOriginCharset);
@@ -1703,9 +1819,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetFilePath(nsIWineURI *iface, nsACString *aFilePath) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetFilePath(nsIURL *iface, nsACString *aFilePath) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aFilePath);
@@ -1716,9 +1832,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetFilePath(nsIWineURI *iface, const nsACString *aFilePath) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetFilePath(nsIURL *iface, const nsACString *aFilePath) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFilePath));
@@ -1729,9 +1845,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetParam(nsIWineURI *iface, nsACString *aParam) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetParam(nsIURL *iface, nsACString *aParam) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aParam);
@@ -1742,9 +1858,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetParam(nsIWineURI *iface, const nsACString *aParam) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetParam(nsIURL *iface, const nsACString *aParam) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aParam));
@@ -1755,9 +1871,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetQuery(nsIWineURI *iface, nsACString *aQuery) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetQuery(nsIURL *iface, nsACString *aQuery) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aQuery);
@@ -1768,9 +1884,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetQuery(nsIWineURI *iface, const nsACString *aQuery) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetQuery(nsIURL *iface, const nsACString *aQuery) +{ + nsWineURI *This = NSURI_THIS(iface); const WCHAR *ptr1, *ptr2; const char *query; WCHAR *new_url, *ptr; @@ -1821,9 +1937,9 @@ return NS_OK; }
-static nsresult NSAPI nsURL_GetRef(nsIWineURI *iface, nsACString *aRef) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetRef(nsIURL *iface, nsACString *aRef) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aRef);
@@ -1834,9 +1950,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetRef(nsIWineURI *iface, const nsACString *aRef) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetRef(nsIURL *iface, const nsACString *aRef) +{ + nsWineURI *This = NSURI_THIS(iface); const char *refa;
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aRef)); @@ -1852,9 +1968,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetDirectory(nsIWineURI *iface, nsACString *aDirectory) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetDirectory(nsIURL *iface, nsACString *aDirectory) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aDirectory);
@@ -1865,9 +1981,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetDirectory(nsIWineURI *iface, const nsACString *aDirectory) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetDirectory(nsIURL *iface, const nsACString *aDirectory) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aDirectory));
@@ -1878,9 +1994,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetFileName(nsIWineURI *iface, nsACString *aFileName) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetFileName(nsIURL *iface, nsACString *aFileName) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aFileName);
@@ -1891,9 +2007,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetFileName(nsIWineURI *iface, const nsACString *aFileName) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetFileName(nsIURL *iface, const nsACString *aFileName) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileName));
@@ -1904,9 +2020,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetFileBaseName(nsIWineURI *iface, nsACString *aFileBaseName) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetFileBaseName(nsIURL *iface, nsACString *aFileBaseName) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aFileBaseName);
@@ -1917,9 +2033,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetFileBaseName(nsIWineURI *iface, const nsACString *aFileBaseName) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetFileBaseName(nsIURL *iface, const nsACString *aFileBaseName) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileBaseName));
@@ -1930,9 +2046,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetFileExtension(nsIWineURI *iface, nsACString *aFileExtension) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetFileExtension(nsIURL *iface, nsACString *aFileExtension) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p)\n", This, aFileExtension);
@@ -1943,9 +2059,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_SetFileExtension(nsIWineURI *iface, const nsACString *aFileExtension) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_SetFileExtension(nsIURL *iface, const nsACString *aFileExtension) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileExtension));
@@ -1956,9 +2072,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetCommonBaseSpec(nsIWineURI *iface, nsIURI *aURIToCompare, nsACString *_retval) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetCommonBaseSpec(nsIURL *iface, nsIURI *aURIToCompare, nsACString *_retval) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p %p)\n", This, aURIToCompare, _retval);
@@ -1969,9 +2085,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURL_GetRelativeSpec(nsIWineURI *iface, nsIURI *aURIToCompare, nsACString *_retval) -{ - nsURI *This = NSURI_THIS(iface); +static nsresult NSAPI nsURL_GetRelativeSpec(nsIURL *iface, nsIURI *aURIToCompare, nsACString *_retval) +{ + nsWineURI *This = NSURI_THIS(iface);
TRACE("(%p)->(%p %p)\n", This, aURIToCompare, _retval);
@@ -1982,174 +2098,9 @@ return NS_ERROR_NOT_IMPLEMENTED; }
-static nsresult NSAPI nsURI_GetNSContainer(nsIWineURI *iface, NSContainer **aContainer) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aContainer); - - if(This->container) - nsIWebBrowserChrome_AddRef(NSWBCHROME(This->container)); - *aContainer = This->container; - - return NS_OK; -} - -static nsresult NSAPI nsURI_SetNSContainer(nsIWineURI *iface, NSContainer *aContainer) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aContainer); - - if(This->container) { - if(This->container == aContainer) - return NS_OK; - TRACE("Changing %p -> %p\n", This->container, aContainer); - nsIWebBrowserChrome_Release(NSWBCHROME(This->container)); - } - - if(aContainer) - nsIWebBrowserChrome_AddRef(NSWBCHROME(aContainer)); - This->container = aContainer; - - return NS_OK; -} - -static nsresult NSAPI nsURI_GetWindow(nsIWineURI *iface, HTMLWindow **aHTMLWindow) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aHTMLWindow); - - if(This->window_ref && This->window_ref->window) { - IHTMLWindow2_AddRef(HTMLWINDOW2(This->window_ref->window)); - *aHTMLWindow = This->window_ref->window; - }else { - *aHTMLWindow = NULL; - } - - return NS_OK; -} - -static nsresult NSAPI nsURI_SetWindow(nsIWineURI *iface, HTMLWindow *aHTMLWindow) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aHTMLWindow); - - if(This->window_ref) { - if(This->window_ref->window == aHTMLWindow) - return NS_OK; - TRACE("Changing %p -> %p\n", This->window_ref->window, aHTMLWindow); - windowref_release(This->window_ref); - } - - if(aHTMLWindow) { - windowref_addref(aHTMLWindow->window_ref); - This->window_ref = aHTMLWindow->window_ref; - - if(aHTMLWindow->doc_obj) - nsIWineURI_SetNSContainer(NSWINEURI(This), aHTMLWindow->doc_obj->nscontainer); - }else { - This->window_ref = NULL; - } - - return NS_OK; -} - -static nsresult NSAPI nsURI_GetChannelBSC(nsIWineURI *iface, nsChannelBSC **aChannelBSC) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aChannelBSC); - - if(This->channel_bsc) - IUnknown_AddRef((IUnknown*)This->channel_bsc); - *aChannelBSC = This->channel_bsc; - return NS_OK; -} - -static nsresult NSAPI nsURI_SetChannelBSC(nsIWineURI *iface, nsChannelBSC *aChannelBSC) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aChannelBSC); - - if(This->channel_bsc) - IUnknown_Release((IUnknown*)This->channel_bsc); - if(aChannelBSC) - IUnknown_AddRef((IUnknown*)aChannelBSC); - This->channel_bsc = aChannelBSC; - return NS_OK; -} - -static nsresult NSAPI nsURI_GetIsDocumentURI(nsIWineURI *iface, PRBool *aIsDocumentURI) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aIsDocumentURI); - - *aIsDocumentURI = This->is_doc_uri; - return NS_OK; -} - -static nsresult NSAPI nsURI_SetIsDocumentURI(nsIWineURI *iface, PRBool aIsDocumentURI) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%x)\n", This, aIsDocumentURI); - - This->is_doc_uri = aIsDocumentURI; - return NS_OK; -} - -static nsresult NSAPI nsURI_GetWineURL(nsIWineURI *iface, LPCWSTR *aURL) -{ - nsURI *This = NSURI_THIS(iface); - - TRACE("(%p)->(%p)\n", This, aURL); - - *aURL = This->wine_url; - return NS_OK; -} - -static nsresult NSAPI nsURI_SetWineURL(nsIWineURI *iface, LPCWSTR aURL) -{ - nsURI *This = NSURI_THIS(iface); - - static const WCHAR wszFtp[] = {'f','t','p',':'}; - static const WCHAR wszHttp[] = {'h','t','t','p',':'}; - static const WCHAR wszHttps[] = {'h','t','t','p','s',':'}; - - TRACE("(%p)->(%s)\n", This, debugstr_w(aURL)); - - heap_free(This->wine_url); - - if(aURL) { - int len = strlenW(aURL)+1; - This->wine_url = heap_alloc(len*sizeof(WCHAR)); - memcpy(This->wine_url, aURL, len*sizeof(WCHAR)); - - if(This->uri) { - /* FIXME: Always use wine url */ - This->use_wine_url = - strncmpW(aURL, wszFtp, sizeof(wszFtp)/sizeof(WCHAR)) - && strncmpW(aURL, wszHttp, sizeof(wszHttp)/sizeof(WCHAR)) - && strncmpW(aURL, wszHttps, sizeof(wszHttps)/sizeof(WCHAR)); - }else { - This->use_wine_url = TRUE; - } - }else { - This->wine_url = NULL; - This->use_wine_url = FALSE; - } - - return NS_OK; -} - #undef NSURI_THIS
-static const nsIWineURIVtbl nsWineURIVtbl = { +static const nsIURLVtbl nsURLVtbl = { nsURI_QueryInterface, nsURI_AddRef, nsURI_Release, @@ -2196,51 +2147,39 @@ nsURL_GetFileExtension, nsURL_SetFileExtension, nsURL_GetCommonBaseSpec, - nsURL_GetRelativeSpec, - nsURI_GetNSContainer, - nsURI_SetNSContainer, - nsURI_GetWindow, - nsURI_SetWindow, - nsURI_GetChannelBSC, - nsURI_SetChannelBSC, - nsURI_GetIsDocumentURI, - nsURI_SetIsDocumentURI, - nsURI_GetWineURL, - nsURI_SetWineURL + nsURL_GetRelativeSpec };
-static nsresult create_uri(nsIURI *uri, HTMLWindow *window, NSContainer *container, nsIWineURI **_retval) -{ - nsURI *ret = heap_alloc_zero(sizeof(nsURI)); - - ret->lpWineURIVtbl = &nsWineURIVtbl; +static nsresult create_uri(nsIURI *uri, HTMLWindow *window, NSContainer *container, nsWineURI **_retval) +{ + nsWineURI *ret = heap_alloc_zero(sizeof(nsWineURI)); + + ret->lpIURLVtbl = &nsURLVtbl; ret->ref = 1; ret->uri = uri;
- nsIWineURI_SetNSContainer(NSWINEURI(ret), container); - nsIWineURI_SetWindow(NSWINEURI(ret), window); + set_uri_nscontainer(ret, container); + set_uri_window(ret, window);
if(uri) nsIURI_QueryInterface(uri, &IID_nsIURL, (void**)&ret->nsurl); - else - ret->nsurl = NULL;
TRACE("retval=%p\n", ret); - *_retval = NSWINEURI(ret); + *_retval = ret; return NS_OK; }
-HRESULT create_doc_uri(HTMLWindow *window, WCHAR *url, nsIWineURI **ret) -{ - nsIWineURI *uri; +HRESULT create_doc_uri(HTMLWindow *window, WCHAR *url, nsWineURI **ret) +{ + nsWineURI *uri; nsresult nsres;
nsres = create_uri(NULL, window, window->doc_obj->nscontainer, &uri); if(NS_FAILED(nsres)) return E_FAIL;
- nsIWineURI_SetWineURL(uri, url); - nsIWineURI_SetIsDocumentURI(uri, TRUE); + set_wine_url(uri, url); + uri->is_doc_uri = TRUE;
*ret = uri; return S_OK; @@ -2470,11 +2409,11 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *aSpec, const char *aOriginCharset, nsIURI *aBaseURI, nsIURI **_retval) { + nsWineURI *wine_uri, *base_wine_uri = NULL; const char *spec = NULL; HTMLWindow *window = NULL; nsIURI *uri = NULL; LPCWSTR base_wine_url = NULL; - nsIWineURI *base_wine_uri = NULL, *wine_uri; BOOL is_wine_uri = FALSE; nsresult nsres;
@@ -2494,16 +2433,19 @@ if(aBaseURI) { PARSEDURLA parsed_url = {sizeof(PARSEDURLA)};
- nsres = nsIURI_QueryInterface(aBaseURI, &IID_nsIWineURI, (void**)&base_wine_uri); + nsres = nsIURI_QueryInterface(aBaseURI, &IID_nsWineURI, (void**)&base_wine_uri); if(NS_SUCCEEDED(nsres)) { - nsIWineURI_GetWineURL(base_wine_uri, &base_wine_url); - nsIWineURI_GetWindow(base_wine_uri, &window); + base_wine_url = base_wine_uri->wine_url; + if(base_wine_uri->window_ref && base_wine_uri->window_ref->window) { + window = base_wine_uri->window_ref->window; + IHTMLWindow2_AddRef(HTMLWINDOW2(window)); + } TRACE("base url: %s window: %p\n", debugstr_w(base_wine_url), window); }else if(FAILED(ParseURLA(spec, &parsed_url))) { TRACE("not wraping\n"); return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); }else { - WARN("Could not get base nsIWineURI: %08x\n", nsres); + WARN("Could not get base nsWineURI: %08x\n", nsres); } }
@@ -2528,18 +2470,18 @@ URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, url, sizeof(url)/sizeof(WCHAR), &len, 0); if(SUCCEEDED(hres)) - nsIWineURI_SetWineURL(wine_uri, url); + set_wine_url(wine_uri, url); else WARN("CoCombineUrl failed: %08x\n", hres); }else if(is_wine_uri) { WCHAR url[INTERNET_MAX_URL_LENGTH];
MultiByteToWideChar(CP_ACP, 0, spec, -1, url, sizeof(url)/sizeof(WCHAR)); - nsIWineURI_SetWineURL(wine_uri, url); + set_wine_url(wine_uri, url); }
if(base_wine_uri) - nsIWineURI_Release(base_wine_uri); + nsIURI_Release(NSURI(base_wine_uri));
return nsres; } @@ -2556,15 +2498,14 @@ { PARSEDURLW parsed_url = {sizeof(PARSEDURLW)}; nsChannel *ret; - nsIWineURI *wine_uri; - const WCHAR *url; + nsWineURI *wine_uri; nsresult nsres;
TRACE("(%p %p)\n", aURI, _retval);
- nsres = nsIURI_QueryInterface(aURI, &IID_nsIWineURI, (void**)&wine_uri); + nsres = nsIURI_QueryInterface(aURI, &IID_nsWineURI, (void**)&wine_uri); if(NS_FAILED(nsres)) { - TRACE("Could not get nsIWineURI: %08x\n", nsres); + TRACE("Could not get nsWineURI: %08x\n", nsres); return nsIIOService_NewChannelFromURI(nsio, aURI, _retval); }
@@ -2578,9 +2519,8 @@
nsIURI_AddRef(aURI); ret->original_uri = aURI; - - nsIWineURI_GetWineURL(wine_uri, &url); - ret->url_scheme = url && SUCCEEDED(ParseURLW(url, &parsed_url)) ? parsed_url.nScheme : URL_SCHEME_UNKNOWN; + ret->url_scheme = wine_uri->wine_url && SUCCEEDED(ParseURLW(wine_uri->wine_url, &parsed_url)) + ? parsed_url.nScheme : URL_SCHEME_UNKNOWN;
*_retval = NSCHANNEL(ret); return NS_OK;
Modified: trunk/reactos/dll/win32/mshtml/oleobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/oleobj.c?r... ============================================================================== --- trunk/reactos/dll/win32/mshtml/oleobj.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/oleobj.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -34,8 +34,12 @@ #include "wine/debug.h"
#include "mshtml_private.h" +#include "initguid.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0); +#define DOCHOST_DOCCANNAVIGATE 0
/********************************************************** * IOleObject implementation @@ -92,6 +96,7 @@ HTMLDocument *This = OLEOBJ_THIS(iface); IDocHostUIHandler *pDocHostUIHandler = NULL; IOleCommandTarget *cmdtrg = NULL; + BOOL hostui_setup; VARIANT silent; HRESULT hres;
@@ -115,6 +120,8 @@
if(!pClientSite) return S_OK; + + hostui_setup = This->doc_obj->hostui_setup;
hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&pDocHostUIHandler); if(SUCCEEDED(hres)) { @@ -133,7 +140,7 @@ This->doc_obj->hostinfo = hostinfo; }
- if(!This->doc_obj->has_key_path) { + if(!hostui_setup) { hres = IDocHostUIHandler_GetOptionKeyPath(pDocHostUIHandler, &key_path, 0); if(hres == S_OK && key_path) { if(key_path[0]) { @@ -157,7 +164,7 @@ IDocHostUIHandler2_Release(pDocHostUIHandler2); }
- This->doc_obj->has_key_path = TRUE; + This->doc_obj->hostui_setup = TRUE; } }
@@ -178,6 +185,12 @@ if(SUCCEEDED(hres)) { VARIANT var; OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0}; + + if(!hostui_setup) { + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window); + IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL); + }
IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
Modified: trunk/reactos/dll/win32/mshtml/persist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/persist.c?... ============================================================================== --- trunk/reactos/dll/win32/mshtml/persist.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/persist.c [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -155,6 +155,9 @@ doc->download_state = 1; }
+ if(doc->view_sink) + IAdviseSink_OnViewChange(doc->view_sink, DVASPECT_CONTENT, -1); + if(doc->hostui) { IDropTarget *drop_target = NULL;
@@ -166,50 +169,15 @@ } }
-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) { nsChannelBSC *bscallback; - LPOLESTR url = NULL; docobj_task_t *task; download_proc_task_t *download_task; - nsIWineURI *nsuri; + nsWineURI *nsuri; + LPOLESTR url; HRESULT hres;
- if(pibc) { - IUnknown *unk = NULL; - - /* FIXME: - * Use params: - * "__PrecreatedObject" - * "BIND_CONTEXT_PARAM" - * "__HTMLLOADOPTIONS" - * "__DWNBINDINFO" - * "URL Context" - * "CBinding Context" - * "_ITransData_Object_" - * "_EnumFORMATETC_" - */ - - IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk); - if(unk) { - IOleClientSite *client = NULL; - - hres = IUnknown_QueryInterface(unk, &IID_IOleClientSite, (void**)&client); - if(SUCCEEDED(hres)) { - TRACE("Got client site %p\n", client); - IOleObject_SetClientSite(OLEOBJ(This), client); - IOleClientSite_Release(client); - } - - IUnknown_Release(unk); - } - } - - set_ready_state(This->window, READYSTATE_LOADING); - update_doc(This, UPDATE_TITLE); - - HTMLDocument_LockContainer(This->doc_obj, TRUE); - hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url); if(FAILED(hres)) { WARN("GetDiaplayName failed: %08x\n", hres); @@ -218,11 +186,8 @@
TRACE("got url: %s\n", debugstr_w(url));
- set_current_mon(This->window, mon); - if(This->doc_obj->client) { VARIANT silent, offline; - IOleCommandTarget *cmdtrg = NULL;
hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { @@ -240,15 +205,37 @@ else if(V_BOOL(&silent)) FIXME("offline == true\n"); } + } + + if(This->window->mon) { + update_doc(This, UPDATE_TITLE|UPDATE_UI); + }else { + update_doc(This, UPDATE_TITLE); + set_current_mon(This->window, mon); + } + + set_ready_state(This->window, READYSTATE_LOADING); + + if(This->doc_obj->client) { + IOleCommandTarget *cmdtrg = NULL;
hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { - VARIANT var; - - V_VT(&var) = VT_I4; - V_I4(&var) = 0; - IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL); + VARIANT var, out; + + if(!async_bsc) { + V_VT(&var) = VT_I4; + 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); } @@ -259,16 +246,24 @@ if(FAILED(hres)) return hres;
- bscallback = create_channelbsc(mon); - - nsIWineURI_SetChannelBSC(nsuri, bscallback); - hres = load_nsuri(This->window, nsuri, LOAD_INITIAL_DOCUMENT_URI); - nsIWineURI_SetChannelBSC(nsuri, NULL); + if(async_bsc) { + bscallback = async_bsc; + }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); + nsISupports_Release((nsISupports*)nsuri); /* FIXME */ if(SUCCEEDED(hres)) set_window_bscallback(This->window, bscallback); - IUnknown_Release((IUnknown*)bscallback); + if(bscallback != async_bsc) + IUnknown_Release((IUnknown*)bscallback); if(FAILED(hres)) return hres; + + HTMLDocument_LockContainer(This->doc_obj, TRUE);
if(This->doc_obj->frame) { task = heap_alloc(sizeof(docobj_task_t)); @@ -375,7 +370,36 @@
TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
- hres = set_moniker(This, pimkName, pibc, TRUE); + if(pibc) { + IUnknown *unk = NULL; + + /* FIXME: + * Use params: + * "__PrecreatedObject" + * "BIND_CONTEXT_PARAM" + * "__HTMLLOADOPTIONS" + * "__DWNBINDINFO" + * "URL Context" + * "_ITransData_Object_" + * "_EnumFORMATETC_" + */ + + IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk); + if(unk) { + IOleClientSite *client = NULL; + + hres = IUnknown_QueryInterface(unk, &IID_IOleClientSite, (void**)&client); + if(SUCCEEDED(hres)) { + TRACE("Got client site %p\n", client); + IOleObject_SetClientSite(OLEOBJ(This), client); + IOleClientSite_Release(client); + } + + IUnknown_Release(unk); + } + } + + hres = set_moniker(This, pimkName, pibc, NULL, TRUE); if(FAILED(hres)) return hres;
@@ -636,7 +660,7 @@ return hres; }
- hres = set_moniker(This, mon, NULL, TRUE); + hres = set_moniker(This, mon, NULL, NULL, TRUE); IMoniker_Release(mon); if(FAILED(hres)) return hres; @@ -682,44 +706,24 @@ { HTMLDocument *This = PERSTRINIT_THIS(iface); IMoniker *mon; - HGLOBAL body; - LPSTREAM stream; HRESULT hres;
static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; - static const WCHAR html_bodyW[] = {'<','H','T','M','L','>','<','/','H','T','M','L','>',0};
TRACE("(%p)\n", This); - - body = GlobalAlloc(0, sizeof(html_bodyW)); - if(!body) - return E_OUTOFMEMORY; - memcpy(body, html_bodyW, sizeof(html_bodyW));
hres = CreateURLMoniker(NULL, about_blankW, &mon); if(FAILED(hres)) { WARN("CreateURLMoniker failed: %08x\n", hres); - GlobalFree(body); return hres; }
- hres = set_moniker(This, mon, NULL, FALSE); + hres = set_moniker(This, mon, NULL, NULL, FALSE); IMoniker_Release(mon); - if(FAILED(hres)) { - GlobalFree(body); + if(FAILED(hres)) return hres; - } - - hres = CreateStreamOnHGlobal(body, TRUE, &stream); - if(FAILED(hres)) { - GlobalFree(body); - return hres; - } - - hres = channelbsc_load_stream(This->window->bscallback, stream); - - IStream_Release(stream); - return hres; + + return start_binding(This->window, NULL, (BSCallback*)This->window->bscallback, NULL); }
#undef PERSTRINIT_THIS
Modified: trunk/reactos/dll/win32/mshtml/rsrc.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/rsrc.rc?re... ============================================================================== --- trunk/reactos/dll/win32/mshtml/rsrc.rc [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mshtml/rsrc.rc [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -35,27 +35,30 @@
#include "Bg.rc" #include "Da.rc" -#include "De.rc" #include "En.rc" #include "Es.rc" #include "Fi.rc" +#include "Hu.rc" +#include "Ko.rc" +#include "Nl.rc" +#include "Pl.rc" +#include "Sv.rc" +#include "Tr.rc" + +/* UTF-8 */ +#include "De.rc" #include "Fr.rc" -#include "Hu.rc" #include "It.rc" #include "Ja.rc" -#include "Ko.rc" #include "Lt.rc" -#include "Nl.rc" #include "No.rc" -#include "Pl.rc" #include "Pt.rc" #include "Ro.rc" #include "Ru.rc" #include "Si.rc" -#include "Sv.rc" -#include "Tr.rc" #include "Uk.rc" #include "Zh.rc" +
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
Modified: trunk/reactos/include/psdk/mshtml.idl URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/mshtml.idl?rev... ============================================================================== --- trunk/reactos/include/psdk/mshtml.idl [iso-8859-1] (original) +++ trunk/reactos/include/psdk/mshtml.idl [iso-8859-1] Sat Mar 6 12:42:03 2010 @@ -15407,3 +15407,23 @@ }
} /* library MSHTML */ + +interface IOleCommandTarget; + +/***************************************************************************** + * IHTMLPrivateWindow interface + */ +[ + object, + uuid(3050f6dc-98b5-11cf-bb82-00aa00bdce0b), + local +] +interface IHTMLPrivateWindow : IUnknown +{ + HRESULT SuperNavigate(BSTR url, BSTR arg2, BSTR arg3, BSTR arg4, VARIANT *post_data, VARIANT *headers, ULONG flags); + HRESULT GetPendingUrl(BSTR *url); + HRESULT SetPICSTarget(IOleCommandTarget *cmdtrg); + HRESULT PICSComplete(int arg); + HRESULT FindWindowByName(LPCWSTR name, IHTMLWindow2 **ret); + HRESULT GetAddressBarUrl(BSTR *url); +}