Jacek Caban : mshtml: Added IHTMLElement::put_innerText implementation.
Alexandre Julliard
julliard at winehq.org
Tue Oct 14 08:29:34 CDT 2008
Module: wine
Branch: master
Commit: 59c66e34a94fc3d1cc670786f61f3169792cd01a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=59c66e34a94fc3d1cc670786f61f3169792cd01a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Oct 13 14:50:27 2008 -0500
mshtml: Added IHTMLElement::put_innerText implementation.
---
dlls/mshtml/htmlelem.c | 43 +++++++++++++-
dlls/mshtml/tests/dom.c | 147 ++++++++++++++++++++++++++++++-----------------
2 files changed, 136 insertions(+), 54 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index e682095..4e7b747 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -832,8 +832,47 @@ static HRESULT WINAPI HTMLElement_get_innerHTML(IHTMLElement *iface, BSTR *p)
static HRESULT WINAPI HTMLElement_put_innerText(IHTMLElement *iface, BSTR v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsIDOMNode *nschild, *tmp;
+ nsIDOMText *text_node;
+ nsAString text_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ while(1) {
+ nsres = nsIDOMHTMLElement_GetLastChild(This->nselem, &nschild);
+ if(NS_FAILED(nsres)) {
+ ERR("GetLastChild failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+ if(!nschild)
+ break;
+
+ nsres = nsIDOMHTMLElement_RemoveChild(This->nselem, nschild, &tmp);
+ nsIDOMNode_Release(nschild);
+ if(NS_FAILED(nsres)) {
+ ERR("RemoveChild failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+ nsIDOMNode_Release(tmp);
+ }
+
+ nsAString_Init(&text_str, v);
+ nsres = nsIDOMHTMLDocument_CreateTextNode(This->node.doc->nsdoc, &text_str, &text_node);
+ nsAString_Finish(&text_str);
+ if(NS_FAILED(nsres)) {
+ ERR("CreateTextNode failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMHTMLElement_AppendChild(This->nselem, (nsIDOMNode*)text_node, &tmp);
+ if(NS_FAILED(nsres)) {
+ ERR("AppendChild failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsIDOMNode_Release(tmp);
+ return S_OK;
}
static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index e8fce39..f230389 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -559,6 +559,58 @@ static void _test_elem_type(unsigned line, IUnknown *unk, elem_type_t type)
_test_disp(line, unk, elem_type_infos[type].dispiid);
}
+#define get_node_type(n) _get_node_type(__LINE__,n)
+static long _get_node_type(unsigned line, IUnknown *unk)
+{
+ IHTMLDOMNode *node = _get_node_iface(line, unk);
+ long type = -1;
+ HRESULT hres;
+
+ hres = IHTMLDOMNode_get_nodeType(node, &type);
+ ok(hres == S_OK, "get_nodeType failed: %08x\n", hres);
+
+ IHTMLDOMNode_Release(node);
+
+ return type;
+}
+
+#define get_child_nodes(u) _get_child_nodes(__LINE__,u)
+static IHTMLDOMChildrenCollection *_get_child_nodes(unsigned line, IUnknown *unk)
+{
+ IHTMLDOMNode *node = _get_node_iface(line, unk);
+ IHTMLDOMChildrenCollection *col = NULL;
+ IDispatch *disp;
+ HRESULT hres;
+
+ hres = IHTMLDOMNode_get_childNodes(node, &disp);
+ IHTMLDOMNode_Release(node);
+ ok_(__FILE__,line) (hres == S_OK, "get_childNodes failed: %08x\n", hres);
+ if(FAILED(hres))
+ return NULL;
+
+ hres = IDispatch_QueryInterface(disp, &IID_IHTMLDOMChildrenCollection, (void**)&col);
+ IDispatch_Release(disp);
+ ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMChildrenCollection: %08x\n", hres);
+
+ return col;
+}
+
+#define get_child_item(c,i) _get_child_item(__LINE__,c,i)
+static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, long idx)
+{
+ IHTMLDOMNode *node = NULL;
+ IDispatch *disp;
+ HRESULT hres;
+
+ hres = IHTMLDOMChildrenCollection_item(col, idx, &disp);
+ ok(hres == S_OK, "item failed: %08x\n", hres);
+
+ node = _get_node_iface(line, (IUnknown*)disp);
+ IDispatch_Release(disp);
+
+ return node;
+}
+
#define test_elem_attr(e,n,v) _test_elem_attr(__LINE__,e,n,v)
static void _test_elem_attr(unsigned line, IHTMLElement *elem, LPCWSTR name, LPCWSTR exval)
{
@@ -1027,6 +1079,44 @@ static void _test_elem_innertext(unsigned line, IHTMLElement *elem, const char *
SysFreeString(text);
}
+#define test_elem_set_innertext(e,t) _test_elem_set_innertext(__LINE__,e,t)
+static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const char *text)
+{
+ IHTMLDOMChildrenCollection *col;
+ BSTR str;
+ HRESULT hres;
+
+ str = a2bstr(text);
+ hres = IHTMLElement_put_innerText(elem, str);
+ ok_(__FILE__,line) (hres == S_OK, "put_innerText failed: %08x\n", hres);
+ SysFreeString(str);
+
+ _test_elem_innertext(line, elem, text);
+
+
+ col = _get_child_nodes(line, (IUnknown*)elem);
+ ok(col != NULL, "col == NULL\n");
+ if(col) {
+ long length = 0, type;
+ IHTMLDOMNode *node;
+
+ hres = IHTMLDOMChildrenCollection_get_length(col, &length);
+ ok(hres == S_OK, "get_length failed: %08x\n", hres);
+ ok(length == 1, "length = %ld\n", length);
+
+ node = _get_child_item(line, col, 0);
+ ok(node != NULL, "node == NULL\n");
+ if(node) {
+ type = _get_node_type(line, (IUnknown*)node);
+ ok(type == 3, "type=%ld\n", type);
+ IHTMLDOMNode_Release(node);
+ }
+
+ IHTMLDOMChildrenCollection_Release(col);
+ }
+
+}
+
#define get_first_child(n) _get_first_child(__LINE__,n)
static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk)
{
@@ -1069,21 +1159,6 @@ static IHTMLDOMNode *_test_node_get_parent(unsigned line, IUnknown *unk)
return parent;
}
-#define get_node_type(n) _get_node_type(__LINE__,n)
-static long _get_node_type(unsigned line, IUnknown *unk)
-{
- IHTMLDOMNode *node = _get_node_iface(line, unk);
- long type = -1;
- HRESULT hres;
-
- hres = IHTMLDOMNode_get_nodeType(node, &type);
- ok(hres == S_OK, "get_nodeType failed: %08x\n", hres);
-
- IHTMLDOMNode_Release(node);
-
- return type;
-}
-
#define test_elem_get_parent(u) _test_elem_get_parent(__LINE__,u)
static IHTMLElement *_test_elem_get_parent(unsigned line, IUnknown *unk)
{
@@ -1351,27 +1426,6 @@ static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val)
IHTMLInputElement_Release(input);
}
-#define get_child_nodes(u) _get_child_nodes(__LINE__,u)
-static IHTMLDOMChildrenCollection *_get_child_nodes(unsigned line, IUnknown *unk)
-{
- IHTMLDOMNode *node = _get_node_iface(line, unk);
- IHTMLDOMChildrenCollection *col = NULL;
- IDispatch *disp;
- HRESULT hres;
-
- hres = IHTMLDOMNode_get_childNodes(node, &disp);
- IHTMLDOMNode_Release(node);
- ok_(__FILE__,line) (hres == S_OK, "get_childNodes failed: %08x\n", hres);
- if(FAILED(hres))
- return NULL;
-
- hres = IDispatch_QueryInterface(disp, &IID_IHTMLDOMChildrenCollection, (void**)&col);
- IDispatch_Release(disp);
- ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMChildrenCollection: %08x\n", hres);
-
- return col;
-}
-
#define test_elem_class(u,c) _test_elem_class(__LINE__,u,c)
static void _test_elem_class(unsigned line, IUnknown *unk, const char *exclass)
{
@@ -1431,22 +1485,6 @@ static void _test_elem_set_class(unsigned line, IUnknown *unk, const char *class
_test_elem_class(line, unk, class);
}
-#define get_child_item(c,i) _get_child_item(__LINE__,c,i)
-static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, long idx)
-{
- IHTMLDOMNode *node = NULL;
- IDispatch *disp;
- HRESULT hres;
-
- hres = IHTMLDOMChildrenCollection_item(col, idx, &disp);
- ok(hres == S_OK, "item failed: %08x\n", hres);
-
- node = _get_node_iface(line, (IUnknown*)disp);
- IDispatch_Release(disp);
-
- return node;
-}
-
#define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
static void _test_elem_id(unsigned line, IUnknown *unk, const char *exid)
{
@@ -3141,6 +3179,11 @@ static void test_elems(IHTMLDocument2 *doc)
test_stylesheets(doc);
test_create_option_elem(doc);
+ elem = get_doc_elem_by_id(doc, tblW);
+ ok(elem != NULL, "elem = NULL\n");
+ test_elem_set_innertext(elem, "inner text");
+ IHTMLElement_Release(elem);
+
test_doc_title(doc, "test");
test_doc_set_title(doc, "test title");
test_doc_title(doc, "test title");
More information about the wine-cvs
mailing list