ieframe: Added very beginning IWebBrowser2::GoBack implementation.
This commit is contained in:
parent
5e84789578
commit
51c141ab4c
|
@ -30,6 +30,9 @@ DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
|
||||||
|
|
||||||
#define DOCHOST_DOCCANNAVIGATE 0
|
#define DOCHOST_DOCCANNAVIGATE 0
|
||||||
|
|
||||||
|
/* Undocumented notification, see mshtml tests */
|
||||||
|
#define CMDID_EXPLORER_UPDATEHISTORY 38
|
||||||
|
|
||||||
static ATOM doc_view_atom = 0;
|
static ATOM doc_view_atom = 0;
|
||||||
|
|
||||||
void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, task_destr_t destr, BOOL send)
|
void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, task_destr_t destr, BOOL send)
|
||||||
|
@ -324,6 +327,39 @@ static LRESULT WINAPI doc_view_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l
|
||||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_travellog(DocHost *This)
|
||||||
|
{
|
||||||
|
travellog_entry_t *new_entry;
|
||||||
|
|
||||||
|
if(!This->travellog) {
|
||||||
|
This->travellog = heap_alloc(4 * sizeof(*This->travellog));
|
||||||
|
if(!This->travellog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
This->travellog_size = 4;
|
||||||
|
}else if(This->travellog_size < This->travellog_position+1) {
|
||||||
|
travellog_entry_t *new_travellog;
|
||||||
|
|
||||||
|
new_travellog = heap_realloc(This->travellog, This->travellog_size*2);
|
||||||
|
if(!new_travellog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
This->travellog = new_travellog;
|
||||||
|
This->travellog_size *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(This->travellog_length > This->travellog_position)
|
||||||
|
heap_free(This->travellog[--This->travellog_length].url);
|
||||||
|
|
||||||
|
new_entry = This->travellog + This->travellog_position;
|
||||||
|
|
||||||
|
new_entry->url = heap_strdupW(This->url);
|
||||||
|
if(!new_entry->url)
|
||||||
|
return;
|
||||||
|
|
||||||
|
This->travellog_position++;
|
||||||
|
}
|
||||||
|
|
||||||
void create_doc_view_hwnd(DocHost *This)
|
void create_doc_view_hwnd(DocHost *This)
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
@ -550,12 +586,20 @@ static HRESULT WINAPI ClOleCommandTarget_Exec(IOleCommandTarget *iface,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(IsEqualGUID(pguidCmdGroup, &CGID_Explorer)) {
|
||||||
|
switch(nCmdID) {
|
||||||
|
case CMDID_EXPLORER_UPDATEHISTORY:
|
||||||
|
update_travellog(This);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("Unimplemented cmd %d of CGID_Explorer\n", nCmdID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FIXME("Unimplemented group %s\n", debugstr_guid(pguidCmdGroup));
|
FIXME("Unimplemented group %s\n", debugstr_guid(pguidCmdGroup));
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef impl_from_IOleCommandTarget
|
|
||||||
|
|
||||||
static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
|
static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
|
||||||
ClOleCommandTarget_QueryInterface,
|
ClOleCommandTarget_QueryInterface,
|
||||||
ClOleCommandTarget_AddRef,
|
ClOleCommandTarget_AddRef,
|
||||||
|
@ -899,5 +943,9 @@ void DocHost_Release(DocHost *This)
|
||||||
|
|
||||||
ConnectionPointContainer_Destroy(&This->cps);
|
ConnectionPointContainer_Destroy(&This->cps);
|
||||||
|
|
||||||
|
while(This->travellog_length)
|
||||||
|
heap_free(This->travellog[--This->travellog_length].url);
|
||||||
|
heap_free(This->travellog);
|
||||||
|
|
||||||
heap_free(This->url);
|
heap_free(This->url);
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,6 +94,10 @@ typedef struct {
|
||||||
DocHost *doc_host;
|
DocHost *doc_host;
|
||||||
} NewWindowManager;
|
} NewWindowManager;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
WCHAR *url;
|
||||||
|
} travellog_entry_t;
|
||||||
|
|
||||||
typedef struct _IDocHostContainerVtbl
|
typedef struct _IDocHostContainerVtbl
|
||||||
{
|
{
|
||||||
ULONG (*addref)(DocHost*);
|
ULONG (*addref)(DocHost*);
|
||||||
|
@ -148,6 +152,11 @@ struct DocHost {
|
||||||
|
|
||||||
ShellBrowser *browser_service;
|
ShellBrowser *browser_service;
|
||||||
|
|
||||||
|
travellog_entry_t *travellog;
|
||||||
|
unsigned travellog_size;
|
||||||
|
unsigned travellog_length;
|
||||||
|
unsigned travellog_position;
|
||||||
|
|
||||||
ConnectionPointContainer cps;
|
ConnectionPointContainer cps;
|
||||||
IEHTMLWindow html_window;
|
IEHTMLWindow html_window;
|
||||||
NewWindowManager nwm;
|
NewWindowManager nwm;
|
||||||
|
@ -253,6 +262,7 @@ void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN
|
||||||
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*) DECLSPEC_HIDDEN;
|
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*) DECLSPEC_HIDDEN;
|
||||||
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*) DECLSPEC_HIDDEN;
|
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*) DECLSPEC_HIDDEN;
|
||||||
HRESULT go_home(DocHost*) DECLSPEC_HIDDEN;
|
HRESULT go_home(DocHost*) DECLSPEC_HIDDEN;
|
||||||
|
HRESULT go_back(DocHost*) DECLSPEC_HIDDEN;
|
||||||
HRESULT get_location_url(DocHost*,BSTR*) DECLSPEC_HIDDEN;
|
HRESULT get_location_url(DocHost*,BSTR*) DECLSPEC_HIDDEN;
|
||||||
HRESULT set_dochost_url(DocHost*,const WCHAR*) DECLSPEC_HIDDEN;
|
HRESULT set_dochost_url(DocHost*,const WCHAR*) DECLSPEC_HIDDEN;
|
||||||
void handle_navigation_error(DocHost*,HRESULT,BSTR,IHTMLWindow2*) DECLSPEC_HIDDEN;
|
void handle_navigation_error(DocHost*,HRESULT,BSTR,IHTMLWindow2*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -994,6 +994,29 @@ HRESULT go_home(DocHost *This)
|
||||||
return navigate_url(This, wszPageName, NULL, NULL, NULL, NULL);
|
return navigate_url(This, wszPageName, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT go_back(DocHost *This)
|
||||||
|
{
|
||||||
|
WCHAR *url;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
if(!This->travellog_position) {
|
||||||
|
WARN("No history available\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
url = This->travellog[--This->travellog_position].url;
|
||||||
|
|
||||||
|
if(This->doc_navigate) {
|
||||||
|
hres = async_doc_navigate(This, url, NULL, NULL, 0, FALSE);
|
||||||
|
}else {
|
||||||
|
FIXME("unsupported doc_navigate FALSE\n");
|
||||||
|
hres = E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
heap_free(url);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT get_location_url(DocHost *This, BSTR *ret)
|
HRESULT get_location_url(DocHost *This, BSTR *ret)
|
||||||
{
|
{
|
||||||
FIXME("semi-stub\n");
|
FIXME("semi-stub\n");
|
||||||
|
|
|
@ -251,8 +251,8 @@ static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember
|
||||||
static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
|
static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
|
||||||
{
|
{
|
||||||
WebBrowser *This = impl_from_IWebBrowser2(iface);
|
WebBrowser *This = impl_from_IWebBrowser2(iface);
|
||||||
FIXME("(%p)\n", This);
|
TRACE("(%p)\n", This);
|
||||||
return E_NOTIMPL;
|
return go_back(&This->doc_host);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
|
static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
|
||||||
|
|
Loading…
Reference in New Issue