Jacek Caban : mshtml: Added IHTMLElement::put_innerHTML implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 10 10:53:16 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar  9 21:23:18 2009 +0100

mshtml: Added IHTMLElement::put_innerHTML implementation.

---

 dlls/mshtml/htmlelem.c  |   33 +++++++++++++++++++++++++++++++--
 dlls/mshtml/tests/dom.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 11d0fb7..444cf83 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -833,8 +833,37 @@ static HRESULT WINAPI HTMLElement_put_innerHTML(IHTMLElement *iface, BSTR v)
 static HRESULT WINAPI HTMLElement_get_innerHTML(IHTMLElement *iface, BSTR *p)
 {
     HTMLElement *This = HTMLELEM_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    nsIDOMNSHTMLElement *nselem;
+    nsAString html_str;
+    nsresult nsres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(!This->nselem) {
+        FIXME("NULL nselem\n");
+        return E_NOTIMPL;
+    }
+
+    nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    nsAString_Init(&html_str, NULL);
+    nsres = nsIDOMNSHTMLElement_GetInnerHTML(nselem, &html_str);
+    if(NS_SUCCEEDED(nsres)) {
+        const PRUnichar *html;
+
+        nsAString_GetData(&html_str, &html);
+        *p = *html ? SysAllocString(html) : NULL;
+    }else {
+        FIXME("SetInnerHtml failed %08x\n", nsres);
+        *p = NULL;
+    }
+
+    nsAString_Finish(&html_str);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLElement_put_innerText(IHTMLElement *iface, BSTR v)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 69ed3c0..a5b9cc6 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1132,6 +1132,39 @@ static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const ch
 
 }
 
+#define test_elem_innerhtml(e,t) _test_elem_innerhtml(__LINE__,e,t)
+static void _test_elem_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
+{
+    IHTMLElement *elem = _get_elem_iface(line, unk);
+    BSTR html;
+    HRESULT hres;
+
+    hres = IHTMLElement_get_innerHTML(elem, &html);
+    ok_(__FILE__,line)(hres == S_OK, "get_innerHTML failed: %08x\n", hres);
+    if(inner_html)
+        ok_(__FILE__,line)(!strcmp_wa(html, inner_html), "unexpected innerHTML: %s\n", dbgstr_w(html));
+    else
+        ok_(__FILE__,line)(!html, "innerHTML = %s\n", dbgstr_w(html));
+
+    IHTMLElement_Release(elem);
+    SysFreeString(html);
+}
+
+#define test_elem_set_innerhtml(e,t) _test_elem_set_innerhtml(__LINE__,e,t)
+static void _test_elem_set_innerhtml(unsigned line, IUnknown *unk, const char *inner_html)
+{
+    IHTMLElement *elem = _get_elem_iface(line, unk);
+    BSTR html;
+    HRESULT hres;
+
+    html = a2bstr(inner_html);
+    hres = IHTMLElement_put_innerHTML(elem, html);
+    ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08x\n", hres);
+
+    IHTMLElement_Release(elem);
+    SysFreeString(html);
+}
+
 #define get_first_child(n) _get_first_child(__LINE__,n)
 static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk)
 {
@@ -4051,6 +4084,7 @@ static void test_elems(IHTMLDocument2 *doc)
     static const WCHAR imgidW[] = {'i','m','g','i','d',0};
     static const WCHAR inW[] = {'i','n',0};
     static const WCHAR xW[] = {'x',0};
+    static const WCHAR yW[] = {'y',0};
     static const WCHAR sW[] = {'s',0};
     static const WCHAR scW[] = {'s','c',0};
     static const WCHAR xxxW[] = {'x','x','x',0};
@@ -4449,6 +4483,13 @@ static void test_elems(IHTMLDocument2 *doc)
         IHTMLElementCollection_Release(col);
     }
 
+    elem = get_doc_elem_by_id(doc, yW);
+    test_elem_set_innerhtml((IUnknown*)elem, "inner html");
+    test_elem_innerhtml((IUnknown*)elem, "inner html");
+    test_elem_set_innerhtml((IUnknown*)elem, "");
+    test_elem_innerhtml((IUnknown*)elem, NULL);
+    IHTMLElement_Release(elem);
+
     IHTMLDocument3_Release(doc3);
 }
 
@@ -4515,6 +4556,7 @@ static void test_create_elems(IHTMLDocument2 *doc)
     IHTMLDOMNode_Release(node3);
 
     test_elem_innertext(body, "insert test");
+    test_elem_innerhtml((IUnknown*)body, "insert test");
 
     hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5);
     if(hres == S_OK)




More information about the wine-cvs mailing list