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

Alexandre Julliard julliard at winehq.org
Wed Aug 12 11:08:53 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Aug 11 19:17:19 2009 +0200

mshtml: Added IHTMLElement::get_outerHTML implementation.

---

 dlls/mshtml/htmlelem.c       |   22 ++++++++++++++++++++--
 dlls/mshtml/mshtml_private.h |    2 +-
 dlls/mshtml/nsembed.c        |   26 ++++++++++++++------------
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 170d5a0..84f6309 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -931,8 +931,26 @@ static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v)
 static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p)
 {
     HTMLElement *This = HTMLELEM_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    nsAString html_str;
+    HRESULT hres;
+
+    WARN("(%p)->(%p) semi-stub\n", This, p);
+
+    nsAString_Init(&html_str, NULL);
+    hres = nsnode_to_nsstring(This->node.nsnode, &html_str);
+    if(SUCCEEDED(hres)) {
+        const PRUnichar *html;
+
+        nsAString_GetData(&html_str, &html);
+        *p = SysAllocString(html);
+        if(!*p)
+            hres = E_OUTOFMEMORY;
+    }
+
+    nsAString_Finish(&html_str);
+
+    TRACE("ret %s\n", debugstr_w(*p));
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLElement_put_outerText(IHTMLElement *iface, BSTR v)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 6f72271..7d21f5e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -562,7 +562,7 @@ void nsAString_Finish(nsAString*);
 
 nsIInputStream *create_nsstream(const char*,PRInt32);
 nsICommandParams *create_nscommand_params(void);
-void nsnode_to_nsstring(nsIDOMNode*,nsAString*);
+HRESULT nsnode_to_nsstring(nsIDOMNode*,nsAString*);
 void get_editor_controller(NSContainer*);
 void init_nsevents(NSContainer*);
 void add_nsevent_listener(NSContainer*,LPCWSTR);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index a708fde..d6e3206 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -633,7 +633,7 @@ nsresult get_nsinterface(nsISupports *iface, REFIID riid, void **ppv)
     return nsres;
 }
 
-static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
+static HRESULT nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
 {
     nsIDOMNodeList *node_list = NULL;
     PRBool has_children = FALSE;
@@ -645,7 +645,7 @@ static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode
     nsres = nsIDOMNode_GetNodeType(nsnode, &type);
     if(NS_FAILED(nsres)) {
         ERR("GetType failed: %08x\n", nsres);
-        return;
+        return E_FAIL;
     }
 
     switch(type) {
@@ -711,35 +711,37 @@ static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode
         nsIContentSerializer_AppendElementEnd(serializer, nselem, str);
         nsIDOMElement_Release(nselem);
     }
+
+    return S_OK;
 }
 
-void nsnode_to_nsstring(nsIDOMNode *nsdoc, nsAString *str)
+HRESULT nsnode_to_nsstring(nsIDOMNode *nsnode, nsAString *str)
 {
     nsIContentSerializer *serializer;
-    nsIDOMNode *nsnode;
     nsresult nsres;
+    HRESULT hres;
 
     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
             NS_HTMLSERIALIZER_CONTRACTID, NULL, &IID_nsIContentSerializer,
             (void**)&serializer);
     if(NS_FAILED(nsres)) {
         ERR("Could not get nsIContentSerializer: %08x\n", nsres);
-        return;
+        return E_FAIL;
     }
 
     nsres = nsIContentSerializer_Init(serializer, 0, 100, NULL, FALSE, FALSE /* FIXME */);
     if(NS_FAILED(nsres))
         ERR("Init failed: %08x\n", nsres);
 
-    nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
-    nsnode_to_nsstring_rec(serializer, nsnode, str);
-    nsIDOMNode_Release(nsnode);
-
-    nsres = nsIContentSerializer_Flush(serializer, str);
-    if(NS_FAILED(nsres))
-        ERR("Flush failed: %08x\n", nsres);
+    hres = nsnode_to_nsstring_rec(serializer, nsnode, str);
+    if(SUCCEEDED(hres)) {
+        nsres = nsIContentSerializer_Flush(serializer, str);
+        if(NS_FAILED(nsres))
+            ERR("Flush failed: %08x\n", nsres);
+    }
 
     nsIContentSerializer_Release(serializer);
+    return hres;
 }
 
 void get_editor_controller(NSContainer *This)




More information about the wine-cvs mailing list