Jacek Caban : mshtml: Moved getElementById implementation to separated function.

Alexandre Julliard julliard at winehq.org
Tue Oct 2 14:09:40 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct  2 15:44:27 2012 +0200

mshtml: Moved getElementById implementation to separated function.

---

 dlls/mshtml/htmldoc3.c       |  147 +++++++++++++++++++++++-------------------
 dlls/mshtml/htmlelem.c       |   13 ++++
 dlls/mshtml/mshtml_private.h |    1 +
 3 files changed, 94 insertions(+), 67 deletions(-)

diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c
index f34f0a2..8139f7f 100644
--- a/dlls/mshtml/htmldoc3.c
+++ b/dlls/mshtml/htmldoc3.c
@@ -20,6 +20,7 @@
 
 #include <stdarg.h>
 #include <stdio.h>
+#include <assert.h>
 
 #define COBJMACROS
 
@@ -35,6 +36,79 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
+static HRESULT get_doc_elem_by_id(HTMLDocumentNode *doc, const WCHAR *id, HTMLElement **ret)
+{
+    nsIDOMNodeList *nsnode_list;
+    nsIDOMElement *nselem;
+    nsIDOMNode *nsnode;
+    nsAString id_str;
+    nsresult nsres;
+    HRESULT hres;
+
+    if(!doc->nsdoc) {
+        WARN("NULL nsdoc\n");
+        return E_UNEXPECTED;
+    }
+
+    nsAString_InitDepend(&id_str, id);
+    /* get element by id attribute */
+    nsres = nsIDOMHTMLDocument_GetElementById(doc->nsdoc, &id_str, &nselem);
+    if(FAILED(nsres)) {
+        ERR("GetElementById failed: %08x\n", nsres);
+        nsAString_Finish(&id_str);
+        return E_FAIL;
+    }
+
+    /* get first element by name attribute */
+    nsres = nsIDOMHTMLDocument_GetElementsByName(doc->nsdoc, &id_str, &nsnode_list);
+    nsAString_Finish(&id_str);
+    if(FAILED(nsres)) {
+        ERR("getElementsByName failed: %08x\n", nsres);
+        if(nselem)
+            nsIDOMElement_Release(nselem);
+        return E_FAIL;
+    }
+
+    nsres = nsIDOMNodeList_Item(nsnode_list, 0, &nsnode);
+    nsIDOMNodeList_Release(nsnode_list);
+    assert(nsres == NS_OK);
+
+    if(nsnode && nselem) {
+        PRUint16 pos;
+
+        nsres = nsIDOMNode_CompareDocumentPosition(nsnode, (nsIDOMNode*)nselem, &pos);
+        if(NS_FAILED(nsres)) {
+            FIXME("CompareDocumentPosition failed: 0x%08x\n", nsres);
+            nsIDOMNode_Release(nsnode);
+            nsIDOMElement_Release(nselem);
+            return E_FAIL;
+        }
+
+        TRACE("CompareDocumentPosition gave: 0x%x\n", pos);
+        if(!(pos & (DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS))) {
+            nsIDOMElement_Release(nselem);
+            nselem = NULL;
+        }
+    }
+
+    if(nsnode) {
+        if(!nselem) {
+            nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
+            assert(nsres == NS_OK);
+        }
+        nsIDOMNode_Release(nsnode);
+    }
+
+    if(!nselem) {
+        *ret = NULL;
+        return S_OK;
+    }
+
+    hres = get_elem(doc, nselem, ret);
+    nsIDOMElement_Release(nselem);
+    return hres;
+}
+
 static inline HTMLDocument *impl_from_IHTMLDocument3(IHTMLDocument3 *iface)
 {
     return CONTAINING_RECORD(iface, HTMLDocument, IHTMLDocument3_iface);
@@ -469,80 +543,19 @@ static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v
                                                    IHTMLElement **pel)
 {
     HTMLDocument *This = impl_from_IHTMLDocument3(iface);
-    nsIDOMElement *nselem;
-    HTMLDOMNode *node;
-    nsIDOMNode *nsnode, *nsnode_by_id, *nsnode_by_name;
-    nsIDOMNodeList *nsnode_list;
-    nsAString id_str;
-    nsresult nsres;
+    HTMLElement *elem;
     HRESULT hres;
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
 
-    if(!This->doc_node->nsdoc) {
-        WARN("NULL nsdoc\n");
-        return E_UNEXPECTED;
-    }
-
-    nsAString_InitDepend(&id_str, v);
-    /* get element by id attribute */
-    nsres = nsIDOMHTMLDocument_GetElementById(This->doc_node->nsdoc, &id_str, &nselem);
-    if(FAILED(nsres)) {
-        ERR("GetElementById failed: %08x\n", nsres);
-        nsAString_Finish(&id_str);
-        return E_FAIL;
-    }
-    nsnode_by_id = (nsIDOMNode*)nselem;
-
-    /* get first element by name attribute */
-    nsres = nsIDOMHTMLDocument_GetElementsByName(This->doc_node->nsdoc, &id_str, &nsnode_list);
-    nsAString_Finish(&id_str);
-    if(FAILED(nsres)) {
-        ERR("getElementsByName failed: %08x\n", nsres);
-        if(nsnode_by_id)
-            nsIDOMNode_Release(nsnode_by_id);
-        return E_FAIL;
-    }
-    nsIDOMNodeList_Item(nsnode_list, 0, &nsnode_by_name);
-    nsIDOMNodeList_Release(nsnode_list);
-
-
-    if(nsnode_by_name && nsnode_by_id) {
-        PRUint16 pos;
-
-        nsres = nsIDOMNode_CompareDocumentPosition(nsnode_by_name, nsnode_by_id, &pos);
-        if(NS_FAILED(nsres)) {
-            FIXME("CompareDocumentPosition failed: 0x%08x\n", nsres);
-            nsIDOMNode_Release(nsnode_by_name);
-            nsIDOMNode_Release(nsnode_by_id);
-            return E_FAIL;
-        }
-
-        TRACE("CompareDocumentPosition gave: 0x%x\n", pos);
-        if(pos & (DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS)) {
-            nsnode = nsnode_by_id;
-            nsIDOMNode_Release(nsnode_by_name);
-        }else {
-            nsnode = nsnode_by_name;
-            nsIDOMNode_Release(nsnode_by_id);
-        }
-    }else
-        nsnode = nsnode_by_name ? nsnode_by_name : nsnode_by_id;
-
-    if(nsnode) {
-        hres = get_node(This->doc_node, nsnode, TRUE, &node);
-        nsIDOMNode_Release(nsnode);
-
-        if(SUCCEEDED(hres)) {
-            hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)pel);
-            node_release(node);
-        }
-    }else {
+    hres = get_doc_elem_by_id(This->doc_node, v, &elem);
+    if(FAILED(hres) || !elem) {
         *pel = NULL;
-        hres = S_OK;
+        return hres;
     }
 
-    return hres;
+    *pel = &elem->IHTMLElement_iface;
+    return S_OK;
 }
 
 
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index a12b8de..aa3b68f 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1864,6 +1864,19 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g
     return S_OK;
 }
 
+HRESULT get_elem(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTMLElement **ret)
+{
+    HTMLDOMNode *node;
+    HRESULT hres;
+
+    hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node);
+    if(FAILED(hres))
+        return hres;
+
+    *ret = impl_from_HTMLDOMNode(node);
+    return S_OK;
+}
+
 /* interface IHTMLFiltersCollection */
 static HRESULT WINAPI HTMLFiltersCollection_QueryInterface(IHTMLFiltersCollection *iface, REFIID riid, void **ppv)
 {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index dd41224..e26b594 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -898,6 +898,7 @@ HRESULT HTMLFrameBase_QI(HTMLFrameBase*,REFIID,void**) DECLSPEC_HIDDEN;
 void HTMLFrameBase_destructor(HTMLFrameBase*) DECLSPEC_HIDDEN;
 
 HRESULT get_node(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN;
+HRESULT get_elem(HTMLDocumentNode*,nsIDOMElement*,HTMLElement**) DECLSPEC_HIDDEN;
 
 HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list