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