Andrew Eikum : mshtml: Support get_dispid and invoke methods in HTMLFormElement.

Alexandre Julliard julliard at winehq.org
Wed Dec 2 10:22:12 CST 2009


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Dec  1 14:18:07 2009 -0600

mshtml: Support get_dispid and invoke methods in HTMLFormElement.

---

 dlls/mshtml/htmlform.c |  139 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 138 insertions(+), 1 deletions(-)

diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c
index 153d8aa..1db965a 100644
--- a/dlls/mshtml/htmlform.c
+++ b/dlls/mshtml/htmlform.c
@@ -338,11 +338,148 @@ static void HTMLFormElement_destructor(HTMLDOMNode *iface)
     HTMLElement_destructor(&This->element.node);
 }
 
+static HRESULT HTMLFormElement_get_dispid(HTMLDOMNode *iface,
+        BSTR name, DWORD grfdex, DISPID *pid)
+{
+    HTMLFormElement *This = HTMLFORM_NODE_THIS(iface);
+    nsIDOMHTMLCollection *elements;
+    PRUint32 len, i;
+    static const PRUnichar nameW[] = {'n','a','m','e',0};
+    nsAString nsname;
+    nsresult nsres;
+
+    TRACE("(%p)->(%s %x %p)\n", This, wine_dbgstr_w(name), grfdex, pid);
+
+    nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
+    if(NS_FAILED(nsres)) {
+        FIXME("GetElements failed: 0x%08x\n", nsres);
+        return E_FAIL;
+    }
+
+    nsres = nsIDOMHTMLCollection_GetLength(elements, &len);
+    if(NS_FAILED(nsres)) {
+        FIXME("GetLength failed: 0x%08x\n", nsres);
+        nsIDOMHTMLCollection_Release(elements);
+        return E_FAIL;
+    }
+
+    nsAString_Init(&nsname, nameW);
+    for(i = 0; i < len; ++i) {
+        nsIDOMNode *nsitem;
+        nsIDOMHTMLElement *nshtml_elem;
+        nsAString nsstr;
+        const PRUnichar *str;
+
+        nsres = nsIDOMHTMLCollection_Item(elements, i, &nsitem);
+        if(NS_FAILED(nsres)) {
+            FIXME("Item failed: 0x%08x\n", nsres);
+            nsAString_Finish(&nsname);
+            nsIDOMHTMLCollection_Release(elements);
+            return E_FAIL;
+        }
+
+        nsres = nsIDOMNode_QueryInterface(nsitem, &IID_nsIDOMHTMLElement, (void**)&nshtml_elem);
+        nsIDOMNode_Release(nsitem);
+        if(NS_FAILED(nsres)) {
+            FIXME("Failed to get nsIDOMHTMLNode interface: 0x%08x\n", nsres);
+            nsAString_Finish(&nsname);
+            nsIDOMHTMLCollection_Release(elements);
+            return E_FAIL;
+        }
+
+        /* compare by id attr */
+        nsAString_Init(&nsstr, NULL);
+        nsres = nsIDOMHTMLElement_GetId(nshtml_elem, &nsstr);
+        if(NS_FAILED(nsres)) {
+            FIXME("GetId failed: 0x%08x\n", nsres);
+            nsAString_Finish(&nsname);
+            nsIDOMHTMLElement_Release(nshtml_elem);
+            nsIDOMHTMLCollection_Release(elements);
+            return E_FAIL;
+        }
+        nsAString_GetData(&nsstr, &str);
+        if(!strcmpiW(str, name)) {
+            /* FIXME: using index for dispid */
+            *pid = MSHTML_DISPID_CUSTOM_MIN + i;
+            nsAString_Finish(&nsname);
+            nsAString_Finish(&nsstr);
+            nsIDOMHTMLElement_Release(nshtml_elem);
+            nsIDOMHTMLCollection_Release(elements);
+            return S_OK;
+        }
+
+        /* compare by name attr */
+        nsres = nsIDOMHTMLElement_GetAttribute(nshtml_elem, &nsname, &nsstr);
+        nsAString_GetData(&nsstr, &str);
+        if(!strcmpiW(str, name)) {
+            /* FIXME: using index for dispid */
+            *pid = MSHTML_DISPID_CUSTOM_MIN + i;
+            nsAString_Finish(&nsname);
+            nsAString_Finish(&nsstr);
+            nsIDOMHTMLElement_Release(nshtml_elem);
+            nsIDOMHTMLCollection_Release(elements);
+            return S_OK;
+        }
+        nsAString_Finish(&nsstr);
+
+        nsIDOMHTMLElement_Release(nshtml_elem);
+    }
+    nsAString_Finish(&nsname);
+
+    nsIDOMHTMLCollection_Release(elements);
+
+    return DISP_E_UNKNOWNNAME;
+}
+
+static HRESULT HTMLFormElement_invoke(HTMLDOMNode *iface,
+        DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res,
+        EXCEPINFO *ei, IServiceProvider *caller)
+{
+    HTMLFormElement *This = HTMLFORM_NODE_THIS(iface);
+    nsIDOMHTMLCollection *elements;
+    nsIDOMNode *item;
+    HTMLDOMNode *node;
+    nsresult nsres;
+
+    TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+
+    nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
+    if(NS_FAILED(nsres)) {
+        FIXME("GetElements failed: 0x%08x\n", nsres);
+        return E_FAIL;
+    }
+
+    nsres = nsIDOMHTMLCollection_Item(elements, id - MSHTML_DISPID_CUSTOM_MIN, &item);
+    nsIDOMHTMLCollection_Release(elements);
+    if(NS_FAILED(nsres)) {
+        FIXME("Item failed: 0x%08x\n", nsres);
+        return E_FAIL;
+    }
+
+    node = get_node(This->element.node.doc, item, TRUE);
+
+    V_VT(res) = VT_DISPATCH;
+    V_DISPATCH(res) = (IDispatch*)node;
+
+    IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+    nsIDOMNode_Release(item);
+
+    return S_OK;
+}
+
 #undef HTMLFORM_NODE_THIS
 
 static const NodeImplVtbl HTMLFormElementImplVtbl = {
     HTMLFormElement_QI,
-    HTMLFormElement_destructor
+    HTMLFormElement_destructor,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    HTMLFormElement_get_dispid,
+    HTMLFormElement_invoke
 };
 
 static const tid_t HTMLFormElement_iface_tids[] = {




More information about the wine-cvs mailing list