static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); HTMLOuterWindow *window = NULL, *this_window = NULL; nsIInputStream *post_stream; nsAString action_uri_str, target_str; IUri *uri; nsresult nsres; HRESULT hres; TRACE("(%p)->()\n", This); if(This->element.node.doc) { HTMLDocumentNode *doc = This->element.node.doc; if(doc->window && doc->window->base.outer_window) this_window = doc->window->base.outer_window; } if(!this_window) { TRACE("No outer window\n"); return S_OK; } nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLFormElement_GetTarget(This->nsform, &target_str); if(NS_SUCCEEDED(nsres)) { BOOL 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"); } nsAString_Finish(&target_str); if(!window) return S_OK; /* * FIXME: We currently don't use our submit implementation for sub-windows because * load_nsuri can't support post data. We should fix it. */ if(!window->doc_obj || window->doc_obj->basedoc.window != window) { nsres = nsIDOMHTMLFormElement_Submit(This->nsform); IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); if(NS_FAILED(nsres)) { ERR("Submit failed: %08x\n", nsres); return E_FAIL; } return S_OK; } nsAString_Init(&action_uri_str, NULL); nsres = nsIDOMHTMLFormElement_GetFormData(This->nsform, NULL, &action_uri_str, &post_stream); if(NS_SUCCEEDED(nsres)) { const PRUnichar *action_uri; nsAString_GetData(&action_uri_str, &action_uri); hres = create_uri(action_uri, 0, &uri); }else { ERR("GetFormData failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&action_uri_str); if(SUCCEEDED(hres)) { window->readystate_locked++; hres = submit_form(window, uri, post_stream); window->readystate_locked--; IUri_Release(uri); } IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); if(post_stream) nsIInputStream_Release(post_stream); return hres; }
static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); HTMLOuterWindow *window = NULL, *this_window = NULL; nsAString action_uri_str, target_str, method_str; nsIInputStream *post_stream; BOOL is_post_submit = FALSE; IUri *uri; nsresult nsres; HRESULT hres; BOOL use_new_window = FALSE; TRACE("(%p)\n", This); if(This->element.node.doc) { HTMLDocumentNode *doc = This->element.node.doc; if(doc->window && doc->window->base.outer_window) this_window = doc->window->base.outer_window; } if(!this_window) { TRACE("No outer window\n"); return S_OK; } nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLFormElement_GetTarget(This->nsform, &target_str); if(NS_SUCCEEDED(nsres)) window = get_target_window(this_window, &target_str, &use_new_window); if(!window && !use_new_window) { nsAString_Finish(&target_str); return S_OK; } nsAString_Init(&method_str, NULL); nsres = nsIDOMHTMLFormElement_GetMethod(This->nsform, &method_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *method; static const PRUnichar postW[] = {'p','o','s','t',0}; nsAString_GetData(&method_str, &method); TRACE("method is %s\n", debugstr_w(method)); is_post_submit = !strcmpiW(method, postW); } nsAString_Finish(&method_str); /* * FIXME: We currently use our submit implementation for POST submit. We should always use it. */ if(window && !is_post_submit) { nsres = nsIDOMHTMLFormElement_Submit(This->nsform); nsAString_Finish(&target_str); IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); if(NS_FAILED(nsres)) { ERR("Submit failed: %08x\n", nsres); return E_FAIL; } return S_OK; } nsAString_Init(&action_uri_str, NULL); nsres = nsIDOMHTMLFormElement_GetFormData(This->nsform, NULL, &action_uri_str, &post_stream); if(NS_SUCCEEDED(nsres)) { const PRUnichar *action_uri; nsAString_GetData(&action_uri_str, &action_uri); hres = create_uri(action_uri, 0, &uri); }else { ERR("GetFormData failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&action_uri_str); if(SUCCEEDED(hres)) { const PRUnichar *target; nsAString_GetData(&target_str, &target); hres = submit_form(window, target, uri, post_stream); IUri_Release(uri); } nsAString_Finish(&target_str); if(window) IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); if(post_stream) nsIInputStream_Release(post_stream); return hres; }