mshtml: Support new window targets for FORM elements.
This commit is contained in:
parent
4b33a339cc
commit
8df2774124
|
@ -138,9 +138,9 @@ HRESULT set_moniker(HTMLOuterWindow*,IMoniker*,IUri*,IBindCtx*,nsChannelBSC*,BOO
|
||||||
void prepare_for_binding(HTMLDocument*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
|
void prepare_for_binding(HTMLDocument*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
|
||||||
HRESULT super_navigate(HTMLOuterWindow*,IUri*,DWORD,const WCHAR*,BYTE*,DWORD) DECLSPEC_HIDDEN;
|
HRESULT super_navigate(HTMLOuterWindow*,IUri*,DWORD,const WCHAR*,BYTE*,DWORD) DECLSPEC_HIDDEN;
|
||||||
HRESULT load_uri(HTMLOuterWindow*,IUri*,DWORD) DECLSPEC_HIDDEN;
|
HRESULT load_uri(HTMLOuterWindow*,IUri*,DWORD) DECLSPEC_HIDDEN;
|
||||||
HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,IHTMLWindow2**) DECLSPEC_HIDDEN;
|
HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,request_data_t*,IHTMLWindow2**) DECLSPEC_HIDDEN;
|
||||||
HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,IUri*,DWORD) DECLSPEC_HIDDEN;
|
HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,IUri*,DWORD) DECLSPEC_HIDDEN;
|
||||||
HRESULT submit_form(HTMLOuterWindow*,IUri*,nsIInputStream*) DECLSPEC_HIDDEN;
|
HRESULT submit_form(HTMLOuterWindow*,const WCHAR*,IUri*,nsIInputStream*) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void init_bscallback(BSCallback*,const BSCallbackVtbl*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
|
void init_bscallback(BSCallback*,const BSCallbackVtbl*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
|
||||||
HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,BOOL,nsChannelBSC**) DECLSPEC_HIDDEN;
|
HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,BOOL,nsChannelBSC**) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -85,7 +85,7 @@ static HRESULT WINAPI HlinkTarget_Navigate(IHlinkTarget *iface, DWORD grfHLNF, L
|
||||||
FIXME("JumpLocation not supported\n");
|
FIXME("JumpLocation not supported\n");
|
||||||
|
|
||||||
if(!This->doc_obj->client)
|
if(!This->doc_obj->client)
|
||||||
return navigate_new_window(This->window, This->window->uri, NULL, NULL);
|
return navigate_new_window(This->window, This->window->uri, NULL, NULL, NULL);
|
||||||
|
|
||||||
return IOleObject_DoVerb(&This->IOleObject_iface, OLEIVERB_SHOW, NULL, NULL, -1, NULL, NULL);
|
return IOleObject_DoVerb(&This->IOleObject_iface, OLEIVERB_SHOW, NULL, NULL, -1, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ static HRESULT navigate_anchor_window(HTMLAnchorElement *This, const WCHAR *targ
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL);
|
hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL, NULL);
|
||||||
IUri_Release(uri);
|
IUri_Release(uri);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
|
@ -389,6 +389,7 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
|
||||||
IUri *uri;
|
IUri *uri;
|
||||||
nsresult nsres;
|
nsresult nsres;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
BOOL use_new_window;
|
||||||
|
|
||||||
TRACE("(%p)->()\n", This);
|
TRACE("(%p)->()\n", This);
|
||||||
|
|
||||||
|
@ -404,22 +405,21 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
|
||||||
|
|
||||||
nsAString_Init(&target_str, NULL);
|
nsAString_Init(&target_str, NULL);
|
||||||
nsres = nsIDOMHTMLFormElement_GetTarget(This->nsform, &target_str);
|
nsres = nsIDOMHTMLFormElement_GetTarget(This->nsform, &target_str);
|
||||||
if(NS_SUCCEEDED(nsres)) {
|
if(NS_SUCCEEDED(nsres))
|
||||||
BOOL use_new_window;
|
|
||||||
window = get_target_window(this_window, &target_str, &use_new_window);
|
window = get_target_window(this_window, &target_str, &use_new_window);
|
||||||
if(use_new_window)
|
|
||||||
FIXME("submit to new window is not supported\n");
|
if(!window && !use_new_window) {
|
||||||
}
|
|
||||||
nsAString_Finish(&target_str);
|
nsAString_Finish(&target_str);
|
||||||
if(!window)
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: We currently don't use our submit implementation for sub-windows because
|
* FIXME: We currently don't use our submit implementation for sub-windows because
|
||||||
* load_nsuri can't support post data. We should fix it.
|
* load_nsuri can't support post data. We should fix it.
|
||||||
*/
|
*/
|
||||||
if(!window->doc_obj || window->doc_obj->basedoc.window != window) {
|
if(window && (!window->doc_obj || window->doc_obj->basedoc.window != window)) {
|
||||||
nsres = nsIDOMHTMLFormElement_Submit(This->nsform);
|
nsres = nsIDOMHTMLFormElement_Submit(This->nsform);
|
||||||
|
nsAString_Finish(&target_str);
|
||||||
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
|
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
|
||||||
if(NS_FAILED(nsres)) {
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("Submit failed: %08x\n", nsres);
|
ERR("Submit failed: %08x\n", nsres);
|
||||||
|
@ -442,12 +442,15 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
|
||||||
}
|
}
|
||||||
nsAString_Finish(&action_uri_str);
|
nsAString_Finish(&action_uri_str);
|
||||||
if(SUCCEEDED(hres)) {
|
if(SUCCEEDED(hres)) {
|
||||||
window->readystate_locked++;
|
const PRUnichar *target;
|
||||||
hres = submit_form(window, uri, post_stream);
|
|
||||||
window->readystate_locked--;
|
nsAString_GetData(&target_str, &target);
|
||||||
|
hres = submit_form(window, target, uri, post_stream);
|
||||||
IUri_Release(uri);
|
IUri_Release(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsAString_Finish(&target_str);
|
||||||
|
if(window)
|
||||||
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
|
IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
|
||||||
if(post_stream)
|
if(post_stream)
|
||||||
nsIInputStream_Release(post_stream);
|
nsIInputStream_Release(post_stream);
|
||||||
|
|
|
@ -967,7 +967,7 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
hres = navigate_new_window(window, uri, name, pomWindowResult);
|
hres = navigate_new_window(window, uri, name, NULL, pomWindowResult);
|
||||||
IUri_Release(uri);
|
IUri_Release(uri);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2107,7 +2107,7 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *name, IHTMLWindow2 **ret)
|
HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *name, request_data_t *request_data, IHTMLWindow2 **ret)
|
||||||
{
|
{
|
||||||
IWebBrowser2 *web_browser;
|
IWebBrowser2 *web_browser;
|
||||||
IHTMLWindow2 *new_window;
|
IHTMLWindow2 *new_window;
|
||||||
|
@ -2115,6 +2115,11 @@ HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *nam
|
||||||
nsChannelBSC *bsc;
|
nsChannelBSC *bsc;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
|
if(request_data)
|
||||||
|
hres = create_channelbsc(NULL, request_data->headers,
|
||||||
|
request_data->post_data, request_data->post_data_len, FALSE,
|
||||||
|
&bsc);
|
||||||
|
else
|
||||||
hres = create_channelbsc(NULL, NULL, NULL, 0, FALSE, &bsc);
|
hres = create_channelbsc(NULL, NULL, NULL, 0, FALSE, &bsc);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
@ -2322,23 +2327,32 @@ static HRESULT translate_uri(HTMLOuterWindow *window, IUri *orig_uri, BSTR *ret_
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT submit_form(HTMLOuterWindow *window, IUri *submit_uri, nsIInputStream *post_stream)
|
HRESULT submit_form(HTMLOuterWindow *window, const WCHAR *target, IUri *submit_uri, nsIInputStream *post_stream)
|
||||||
{
|
{
|
||||||
request_data_t request_data = {NULL};
|
request_data_t request_data = {NULL};
|
||||||
BSTR display_uri;
|
|
||||||
IUri *uri;
|
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
hres = read_post_data_stream(post_stream, TRUE, NULL, &request_data);
|
hres = read_post_data_stream(post_stream, TRUE, NULL, &request_data);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
|
if(window) {
|
||||||
|
IUri *uri;
|
||||||
|
BSTR display_uri;
|
||||||
|
|
||||||
|
window->readystate_locked++;
|
||||||
|
|
||||||
hres = translate_uri(window, submit_uri, &display_uri, &uri);
|
hres = translate_uri(window, submit_uri, &display_uri, &uri);
|
||||||
if(SUCCEEDED(hres)) {
|
if(SUCCEEDED(hres)) {
|
||||||
hres = navigate_uri(window, uri, display_uri, &request_data, BINDING_NAVIGATED|BINDING_SUBMIT);
|
hres = navigate_uri(window, uri, display_uri, &request_data, BINDING_NAVIGATED|BINDING_SUBMIT);
|
||||||
IUri_Release(uri);
|
IUri_Release(uri);
|
||||||
SysFreeString(display_uri);
|
SysFreeString(display_uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window->readystate_locked--;
|
||||||
|
}else
|
||||||
|
hres = navigate_new_window(window, submit_uri, target, &request_data, NULL);
|
||||||
|
|
||||||
release_request_data(&request_data);
|
release_request_data(&request_data);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue