diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index a47f2885479..1d0e6c0adaa 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -35,6 +35,8 @@
#include "htmlevent.h"
#include "htmlstyle.h"
+WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+
static const WCHAR aW[] = {'A',0};
static const WCHAR bodyW[] = {'B','O','D','Y',0};
static const WCHAR embedW[] = {'E','M','B','E','D',0};
@@ -96,6 +98,65 @@ static const tag_desc_t *get_tag_desc(const WCHAR *tag_name)
return NULL;
}
+static HRESULT replace_node_by_html(nsIDOMHTMLDocument *nsdoc, nsIDOMNode *nsnode, const WCHAR *html)
+{
+ nsIDOMDocumentFragment *nsfragment;
+ nsIDOMDocumentRange *nsdocrange;
+ nsIDOMNSRange *nsrange;
+ nsIDOMNode *nsparent;
+ nsIDOMRange *range;
+ nsAString html_str;
+ nsresult nsres;
+ HRESULT hres = S_OK;
+
+ nsres = nsIDOMHTMLDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange);
+ if(NS_FAILED(nsres))
+ return E_FAIL;
+
+ nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range);
+ nsIDOMDocumentRange_Release(nsdocrange);
+ if(NS_FAILED(nsres)) {
+ ERR("CreateRange failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void**)&nsrange);
+ nsIDOMRange_Release(range);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDOMNSRange: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsAString_InitDepend(&html_str, html);
+ nsIDOMNSRange_CreateContextualFragment(nsrange, &html_str, &nsfragment);
+ nsIDOMNSRange_Release(nsrange);
+ nsAString_Finish(&html_str);
+ if(NS_FAILED(nsres)) {
+ ERR("CreateContextualFragment failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMNode_GetParentNode(nsnode, &nsparent);
+ if(NS_SUCCEEDED(nsres) && nsparent) {
+ nsIDOMNode *nstmp;
+
+ nsres = nsIDOMNode_ReplaceChild(nsparent, (nsIDOMNode*)nsfragment, nsnode, &nstmp);
+ nsIDOMNode_Release(nsparent);
+ if(NS_FAILED(nsres)) {
+ ERR("ReplaceChild failed: %08x\n", nsres);
+ hres = E_FAIL;
+ }else if(nstmp) {
+ nsIDOMNode_Release(nstmp);
+ }
+ }else {
+ ERR("GetParentNode failed: %08x\n", nsres);
+ hres = E_FAIL;
+ }
+
+ nsIDOMDocumentFragment_Release(nsfragment);
+ return hres;
+}
+
typedef struct
{
DispatchEx dispex;
@@ -111,9 +172,6 @@ static inline HTMLFiltersCollection *impl_from_IHTMLFiltersCollection(IHTMLFilte
static IHTMLFiltersCollection *HTMLFiltersCollection_Create(void);
-
-WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-
static inline HTMLElement *impl_from_IHTMLElement(IHTMLElement *iface)
{
return CONTAINING_RECORD(iface, HTMLElement, IHTMLElement_iface);
@@ -1086,63 +1144,10 @@ static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p)
static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v)
{
HTMLElement *This = impl_from_IHTMLElement(iface);
- nsIDOMDocumentFragment *nsfragment;
- nsIDOMDocumentRange *nsdocrange;
- nsIDOMNSRange *nsrange;
- nsIDOMNode *nsparent;
- nsIDOMRange *range;
- nsAString html_str;
- nsresult nsres;
- HRESULT hres = S_OK;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
- nsres = nsIDOMHTMLDocument_QueryInterface(This->node.doc->nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange);
- if(NS_FAILED(nsres))
- return E_FAIL;
-
- nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range);
- nsIDOMDocumentRange_Release(nsdocrange);
- if(NS_FAILED(nsres)) {
- ERR("CreateRange failed: %08x\n", nsres);
- return E_FAIL;
- }
-
- nsres = nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void**)&nsrange);
- nsIDOMRange_Release(range);
- if(NS_FAILED(nsres)) {
- ERR("Could not get nsIDOMNSRange: %08x\n", nsres);
- return E_FAIL;
- }
-
- nsAString_InitDepend(&html_str, v);
- nsIDOMNSRange_CreateContextualFragment(nsrange, &html_str, &nsfragment);
- nsIDOMNSRange_Release(nsrange);
- nsAString_Finish(&html_str);
- if(NS_FAILED(nsres)) {
- ERR("CreateContextualFragment failed: %08x\n", nsres);
- return E_FAIL;
- }
-
- nsres = nsIDOMNode_GetParentNode(This->node.nsnode, &nsparent);
- if(NS_SUCCEEDED(nsres) && nsparent) {
- nsIDOMNode *nstmp;
-
- nsres = nsIDOMNode_ReplaceChild(nsparent, (nsIDOMNode*)nsfragment, This->node.nsnode, &nstmp);
- nsIDOMNode_Release(nsparent);
- if(NS_FAILED(nsres)) {
- ERR("ReplaceChild failed: %08x\n", nsres);
- hres = E_FAIL;
- }else if(nstmp) {
- nsIDOMNode_Release(nstmp);
- }
- }else {
- ERR("GetParentNode failed: %08x\n", nsres);
- hres = E_FAIL;
- }
-
- nsIDOMDocumentFragment_Release(nsfragment);
- return hres;
+ return replace_node_by_html(This->node.doc->nsdoc, This->node.nsnode, v);
}
static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p)