Zhenbo Li : mshtml: Add IHTMLSelectElement::form property implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 17 09:01:11 CDT 2015
Module: wine
Branch: master
Commit: a15751ab7371efc5c27e208916ff5402df5c17a0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a15751ab7371efc5c27e208916ff5402df5c17a0
Author: Zhenbo Li <litimetal at gmail.com>
Date: Sat Aug 8 11:14:47 2015 +0800
mshtml: Add IHTMLSelectElement::form property implementation.
---
dlls/mshtml/htmlselect.c | 39 +++++++++++++++++++++++++++++++++++++--
dlls/mshtml/tests/dom.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 899c8e5..3c869ff 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -371,8 +371,43 @@ static HRESULT WINAPI HTMLSelectElement_get_disabled(IHTMLSelectElement *iface,
static HRESULT WINAPI HTMLSelectElement_get_form(IHTMLSelectElement *iface, IHTMLFormElement **p)
{
HTMLSelectElement *This = impl_from_IHTMLSelectElement(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsIDOMHTMLFormElement *nsform;
+ nsIDOMNode *form_node;
+ HTMLDOMNode *node;
+ HRESULT hres;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(!p)
+ return E_POINTER;
+
+ nsres = nsIDOMHTMLSelectElement_GetForm(This->nsselect, &nsform);
+ FIXME("get form %08x : %p\n", nsres, nsform);
+ if (NS_FAILED(nsres)) {
+ ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform);
+ *p = NULL;
+ return E_FAIL;
+ }
+ if (nsform == NULL) {
+ TRACE("nsform not found\n");
+ *p = NULL;
+ return S_OK;
+ }
+
+ nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&form_node);
+ nsIDOMHTMLFormElement_Release(nsform);
+ assert(nsres == NS_OK);
+
+ hres = get_node(This->element.node.doc, form_node, TRUE, &node);
+ nsIDOMNode_Release(form_node);
+ if (FAILED(hres))
+ return hres;
+
+ hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p);
+
+ node_release(node);
+ return hres;
}
static HRESULT WINAPI HTMLSelectElement_add(IHTMLSelectElement *iface, IHTMLElement *element,
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index fff65d8..3f68d87 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -4313,6 +4313,40 @@ static void test_form_target(IUnknown *unk)
IHTMLFormElement_Release(form);
}
+static void test_select_form(IUnknown *uselect, IUnknown *uform)
+{
+ IHTMLSelectElement *select = get_select_iface(uselect);
+ IHTMLFormElement *form;
+ HRESULT hres;
+
+ hres = IHTMLSelectElement_get_form(select, NULL);
+ ok(hres == E_POINTER, "got %08x\n, expected E_POINTER\n", hres);
+
+ hres = IHTMLSelectElement_get_form(select, &form);
+ ok(hres == S_OK, "get_form failed: %08x\n", hres);
+ ok(form != NULL, "form == NULL\n");
+
+ test_form_length((IUnknown*)form, 1);
+ test_form_elements((IUnknown*)form);
+ test_form_name((IUnknown*)form, "form_name");
+
+ ok(iface_cmp(uform, (IUnknown*)form), "Expected %p, got %p\n", uform, form);
+
+ IHTMLSelectElement_Release(select);
+ IHTMLFormElement_Release(form);
+}
+
+static void test_select_form_notfound(IHTMLSelectElement *select)
+{
+ IHTMLFormElement *form;
+ HRESULT hres;
+
+ form = (IHTMLFormElement*)0xdeadbeef;
+ hres = IHTMLSelectElement_get_form(select, &form);
+ ok(hres == S_OK, "get_form failed: %08x\n", hres);
+ ok(form == NULL, "got %p\n", form);
+}
+
#define test_meta_name(a,b) _test_meta_name(__LINE__,a,b)
static void _test_meta_name(unsigned line, IUnknown *unk, const char *exname)
{
@@ -4948,6 +4982,7 @@ static void test_select_elem(IHTMLSelectElement *select)
test_select_name(select, NULL);
test_select_set_name(select, "select-name");
test_select_name(select, "select-name");
+ test_select_form_notfound(select);
test_select_get_disabled(select, VARIANT_FALSE);
test_select_set_disabled(select, VARIANT_TRUE);
@@ -8491,6 +8526,16 @@ static void test_elems2(IHTMLDocument2 *doc)
IHTMLElement_Release(elem);
}
+ test_elem_set_innerhtml((IUnknown*)div,
+ "<form id=\"form\" name=\"form_name\"><select id=\"sform\"></select></form>");
+ elem = get_elem_by_id(doc, "sform", TRUE);
+ elem2 = get_elem_by_id(doc, "form", TRUE);
+ if(elem && elem2) {
+ test_select_form((IUnknown*)elem, (IUnknown*)elem2);
+ IHTMLElement_Release(elem);
+ IHTMLElement_Release(elem2);
+ }
+
test_attr(div);
test_blocked(doc, div);
test_elem_names(doc);
More information about the wine-cvs
mailing list