Module: wine Branch: master Commit: d05e328db2bb9fa5992c9d18c87e0f028e61e040 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d05e328db2bb9fa5992c9d18c8...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Oct 13 14:49:58 2008 -0500
mshtml: Added IHTMLElement::get_innerText implementation.
---
dlls/mshtml/htmlelem.c | 6 ++++-- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/dom.c | 15 +++++++++++++++ dlls/mshtml/txtrange.c | 38 +++++++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index a8c0786..e682095 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -839,8 +839,10 @@ static HRESULT WINAPI HTMLElement_put_innerText(IHTMLElement *iface, BSTR v) static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p) { HTMLElement *This = HTMLELEM_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_node_text(&This->node, p); }
static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index cdd4293..ebdc251 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -550,6 +550,7 @@ IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetLis
void detach_selection(HTMLDocument*); void detach_ranges(HTMLDocument*); +HRESULT get_node_text(HTMLDOMNode*,BSTR*);
HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocument*,nsIDOMNode*);
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 87d372d..e8fce39 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -1014,6 +1014,19 @@ static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t ty HeapFree(GetProcessHeap(), 0, types); }
+#define test_elem_innertext(e,t) _test_elem_innertext(__LINE__,e,t) +static void _test_elem_innertext(unsigned line, IHTMLElement *elem, const char *extext) +{ + BSTR text = NULL; + HRESULT hres; + + hres = IHTMLElement_get_innerText(elem, &text); + ok_(__FILE__,line) (hres == S_OK, "get_innerText failed: %08x\n", hres); + ok_(__FILE__,line) (!strcmp_wa(text, extext), "get_innerText returned %s expected %s\n", + dbgstr_w(text), extext); + SysFreeString(text); +} + #define get_first_child(n) _get_first_child(__LINE__,n) static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk) { @@ -2942,6 +2955,8 @@ static void test_elems(IHTMLDocument2 *doc) test_elem_getelembytag((IUnknown*)elem, ET_SELECT, 0); test_elem_getelembytag((IUnknown*)elem, ET_HTML, 0);
+ test_elem_innertext(elem, "opt1opt2"); + IHTMLElement_Release(elem); }
diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c index 3f383d1..78ca90c 100644 --- a/dlls/mshtml/txtrange.c +++ b/dlls/mshtml/txtrange.c @@ -252,7 +252,7 @@ static void wstrbuf_append_node(wstrbuf_t *buf, nsIDOMNode *node) wstrbuf_append_nodetxt(buf, data, strlenW(data)); nsAString_Finish(&data_str);
- nsIDOMText_Release(nstext); + nsIDOMText_Release(nstext);
break; } @@ -267,6 +267,21 @@ static void wstrbuf_append_node(wstrbuf_t *buf, nsIDOMNode *node) } }
+static void wstrbuf_append_node_rec(wstrbuf_t *buf, nsIDOMNode *node) +{ + nsIDOMNode *iter, *tmp; + + wstrbuf_append_node(buf, node); + + nsIDOMNode_GetFirstChild(node, &iter); + while(iter) { + wstrbuf_append_node_rec(buf, iter); + nsIDOMNode_GetNextSibling(iter, &tmp); + nsIDOMNode_Release(iter); + iter = tmp; + } +} + static BOOL fill_nodestr(dompos_t *pos) { nsIDOMText *text; @@ -529,6 +544,27 @@ static void range_to_string(HTMLTxtRange *This, wstrbuf_t *buf) } }
+HRESULT get_node_text(HTMLDOMNode *node, BSTR *ret) +{ + wstrbuf_t buf; + HRESULT hres = S_OK; + + wstrbuf_init(&buf); + wstrbuf_append_node_rec(&buf, node->nsnode); + if(buf.buf) { + *ret = SysAllocString(buf.buf); + if(!*ret) + hres = E_OUTOFMEMORY; + }else { + *ret = NULL; + } + wstrbuf_finish(&buf); + + if(SUCCEEDED(hres)) + TRACE("ret %s\n", debugstr_w(*ret)); + return hres; +} + static WCHAR get_pos_char(const dompos_t *pos) { switch(pos->type) {