From b733e958592e26100fd0449b8bbf56857d71d2de Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 12 Sep 2007 23:39:17 +0200 Subject: [PATCH] mshtml: Store HTMLDOMNode struct instead of pointer in HTMLElement object. --- dlls/mshtml/htmlanchor.c | 4 ++-- dlls/mshtml/htmlbody.c | 12 +++++------ dlls/mshtml/htmlelem.c | 45 +++++++++++++++++++++++------------------ dlls/mshtml/htmlinput.c | 4 ++-- dlls/mshtml/htmlnode.c | 48 ++++++++++++++++++++++++++++---------------- dlls/mshtml/htmlselect.c | 4 ++-- dlls/mshtml/htmltextarea.c | 4 ++-- dlls/mshtml/mshtml_private.h | 5 +++-- 8 files changed, 73 insertions(+), 53 deletions(-) diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index c7f7912d3e4..1b01f42a33c 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -82,7 +82,7 @@ static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->element->node.doc)); } static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface) @@ -91,7 +91,7 @@ static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->element->node.doc)); } static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo) diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index b6b78f6a2d4..966b693fb23 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -95,7 +95,7 @@ static ULONG WINAPI HTMLBodyElement_AddRef(IHTMLBodyElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->element->node.doc)); } static ULONG WINAPI HTMLBodyElement_Release(IHTMLBodyElement *iface) @@ -104,7 +104,7 @@ static ULONG WINAPI HTMLBodyElement_Release(IHTMLBodyElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->element->node.doc)); } static HRESULT WINAPI HTMLBodyElement_GetTypeInfoCount(IHTMLBodyElement *iface, UINT *pctinfo) @@ -406,18 +406,18 @@ static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, I TRACE("(%p)->(%p)\n", This, range); - if(This->element->node->doc->nscontainer) { + if(This->element->node.doc->nscontainer) { nsIDOMDocument *nsdoc; nsIDOMDocumentRange *nsdocrange; nsresult nsres; - nsIWebNavigation_GetDocument(This->element->node->doc->nscontainer->navigation, &nsdoc); + nsIWebNavigation_GetDocument(This->element->node.doc->nscontainer->navigation, &nsdoc); nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange); nsIDOMDocument_Release(nsdoc); nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &nsrange); if(NS_SUCCEEDED(nsres)) { - nsres = nsIDOMRange_SelectNodeContents(nsrange, This->element->node->nsnode); + nsres = nsIDOMRange_SelectNodeContents(nsrange, This->element->node.nsnode); if(NS_FAILED(nsres)) ERR("SelectNodeContents failed: %08x\n", nsres); }else { @@ -427,7 +427,7 @@ static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, I nsIDOMDocumentRange_Release(nsdocrange); } - *range = HTMLTxtRange_Create(This->element->node->doc, nsrange); + *range = HTMLTxtRange_Create(This->element->node.doc, nsrange); return S_OK; } diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 46b3a225a65..a1df0d4b588 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -58,6 +58,8 @@ static void elem_vector_add(elem_vector *buf, HTMLElement *elem) #define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface) +#define HTMLELEM_NODE_THIS(node) ((HTMLElement *) node) + static HRESULT WINAPI HTMLElement_QueryInterface(IHTMLElement *iface, REFIID riid, void **ppv) { @@ -82,7 +84,7 @@ static ULONG WINAPI HTMLElement_AddRef(IHTMLElement *iface) return IUnknown_AddRef(This->impl); TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->node.doc)); } static ULONG WINAPI HTMLElement_Release(IHTMLElement *iface) @@ -93,7 +95,7 @@ static ULONG WINAPI HTMLElement_Release(IHTMLElement *iface) return IUnknown_Release(This->impl); TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->node.doc)); } static HRESULT WINAPI HTMLElement_GetTypeInfoCount(IHTMLElement *iface, UINT *pctinfo) @@ -199,7 +201,7 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr WCHAR buffer[256]; DWORD len; BSTR bstrBaseUrl; - hres = IHTMLDocument2_get_URL(HTMLDOC(This->node->doc), &bstrBaseUrl); + hres = IHTMLDocument2_get_URL(HTMLDOC(This->node.doc), &bstrBaseUrl); if(SUCCEEDED(hres)) { hres = CoInternetCombineUrl(bstrBaseUrl, value, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, @@ -763,7 +765,7 @@ static HRESULT WINAPI HTMLElement_insertAdjacentHTML(IHTMLElement *iface, BSTR w TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(html)); - nsres = nsIWebNavigation_GetDocument(This->node->doc->nscontainer->navigation, &nsdoc); + nsres = nsIWebNavigation_GetDocument(This->node.doc->nscontainer->navigation, &nsdoc); if(NS_FAILED(nsres)) { ERR("GetDocument failed: %08x\n", nsres); @@ -825,7 +827,7 @@ static HRESULT WINAPI HTMLElement_insertAdjacentText(IHTMLElement *iface, BSTR w TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(text)); - nsres = nsIWebNavigation_GetDocument(This->node->doc->nscontainer->navigation, &nsdoc); + nsres = nsIWebNavigation_GetDocument(This->node.doc->nscontainer->navigation, &nsdoc); if(NS_FAILED(nsres) || !nsdoc) { ERR("GetDocument failed: %08x\n", nsres); @@ -1034,7 +1036,7 @@ static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector HTMLDOMNode *node; nsresult nsres; - nsres = nsIDOMNode_GetChildNodes(elem->node->nsnode, &nsnode_list); + nsres = nsIDOMNode_GetChildNodes(elem->node.nsnode, &nsnode_list); if(NS_FAILED(nsres)) { ERR("GetChildNodes failed: %08x\n", nsres); return; @@ -1058,7 +1060,7 @@ static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector if(node->node_type != NT_HTMLELEM) continue; - elem_vector_add(buf, (HTMLElement*)node->impl.elem); + elem_vector_add(buf, HTMLELEM_NODE_THIS(node)); } } @@ -1069,7 +1071,7 @@ static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch ** TRACE("(%p)->(%p)\n", This, p); - create_child_list(This->node->doc, This, &buf); + create_child_list(This->node.doc, This, &buf); return HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len, p); } @@ -1082,7 +1084,7 @@ static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *b HTMLDOMNode *node; nsresult nsres; - nsres = nsIDOMNode_GetChildNodes(elem->node->nsnode, &nsnode_list); + nsres = nsIDOMNode_GetChildNodes(elem->node.nsnode, &nsnode_list); if(NS_FAILED(nsres)) { ERR("GetChildNodes failed: %08x\n", nsres); return; @@ -1103,8 +1105,8 @@ static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *b if(node->node_type != NT_HTMLELEM) continue; - elem_vector_add(buf, (HTMLElement*)node->impl.elem); - create_all_list(doc, (HTMLElement*)node->impl.elem, buf); + elem_vector_add(buf, HTMLELEM_NODE_THIS(node)); + create_all_list(doc, HTMLELEM_NODE_THIS(node), buf); } } @@ -1117,7 +1119,9 @@ static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p) buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement**)); - create_all_list(This->node->doc, This, &buf); + create_all_list(This->node.doc, This, &buf); + + TRACE("ret\n"); if(!buf.len) { mshtml_free(buf.buf); @@ -1264,10 +1268,10 @@ HRESULT HTMLElement_QI(HTMLElement *This, REFIID riid, void **ppv) return S_OK; } - return HTMLDOMNode_QI(This->node, riid, ppv); + return HTMLDOMNode_QI(&This->node, riid, ppv); } -void HTMLElement_Create(HTMLDOMNode *node) +HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode) { HTMLElement *ret; nsAString class_name_str; @@ -1282,19 +1286,18 @@ void HTMLElement_Create(HTMLDOMNode *node) ret = mshtml_alloc(sizeof(HTMLElement)); ret->lpHTMLElementVtbl = &HTMLElementVtbl; - ret->node = node; ret->impl = NULL; ret->destructor = NULL; - node->node_type = NT_HTMLELEM; - node->impl.elem = HTMLELEM(ret); - node->destructor = HTMLElement_destructor; + ret->node.node_type = NT_HTMLELEM; + ret->node.impl.elem = HTMLELEM(ret); + ret->node.destructor = HTMLElement_destructor; HTMLElement2_Init(ret); - nsres = nsIDOMNode_QueryInterface(node->nsnode, &IID_nsIDOMHTMLElement, (void**)&ret->nselem); + nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMHTMLElement, (void**)&ret->nselem); if(NS_FAILED(nsres)) - return; + return NULL; nsAString_Init(&class_name_str, NULL); nsIDOMHTMLElement_GetTagName(ret->nselem, &class_name_str); @@ -1313,6 +1316,8 @@ void HTMLElement_Create(HTMLDOMNode *node) HTMLTextAreaElement_Create(ret); nsAString_Finish(&class_name_str); + + return ret; } typedef struct { diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index e618735b278..a5b751000fe 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -83,7 +83,7 @@ static ULONG WINAPI HTMLInputElement_AddRef(IHTMLInputElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->element->node.doc)); } static ULONG WINAPI HTMLInputElement_Release(IHTMLInputElement *iface) @@ -92,7 +92,7 @@ static ULONG WINAPI HTMLInputElement_Release(IHTMLInputElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->element->node.doc)); } static HRESULT WINAPI HTMLInputElement_GetTypeInfoCount(IHTMLInputElement *iface, UINT *pctinfo) diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index cb32930f936..de7a4eeed3e 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -335,6 +335,33 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv) return E_NOINTERFACE; } +static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode) +{ + HTMLDOMNode *ret; + PRUint16 node_type; + + nsIDOMNode_GetNodeType(nsnode, &node_type); + + switch(node_type) { + case ELEMENT_NODE: + ret = &HTMLElement_Create(nsnode)->node; + break; + default: + ret = mshtml_alloc(sizeof(HTMLDOMNode)); + ret->node_type = NT_UNKNOWN; + ret->impl.unk = NULL; + ret->destructor = NULL; + } + + ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl; + ret->doc = doc; + + nsIDOMNode_AddRef(nsnode); + ret->nsnode = nsnode; + + return ret; +} + /* * FIXME * List looks really ugly here. We should use a better data structure or @@ -344,7 +371,6 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv) HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode) { HTMLDOMNode *iter = This->nodes, *ret; - PRUint16 node_type; while(iter) { if(iter->nsnode == nsnode) @@ -355,24 +381,11 @@ HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode) if(iter) return iter; - ret = mshtml_alloc(sizeof(HTMLDOMNode)); - ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl; - ret->node_type = NT_UNKNOWN; - ret->impl.unk = NULL; - ret->destructor = NULL; - ret->doc = This; - - nsIDOMNode_AddRef(nsnode); - ret->nsnode = nsnode; + ret = create_node(This, nsnode); ret->next = This->nodes; This->nodes = ret; - nsIDOMNode_GetNodeType(nsnode, &node_type); - - if(node_type == ELEMENT_NODE) - HTMLElement_Create(ret); - return ret; } @@ -385,9 +398,10 @@ void release_nodes(HTMLDocument *This) for(iter = This->nodes; iter; iter = next) { next = iter->next; + nsIDOMNode_Release(iter->nsnode); if(iter->destructor) iter->destructor(iter->impl.unk); - nsIDOMNode_Release(iter->nsnode); - mshtml_free(iter); + else + mshtml_free(iter); } } diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 4a01ef16b4d..34d0f645e35 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -83,7 +83,7 @@ static ULONG WINAPI HTMLSelectElement_AddRef(IHTMLSelectElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->element->node.doc)); } static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface) @@ -92,7 +92,7 @@ static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->element->node.doc)); } static HRESULT WINAPI HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement *iface, UINT *pctinfo) diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c index 16e9ddfffed..75c3f554f69 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -83,7 +83,7 @@ static ULONG WINAPI HTMLTextAreaElement_AddRef(IHTMLTextAreaElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_AddRef(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_AddRef(HTMLDOC(This->element->node.doc)); } static ULONG WINAPI HTMLTextAreaElement_Release(IHTMLTextAreaElement *iface) @@ -92,7 +92,7 @@ static ULONG WINAPI HTMLTextAreaElement_Release(IHTMLTextAreaElement *iface) TRACE("(%p)\n", This); - return IHTMLDocument2_Release(HTMLDOC(This->element->node->doc)); + return IHTMLDocument2_Release(HTMLDOC(This->element->node.doc)); } static HRESULT WINAPI HTMLTextAreaElement_GetTypeInfoCount(IHTMLTextAreaElement *iface, UINT *pctinfo) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 15648b3a225..5ef90d6eb79 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -271,13 +271,14 @@ struct HTMLDOMNode { }; typedef struct { + HTMLDOMNode node; + const IHTMLElementVtbl *lpHTMLElementVtbl; const IHTMLElement2Vtbl *lpHTMLElement2Vtbl; void (*destructor)(IUnknown*); nsIDOMHTMLElement *nselem; - HTMLDOMNode *node; IUnknown *impl; } HTMLElement; @@ -414,7 +415,7 @@ IHTMLStyleSheet *HTMLStyleSheet_Create(void); void detach_selection(HTMLDocument*); void detach_ranges(HTMLDocument*); -void HTMLElement_Create(HTMLDOMNode*); +HTMLElement *HTMLElement_Create(nsIDOMNode*); void HTMLAnchorElement_Create(HTMLElement*); void HTMLBodyElement_Create(HTMLElement*); void HTMLInputElement_Create(HTMLElement*); -- 2.11.4.GIT