Zhenbo Li : mshtml: Added IHTMLInputElement_get_form method implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 18 16:08:49 CDT 2014


Module: wine
Branch: master
Commit: d5d728706bb8fbfa3add7058bb8270a9ca362954
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d5d728706bb8fbfa3add7058bb8270a9ca362954

Author: Zhenbo Li <litimetal at gmail.com>
Date:   Mon Aug 18 17:03:19 2014 +0800

mshtml: Added IHTMLInputElement_get_form method implementation.

---

 dlls/mshtml/htmlinput.c |  25 ++++++++++-
 dlls/mshtml/tests/dom.c | 113 +++++++++++++++++++++++++++++++++---------------
 2 files changed, 101 insertions(+), 37 deletions(-)

diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index f25f437..2492579 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -255,8 +255,29 @@ static HRESULT WINAPI HTMLInputElement_get_disabled(IHTMLInputElement *iface, VA
 static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLFormElement **p)
 {
     HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    nsIDOMHTMLFormElement *nsform;
+    HTMLDOMNode *node;
+    HRESULT hres;
+    nsresult nsres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    nsres = nsIDOMHTMLInputElement_GetForm(This->nsinput, &nsform);
+    if (NS_FAILED(nsres) || nsform == NULL) {
+        ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform);
+        *p = NULL;
+        return E_FAIL;
+    }
+
+    hres = get_node(This->element.node.doc, (nsIDOMNode*)nsform, TRUE, &node);
+    nsIDOMHTMLFormElement_Release(nsform);
+    if (FAILED(hres))
+        return hres;
+
+    hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p);
+
+    node_release(node);
+    return hres;
 }
 
 static HRESULT WINAPI HTMLInputElement_put_size(IHTMLInputElement *iface, LONG v)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index f2b556b..f558c69 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -3069,6 +3069,40 @@ static void _test_attr_specified(unsigned line, IHTMLDOMAttribute *attr, VARIANT
     ok_(__FILE__,line)(specified == expected, "specified = %x, expected %x\n", specified, expected);
 }
 
+#define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
+static void _test_elem_id(unsigned line, IUnknown *unk, const char *exid)
+{
+    IHTMLElement *elem = _get_elem_iface(line, unk);
+    BSTR id = (void*)0xdeadbeef;
+    HRESULT hres;
+
+    hres = IHTMLElement_get_id(elem, &id);
+    IHTMLElement_Release(elem);
+    ok_(__FILE__,line) (hres == S_OK, "get_id failed: %08x\n", hres);
+
+    if(exid)
+        ok_(__FILE__,line) (!strcmp_wa(id, exid), "unexpected id %s\n", wine_dbgstr_w(id));
+    else
+        ok_(__FILE__,line) (!id, "id=%s\n", wine_dbgstr_w(id));
+
+    SysFreeString(id);
+}
+
+#define test_elem_put_id(u,i) _test_elem_put_id(__LINE__,u,i)
+static void _test_elem_put_id(unsigned line, IUnknown *unk, const char *new_id)
+{
+    IHTMLElement *elem = _get_elem_iface(line, unk);
+    BSTR tmp = a2bstr(new_id);
+    HRESULT hres;
+
+    hres = IHTMLElement_put_id(elem, tmp);
+    IHTMLElement_Release(elem);
+    SysFreeString(tmp);
+    ok_(__FILE__,line) (hres == S_OK, "put_id failed: %08x\n", hres);
+
+    _test_elem_id(line, unk, new_id);
+}
+
 static void test_contenteditable(IUnknown *unk)
 {
     IHTMLElement3 *elem3 = get_elem3_iface(unk);
@@ -3246,6 +3280,45 @@ static void _test_input_value(unsigned line, IUnknown *unk, const char *exval)
     IHTMLInputElement_Release(input);
 }
 
+#define test_input_get_form(o, t)  _test_input_get_form(__LINE__, o, t)
+static void _test_input_get_form(unsigned line, IUnknown *unk, const char *id)
+{
+    IHTMLInputElement *input;
+    IHTMLFormElement *form;
+    IHTMLElement *elem;
+    HRESULT hres;
+
+    ok_(__FILE__,line) (unk != NULL, "unk is NULL!\n");
+    hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input);
+    ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres);
+    ok_(__FILE__,line) (input != NULL, "input == NULL\n");
+    if(FAILED(hres) || input == NULL)
+        return;
+
+    hres = IHTMLInputElement_get_form(input, &form);
+    ok_(__FILE__, line) (hres == S_OK, "get_form failed: %08x\n", hres);
+    ok_(__FILE__, line) (form != NULL, "form == NULL\n");
+    if(FAILED(hres) || form == NULL){
+        IHTMLInputElement_Release(input);
+        return;
+    }
+
+    hres = IHTMLFormElement_QueryInterface(form, &IID_IHTMLElement, (void **)&elem);
+    ok_(__FILE__, line) (hres == S_OK, "QueryInterface(IID_IHTMLElement) failed: %08x\n", hres);
+    ok_(__FILE__, line) (elem != NULL, "elem == NULL\n");
+    if(FAILED(hres) || elem == NULL){
+        IHTMLInputElement_Release(input);
+        IHTMLFormElement_Release(form);
+        return;
+    }
+
+    _test_elem_id(line, (IUnknown*)elem, id);
+
+    IHTMLInputElement_Release(input);
+    IHTMLFormElement_Release(form);
+    IHTMLElement_Release(elem);
+}
+
 #define test_input_put_value(o,v) _test_input_put_value(__LINE__,o,v)
 static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val)
 {
@@ -3536,40 +3609,6 @@ static void _test_elem_set_class(unsigned line, IUnknown *unk, const char *class
     _test_elem_class(line, unk, class);
 }
 
-#define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
-static void _test_elem_id(unsigned line, IUnknown *unk, const char *exid)
-{
-    IHTMLElement *elem = _get_elem_iface(line, unk);
-    BSTR id = (void*)0xdeadbeef;
-    HRESULT hres;
-
-    hres = IHTMLElement_get_id(elem, &id);
-    IHTMLElement_Release(elem);
-    ok_(__FILE__,line) (hres == S_OK, "get_id failed: %08x\n", hres);
-
-    if(exid)
-        ok_(__FILE__,line) (!strcmp_wa(id, exid), "unexpected id %s\n", wine_dbgstr_w(id));
-    else
-        ok_(__FILE__,line) (!id, "id=%s\n", wine_dbgstr_w(id));
-
-    SysFreeString(id);
-}
-
-#define test_elem_put_id(u,i) _test_elem_put_id(__LINE__,u,i)
-static void _test_elem_put_id(unsigned line, IUnknown *unk, const char *new_id)
-{
-    IHTMLElement *elem = _get_elem_iface(line, unk);
-    BSTR tmp = a2bstr(new_id);
-    HRESULT hres;
-
-    hres = IHTMLElement_put_id(elem, tmp);
-    IHTMLElement_Release(elem);
-    SysFreeString(tmp);
-    ok_(__FILE__,line) (hres == S_OK, "put_id failed: %08x\n", hres);
-
-    _test_elem_id(line, unk, new_id);
-}
-
 #define test_elem_title(u,t) _test_elem_title(__LINE__,u,t)
 static void _test_elem_title(unsigned line, IUnknown *unk, const char *extitle)
 {
@@ -7544,7 +7583,7 @@ static void test_elems2(IHTMLDocument2 *doc)
     test_insert_adjacent_elems(doc, div);
 
     test_elem_set_innerhtml((IUnknown*)div,
-            "<form id=\"form\"><input type=\"button\" /><div><input type=\"text\" /></div></textarea>");
+            "<form id=\"form\"><input type=\"button\" /><div><input type=\"text\" id=\"inputid\"/></div></textarea>");
     elem = get_elem_by_id(doc, "form", TRUE);
     if(elem) {
         test_form_length((IUnknown*)elem, 2);
@@ -7566,6 +7605,10 @@ static void test_elems2(IHTMLDocument2 *doc)
         test_form_reset((IUnknown*)elem);
         test_form_target((IUnknown*)elem);
         IHTMLElement_Release(elem);
+
+        elem = get_elem_by_id(doc, "inputid", TRUE);
+        test_input_get_form((IUnknown*)elem, "form");
+        IHTMLElement_Release(elem);
     }
 
     test_attr(div);




More information about the wine-cvs mailing list