mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
- Sync shdocvw with Wine 1.1.29
svn path=/trunk/; revision=42987
This commit is contained in:
parent
953707a174
commit
e6c21517ae
8 changed files with 280 additions and 120 deletions
|
@ -60,6 +60,9 @@ static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID ri
|
|||
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
|
||||
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
|
||||
*ppv = CLDISP(This);
|
||||
}else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
|
||||
TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppv);
|
||||
*ppv = PROPNOTIF(This);
|
||||
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
|
||||
TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
|
||||
*ppv = SERVPROV(This);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "shdocvw.h"
|
||||
#include "hlink.h"
|
||||
#include "exdispid.h"
|
||||
#include "mshtml.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
|
||||
|
||||
|
@ -46,7 +47,7 @@ LRESULT process_dochost_task(DocHost *This, LPARAM lparam)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void navigate_complete(DocHost *This)
|
||||
static void notif_complete(DocHost *This, DISPID dispid)
|
||||
{
|
||||
DISPPARAMS dispparams;
|
||||
VARIANTARG params[2];
|
||||
|
@ -66,14 +67,15 @@ static void navigate_complete(DocHost *This)
|
|||
V_VT(&url) = VT_BSTR;
|
||||
V_BSTR(&url) = SysAllocString(This->url);
|
||||
|
||||
call_sink(This->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dispparams);
|
||||
call_sink(This->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dispparams);
|
||||
TRACE("%d >>>\n", dispid);
|
||||
call_sink(This->cps.wbe2, dispid, &dispparams);
|
||||
TRACE("%d <<<\n", dispid);
|
||||
|
||||
SysFreeString(V_BSTR(&url));
|
||||
This->busy = VARIANT_FALSE;
|
||||
}
|
||||
|
||||
void object_available(DocHost *This)
|
||||
static void object_available(DocHost *This)
|
||||
{
|
||||
IHlinkTarget *hlink;
|
||||
HRESULT hres;
|
||||
|
@ -93,14 +95,152 @@ void object_available(DocHost *This)
|
|||
|
||||
hres = IHlinkTarget_Navigate(hlink, 0, NULL);
|
||||
IHlinkTarget_Release(hlink);
|
||||
if(FAILED(hres)) {
|
||||
if(FAILED(hres))
|
||||
FIXME("Navigate failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
static HRESULT get_doc_ready_state(DocHost *This, READYSTATE *ret)
|
||||
{
|
||||
DISPPARAMS dp = {NULL,NULL,0,0};
|
||||
IDispatch *disp;
|
||||
EXCEPINFO ei;
|
||||
VARIANT var;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,
|
||||
&dp, &var, &ei, NULL);
|
||||
IDispatch_Release(disp);
|
||||
if(FAILED(hres)) {
|
||||
WARN("Invoke(DISPID_READYSTATE failed: %08x\n", hres);
|
||||
return hres;
|
||||
}
|
||||
|
||||
navigate_complete(This);
|
||||
if(V_VT(&var) != VT_I4) {
|
||||
WARN("V_VT(var) = %d\n", V_VT(&var));
|
||||
VariantClear(&var);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
return;
|
||||
*ret = V_I4(&var);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void advise_prop_notif(DocHost *This, BOOL set)
|
||||
{
|
||||
IConnectionPointContainer *cp_container;
|
||||
IConnectionPoint *cp;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IUnknown_QueryInterface(This->document, &IID_IConnectionPointContainer, (void**)&cp_container);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
hres = IConnectionPointContainer_FindConnectionPoint(cp_container, &IID_IPropertyNotifySink, &cp);
|
||||
IConnectionPointContainer_Release(cp_container);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
if(set)
|
||||
hres = IConnectionPoint_Advise(cp, (IUnknown*)PROPNOTIF(This), &This->prop_notif_cookie);
|
||||
else
|
||||
hres = IConnectionPoint_Unadvise(cp, This->prop_notif_cookie);
|
||||
IConnectionPoint_Release(cp);
|
||||
|
||||
if(SUCCEEDED(hres))
|
||||
This->is_prop_notif = set;
|
||||
}
|
||||
|
||||
static void update_ready_state(DocHost *This, READYSTATE ready_state)
|
||||
{
|
||||
if(ready_state > READYSTATE_LOADING && This->ready_state <= READYSTATE_LOADING) {
|
||||
notif_complete(This, DISPID_NAVIGATECOMPLETE2);
|
||||
This->ready_state = ready_state;
|
||||
}
|
||||
|
||||
if(ready_state == READYSTATE_COMPLETE && This->ready_state < READYSTATE_COMPLETE) {
|
||||
This->ready_state = READYSTATE_COMPLETE;
|
||||
notif_complete(This, DISPID_DOCUMENTCOMPLETE);
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
task_header_t header;
|
||||
IUnknown *doc;
|
||||
READYSTATE ready_state;
|
||||
} ready_state_task_t;
|
||||
|
||||
static void ready_state_proc(DocHost *This, task_header_t *_task)
|
||||
{
|
||||
ready_state_task_t *task = (ready_state_task_t*)_task;
|
||||
|
||||
if(task->doc == This->document)
|
||||
update_ready_state(This, task->ready_state);
|
||||
|
||||
IUnknown_Release(task->doc);
|
||||
}
|
||||
|
||||
static void push_ready_state_task(DocHost *This, READYSTATE ready_state)
|
||||
{
|
||||
ready_state_task_t *task = heap_alloc(sizeof(ready_state_task_t));
|
||||
|
||||
IUnknown_AddRef(This->document);
|
||||
task->doc = This->document;
|
||||
task->ready_state = ready_state;
|
||||
|
||||
push_dochost_task(This, &task->header, ready_state_proc, FALSE);
|
||||
}
|
||||
|
||||
static void object_available_proc(DocHost *This, task_header_t *task)
|
||||
{
|
||||
object_available(This);
|
||||
}
|
||||
|
||||
HRESULT dochost_object_available(DocHost *This, IUnknown *doc)
|
||||
{
|
||||
READYSTATE ready_state;
|
||||
task_header_t *task;
|
||||
IOleObject *oleobj;
|
||||
HRESULT hres;
|
||||
|
||||
IUnknown_AddRef(doc);
|
||||
This->document = doc;
|
||||
|
||||
hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
|
||||
if(SUCCEEDED(hres)) {
|
||||
CLSID clsid;
|
||||
|
||||
hres = IOleObject_GetUserClassID(oleobj, &clsid);
|
||||
if(SUCCEEDED(hres))
|
||||
TRACE("Got clsid %s\n",
|
||||
IsEqualGUID(&clsid, &CLSID_HTMLDocument) ? "CLSID_HTMLDocument" : debugstr_guid(&clsid));
|
||||
|
||||
hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This));
|
||||
if(FAILED(hres))
|
||||
FIXME("SetClientSite failed: %08x\n", hres);
|
||||
|
||||
IOleObject_Release(oleobj);
|
||||
}else {
|
||||
FIXME("Could not get IOleObject iface: %08x\n", hres);
|
||||
}
|
||||
|
||||
/* FIXME: Call SetAdvise */
|
||||
|
||||
task = heap_alloc(sizeof(*task));
|
||||
push_dochost_task(This, task, object_available_proc, FALSE);
|
||||
|
||||
hres = get_doc_ready_state(This, &ready_state);
|
||||
if(SUCCEEDED(hres)) {
|
||||
if(ready_state == READYSTATE_COMPLETE)
|
||||
push_ready_state_task(This, READYSTATE_COMPLETE);
|
||||
else
|
||||
advise_prop_notif(This, TRUE);
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static LRESULT resize_document(DocHost *This, LONG width, LONG height)
|
||||
|
@ -174,6 +314,9 @@ void deactivate_document(DocHost *This)
|
|||
IHlinkTarget *hlink = NULL;
|
||||
HRESULT hres;
|
||||
|
||||
if(This->is_prop_notif)
|
||||
advise_prop_notif(This, FALSE);
|
||||
|
||||
if(This->view)
|
||||
IOleDocumentView_UIActivate(This->view, FALSE);
|
||||
|
||||
|
@ -502,10 +645,78 @@ static const IDocHostUIHandler2Vtbl DocHostUIHandler2Vtbl = {
|
|||
DocHostUIHandler_GetOverrideKeyPath
|
||||
};
|
||||
|
||||
#define PROPNOTIF_THIS(iface) DEFINE_THIS(DocHost, IPropertyNotifySink, iface)
|
||||
|
||||
static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
|
||||
REFIID riid, void **ppv)
|
||||
{
|
||||
DocHost *This = PROPNOTIF_THIS(iface);
|
||||
return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
|
||||
}
|
||||
|
||||
static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
|
||||
{
|
||||
DocHost *This = PROPNOTIF_THIS(iface);
|
||||
return IOleClientSite_AddRef(CLIENTSITE(This));
|
||||
}
|
||||
|
||||
static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
|
||||
{
|
||||
DocHost *This = PROPNOTIF_THIS(iface);
|
||||
return IOleClientSite_Release(CLIENTSITE(This));
|
||||
}
|
||||
|
||||
static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
|
||||
{
|
||||
DocHost *This = PROPNOTIF_THIS(iface);
|
||||
|
||||
TRACE("(%p)->(%d)\n", This, dispID);
|
||||
|
||||
switch(dispID) {
|
||||
case DISPID_READYSTATE: {
|
||||
READYSTATE ready_state;
|
||||
HRESULT hres;
|
||||
|
||||
hres = get_doc_ready_state(This, &ready_state);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(ready_state == READYSTATE_COMPLETE)
|
||||
advise_prop_notif(This, FALSE);
|
||||
|
||||
push_ready_state_task(This, ready_state);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
FIXME("unimplemented dispid %d\n", dispID);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
|
||||
{
|
||||
DocHost *This = PROPNOTIF_THIS(iface);
|
||||
FIXME("(%p)->(%d)\n", This, dispID);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
#undef PROPNOTIF_THIS
|
||||
|
||||
static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
|
||||
PropertyNotifySink_QueryInterface,
|
||||
PropertyNotifySink_AddRef,
|
||||
PropertyNotifySink_Release,
|
||||
PropertyNotifySink_OnChanged,
|
||||
PropertyNotifySink_OnRequestEdit
|
||||
};
|
||||
|
||||
void DocHost_Init(DocHost *This, IDispatch *disp)
|
||||
{
|
||||
This->lpDocHostUIHandlerVtbl = &DocHostUIHandler2Vtbl;
|
||||
This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
|
||||
This->lpIPropertyNotifySinkVtbl = &PropertyNotifySinkVtbl;
|
||||
|
||||
This->disp = disp;
|
||||
|
||||
|
@ -522,6 +733,9 @@ void DocHost_Init(DocHost *This, IDispatch *disp)
|
|||
This->silent = VARIANT_FALSE;
|
||||
This->offline = VARIANT_FALSE;
|
||||
|
||||
This->ready_state = READYSTATE_UNINITIALIZED;
|
||||
This->is_prop_notif = FALSE;
|
||||
|
||||
DocHost_ClientSite_Init(This);
|
||||
DocHost_Frame_Init(This);
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface,
|
|||
LPCOLESTR pszStatusText)
|
||||
{
|
||||
DocHost *This = INPLACEFRAME_THIS(iface);
|
||||
FIXME("(%p)->(%p)\n", This, debugstr_w(pszStatusText));
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_w(pszStatusText));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "wine/debug.h"
|
||||
|
||||
#include "shdocvw.h"
|
||||
#include "mshtml.h"
|
||||
#include "exdispid.h"
|
||||
#include "shellapi.h"
|
||||
#include "winreg.h"
|
||||
|
@ -220,7 +219,7 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface,
|
|||
FIXME("status code %u\n", ulStatusCode);
|
||||
}
|
||||
|
||||
return E_NOTIMPL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *iface,
|
||||
|
@ -270,49 +269,14 @@ static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *if
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static void object_available_proc(DocHost *This, task_header_t *task)
|
||||
{
|
||||
object_available(This);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface,
|
||||
REFIID riid, IUnknown *punk)
|
||||
{
|
||||
BindStatusCallback *This = BINDSC_THIS(iface);
|
||||
task_header_t *task;
|
||||
IOleObject *oleobj;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
|
||||
|
||||
IUnknown_AddRef(punk);
|
||||
This->doc_host->document = punk;
|
||||
|
||||
hres = IUnknown_QueryInterface(punk, &IID_IOleObject, (void**)&oleobj);
|
||||
if(SUCCEEDED(hres)) {
|
||||
CLSID clsid;
|
||||
|
||||
hres = IOleObject_GetUserClassID(oleobj, &clsid);
|
||||
if(SUCCEEDED(hres))
|
||||
TRACE("Got clsid %s\n",
|
||||
IsEqualGUID(&clsid, &CLSID_HTMLDocument) ? "CLSID_HTMLDocument" : debugstr_guid(&clsid));
|
||||
|
||||
hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This->doc_host));
|
||||
if(FAILED(hres))
|
||||
FIXME("SetClientSite failed: %08x\n", hres);
|
||||
|
||||
IOleObject_Release(oleobj);
|
||||
}else {
|
||||
FIXME("Could not get IOleObject iface: %08x\n", hres);
|
||||
}
|
||||
|
||||
/* FIXME: Call SetAdvise */
|
||||
/* FIXME: Call Invoke(DISPID_READYSTATE) */
|
||||
|
||||
task = heap_alloc(sizeof(*task));
|
||||
push_dochost_task(This->doc_host, task, object_available_proc, FALSE);
|
||||
|
||||
return S_OK;
|
||||
return dochost_object_available(This->doc_host, punk);
|
||||
}
|
||||
|
||||
#undef BSC_THIS
|
||||
|
@ -357,7 +321,7 @@ static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate *iface,
|
|||
{
|
||||
BindStatusCallback *This = HTTPNEG_THIS(iface);
|
||||
|
||||
FIXME("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders),
|
||||
TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders),
|
||||
dwReserved, pszAdditionalHeaders);
|
||||
|
||||
if(This->headers) {
|
||||
|
@ -374,9 +338,9 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate *iface,
|
|||
LPWSTR *pszAdditionalRequestHeaders)
|
||||
{
|
||||
BindStatusCallback *This = HTTPNEG_THIS(iface);
|
||||
FIXME("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
|
||||
TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
|
||||
debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
|
||||
return E_NOTIMPL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
#undef HTTPNEG_THIS
|
||||
|
@ -513,46 +477,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 +509,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 +528,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);
|
||||
|
@ -639,6 +549,8 @@ static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mo
|
|||
VARIANT_BOOL cancel = VARIANT_FALSE;
|
||||
HRESULT hres;
|
||||
|
||||
This->ready_state = READYSTATE_LOADING;
|
||||
|
||||
on_before_navigate2(This, bsc->url, bsc->post_data, bsc->post_data_len, bsc->headers, &cancel);
|
||||
if(cancel) {
|
||||
FIXME("Navigation canceled\n");
|
||||
|
|
|
@ -152,8 +152,16 @@ static HRESULT activate_inplace(WebBrowser *This, IOleClientSite *active_site)
|
|||
SWP_NOZORDER | SWP_SHOWWINDOW);
|
||||
|
||||
if(This->client) {
|
||||
IOleContainer *container;
|
||||
|
||||
IOleClientSite_ShowObject(This->client);
|
||||
IOleClientSite_GetContainer(This->client, &This->container);
|
||||
|
||||
hres = IOleClientSite_GetContainer(This->client, &container);
|
||||
if(SUCCEEDED(hres)) {
|
||||
if(This->container)
|
||||
IOleContainer_Release(This->container);
|
||||
This->container = container;
|
||||
}
|
||||
}
|
||||
|
||||
if(This->doc_host.frame)
|
||||
|
@ -615,7 +623,13 @@ static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *ifac
|
|||
{
|
||||
WebBrowser *This = INPLACEOBJ_THIS(iface);
|
||||
FIXME("(%p)\n", This);
|
||||
return E_NOTIMPL;
|
||||
|
||||
if(This->inplace) {
|
||||
IOleInPlaceSite_Release(This->inplace);
|
||||
This->inplace = NULL;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
|
||||
|
|
|
@ -78,6 +78,7 @@ struct DocHost {
|
|||
const IOleDocumentSiteVtbl *lpOleDocumentSiteVtbl;
|
||||
const IOleCommandTargetVtbl *lpOleCommandTargetVtbl;
|
||||
const IDispatchVtbl *lpDispatchVtbl;
|
||||
const IPropertyNotifySinkVtbl *lpIPropertyNotifySinkVtbl;
|
||||
const IServiceProviderVtbl *lpServiceProviderVtbl;
|
||||
|
||||
/* Interfaces of InPlaceFrame object */
|
||||
|
@ -101,6 +102,10 @@ struct DocHost {
|
|||
VARIANT_BOOL offline;
|
||||
VARIANT_BOOL busy;
|
||||
|
||||
READYSTATE ready_state;
|
||||
DWORD prop_notif_cookie;
|
||||
BOOL is_prop_notif;
|
||||
|
||||
ConnectionPointContainer cps;
|
||||
};
|
||||
|
||||
|
@ -184,6 +189,7 @@ struct InternetExplorer {
|
|||
#define DOCHOSTUI2(x) ((IDocHostUIHandler2*) &(x)->lpDocHostUIHandlerVtbl)
|
||||
#define DOCSITE(x) ((IOleDocumentSite*) &(x)->lpOleDocumentSiteVtbl)
|
||||
#define CLDISP(x) ((IDispatch*) &(x)->lpDispatchVtbl)
|
||||
#define PROPNOTIF(x) ((IPropertyNotifySink*) &(x)->lpIPropertyNotifySinkVtbl)
|
||||
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
|
||||
|
||||
#define INPLACEFRAME(x) ((IOleInPlaceFrame*) &(x)->lpOleInPlaceFrameVtbl)
|
||||
|
@ -211,7 +217,7 @@ HRESULT WebBrowserV2_Create(IUnknown*,REFIID,void**);
|
|||
|
||||
void create_doc_view_hwnd(DocHost*);
|
||||
void deactivate_document(DocHost*);
|
||||
void object_available(DocHost*);
|
||||
HRESULT dochost_object_available(DocHost*,IUnknown*);
|
||||
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
|
||||
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*);
|
||||
HRESULT go_home(DocHost*);
|
||||
|
|
|
@ -142,6 +142,7 @@ HKLM,"Software\Microsoft\Windows\CurrentVersion\URL\Prefixes","www",,"http://"
|
|||
[Settings.Reg]
|
||||
HKCU,"Software\Microsoft\Internet Explorer\Main","Start Page",2,"http://www.winehq.org"
|
||||
HKCU,"Software\Microsoft\Internet Explorer\Main","Search Page",2,"http://www.google.com"
|
||||
HKCU,"Software\Microsoft\Internet Explorer\Settings","Text Color",2,"0,0,0"
|
||||
HKLM,"Software\Microsoft\Internet Explorer\Main","Default_Page_URL",2,"http://www.winehq.org"
|
||||
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe",,,"%16422%\Internet Explorer\iexplore.exe"
|
||||
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe","Path",,"%16422%\Internet Explorer;"
|
||||
|
|
|
@ -724,6 +724,7 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
|
|||
VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
LPCWSTR url;
|
||||
|
||||
TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
|
||||
|
||||
|
@ -733,12 +734,20 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
|
|||
if(!URL)
|
||||
return S_OK;
|
||||
|
||||
if(V_VT(URL) != VT_BSTR) {
|
||||
switch (V_VT(URL))
|
||||
{
|
||||
case VT_BSTR:
|
||||
url = V_BSTR(URL);
|
||||
break;
|
||||
case VT_BSTR|VT_BYREF:
|
||||
url = *V_BSTRREF(URL);
|
||||
break;
|
||||
default:
|
||||
FIXME("Unsupported V_VT(URL) %d\n", V_VT(URL));
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
return navigate_url(&This->doc_host, V_BSTR(URL), Flags, TargetFrameName, PostData, Headers);
|
||||
return navigate_url(&This->doc_host, url, Flags, TargetFrameName, PostData, Headers);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
|
||||
|
@ -767,9 +776,10 @@ static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pv
|
|||
static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%p)\n", This, lpReadyState);
|
||||
|
||||
*lpReadyState = READYSTATE_COMPLETE;
|
||||
TRACE("(%p)->(%p)\n", This, lpReadyState);
|
||||
|
||||
*lpReadyState = This->doc_host.ready_state;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue