static HRESULT WINAPI HTMLFormElement_QueryInterface(IHTMLFormElement *iface, REFIID riid, void **ppv) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); }
static HRESULT WINAPI HTMLFormElement_GetTypeInfo(IHTMLFormElement *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); }
static HRESULT WINAPI HTMLFormElement_put_encoding(IHTMLFormElement *iface, BSTR v) { static const WCHAR urlencodedW[] = {'a','p','p','l','i','c','a','t','i','o','n','/', 'x','-','w','w','w','-','f','o','r','m','-','u','r','l','e','n','c','o','d','e','d',0}; static const WCHAR dataW[] = {'m','u','l','t','i','p','a','r','t','/', 'f','o','r','m','-','d','a','t','a',0}; static const WCHAR plainW[] = {'t','e','x','t','/','p','l','a','i','n',0}; HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString encoding_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v)); if(lstrcmpiW(v, urlencodedW) && lstrcmpiW(v, dataW) && lstrcmpiW(v, plainW)) { WARN("incorrect enctype\n"); return E_INVALIDARG; } nsAString_InitDepend(&encoding_str, v); nsres = nsIDOMHTMLFormElement_SetEnctype(This->nsform, &encoding_str); nsAString_Finish(&encoding_str); if(NS_FAILED(nsres)) return E_FAIL; return S_OK; }
static HRESULT WINAPI HTMLFormElement_tags(IHTMLFormElement *iface, VARIANT tagName, IDispatch **pdisp) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(v %p)\n", This, pdisp); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_put_onsubmit(IHTMLFormElement *iface, VARIANT v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); return set_node_event(&This->element.node, EVENTID_SUBMIT, &v); }
static HRESULT WINAPI HTMLFormElement_Invoke(IHTMLFormElement *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); }
static HRESULT WINAPI HTMLFormElement_GetIDsOfNames(IHTMLFormElement *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); }
static HRESULT WINAPI HTMLFormElement_get_onsubmit(IHTMLFormElement *iface, VARIANT *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); TRACE("(%p)->(%p)\n", This, p); return get_node_event(&This->element.node, EVENTID_SUBMIT, p); }
static HRESULT WINAPI HTMLFormElement_get_elements(IHTMLFormElement *iface, IDispatch **p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); TRACE("(%p)->(%p)\n", This, p); *p = (IDispatch*)&This->IHTMLFormElement_iface; IDispatch_AddRef(*p); return S_OK; }
static HRESULT WINAPI HTMLFormElement_get_name(IHTMLFormElement *iface, BSTR *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString name_str; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&name_str, NULL); nsres = nsIDOMHTMLFormElement_GetName(This->nsform, &name_str); return return_nsstr(nsres, &name_str, p); }
static HRESULT WINAPI HTMLFormElement_reset(IHTMLFormElement *iface) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsresult nsres; TRACE("(%p)->()\n", This); nsres = nsIDOMHTMLFormElement_Reset(This->nsform); if (NS_FAILED(nsres)) { ERR("Reset failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLFormElement_get_length(IHTMLFormElement *iface, LONG *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsres = nsIDOMHTMLFormElement_GetLength(This->nsform, p); if(NS_FAILED(nsres)) { ERR("GetLength failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLFormElement_put_name(IHTMLFormElement *iface, BSTR v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString name_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v)); nsAString_InitDepend(&name_str, v); nsres = nsIDOMHTMLFormElement_SetName(This->nsform, &name_str); nsAString_Finish(&name_str); if(NS_FAILED(nsres)) return E_FAIL; return S_OK; }
static HRESULT WINAPI HTMLFormElement_put_action(IHTMLFormElement *iface, BSTR v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString action_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v)); nsAString_InitDepend(&action_str, v); nsres = nsIDOMHTMLFormElement_SetAction(This->nsform, &action_str); nsAString_Finish(&action_str); if(NS_FAILED(nsres)) { ERR("SetAction failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name, VARIANT index, IDispatch **pdisp) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp); if(!pdisp) return E_INVALIDARG; *pdisp = NULL; if(V_VT(&name) == VT_I4) { if(V_I4(&name) < 0) return E_INVALIDARG; return htmlform_item(This, V_I4(&name), pdisp); } FIXME("Unsupported args\n"); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_get_action(IHTMLFormElement *iface, BSTR *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString action_str; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&action_str, NULL); nsres = nsIDOMHTMLFormElement_GetAction(This->nsform, &action_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *action; nsAString_GetData(&action_str, &action); hres = nsuri_to_url(action, FALSE, p); }else { ERR("GetAction failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&action_str); return hres; }
static HRESULT WINAPI HTMLFormElement_put_method(IHTMLFormElement *iface, BSTR v) { static const WCHAR postW[] = {'P','O','S','T',0}; static const WCHAR getW[] = {'G','E','T',0}; HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString method_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v)); if(lstrcmpiW(v, postW) && lstrcmpiW(v, getW)) { WARN("unrecognized method\n"); return E_INVALIDARG; } nsAString_InitDepend(&method_str, v); nsres = nsIDOMHTMLFormElement_SetMethod(This->nsform, &method_str); nsAString_Finish(&method_str); if(NS_FAILED(nsres)) return E_FAIL; return S_OK; }
static HRESULT WINAPI HTMLFormElement__newEnum(IHTMLFormElement *iface, IUnknown **p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_put_length(IHTMLFormElement *iface, LONG v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%d)\n", This, v); return E_NOTIMPL; }
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_get_onreset(IHTMLFormElement *iface, VARIANT *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_put_onreset(IHTMLFormElement *iface, VARIANT v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_GetTypeInfoCount(IHTMLFormElement *iface, UINT *pctinfo) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo); }
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; }
static HRESULT WINAPI HTMLFormElement_put_dir(IHTMLFormElement *iface, BSTR v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); return E_NOTIMPL; }
static HRESULT WINAPI HTMLFormElement_get_dir(IHTMLFormElement *iface, BSTR *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static ULONG WINAPI HTMLFormElement_Release(IHTMLFormElement *iface) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); }
static HRESULT WINAPI HTMLFormElement_reset(IHTMLFormElement *iface) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); FIXME("(%p)->()\n", This); return E_NOTIMPL; }