From 6c9341fee85d4b24040efb535db4582ab7fa451f Mon Sep 17 00:00:00 2001 From: "locka%iol.ie" Date: Mon, 2 Feb 2004 21:02:25 +0000 Subject: [PATCH] =?UTF-8?q?Implement=20outerHTML.=20Checkin=20on=20behalf?= =?UTF-8?q?=20of=20Alexandre=20Tr=C3=A9mon=20=20?= =?UTF-8?q?b=3D232281=20r=3Dadamlock=20sr=3Djst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://10.0.0.236/trunk@152176 18797224-902f-48f8-a5cc-f745e15eee43 --- .../activex/src/common/IEHtmlElement.cpp | 71 ++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/mozilla/embedding/browser/activex/src/common/IEHtmlElement.cpp b/mozilla/embedding/browser/activex/src/common/IEHtmlElement.cpp index 96c902cc6c6..fb43b2833f5 100644 --- a/mozilla/embedding/browser/activex/src/common/IEHtmlElement.cpp +++ b/mozilla/embedding/browser/activex/src/common/IEHtmlElement.cpp @@ -47,6 +47,12 @@ #include "IEHtmlElementCollection.h" #include "nsIDOMNSHTMLElement.h" +#include "nsIDOMDocumentRange.h" +#include "nsIDOMRange.h" +#include "nsIDOMNSRange.h" +#include "nsIDOMDocumentFragment.h" +#include "nsIDocumentEncoder.h" + CIEHtmlElement::CIEHtmlElement() { } @@ -562,12 +568,73 @@ HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_innerText(BSTR __RPC_FAR *p) HRESULT STDMETHODCALLTYPE CIEHtmlElement::put_outerHTML(BSTR v) { - return E_NOTIMPL; + nsresult rv; + nsCOMPtr domDoc; + nsCOMPtr domRange; + nsCOMPtr domDocFragment; + + mDOMNode->GetOwnerDocument(getter_AddRefs(domDoc)); + nsCOMPtr domDocRange = do_QueryInterface(domDoc); + if (!domDocRange) + return E_FAIL; + domDocRange->CreateRange(getter_AddRefs(domRange)); + if (!domRange) + return E_FAIL; + if (domRange->SetStartBefore(mDOMNode)) + return E_FAIL; + if (domRange->DeleteContents()) + return E_FAIL; + nsAutoString outerHTML(OLE2W(v)); + nsCOMPtr domNSRange = do_QueryInterface(domRange); + rv = domNSRange->CreateContextualFragment(outerHTML, getter_AddRefs(domDocFragment)); + if (!domDocFragment) + return E_FAIL; + nsCOMPtr parentNode; + mDOMNode->GetParentNode(getter_AddRefs(parentNode)); + nsCOMPtr domNode; + parentNode->ReplaceChild(domDocFragment, mDOMNode, getter_AddRefs(domNode)); + + return S_OK; } HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_outerHTML(BSTR __RPC_FAR *p) { - return E_NOTIMPL; + if (p == NULL) + { + return E_INVALIDARG; + } + + *p = NULL; + + nsresult rv; + nsAutoString outerHTML; + nsCOMPtr domDoc; + nsCOMPtr docEncoder; + nsCOMPtr domRange; + + mDOMNode->GetOwnerDocument(getter_AddRefs(domDoc)); + nsCOMPtr doc = do_QueryInterface(domDoc); + if (!doc) + return E_FAIL; + docEncoder = do_CreateInstance(NS_DOC_ENCODER_CONTRACTID_BASE "text/html"); + NS_ENSURE_TRUE(docEncoder, NS_ERROR_FAILURE); + docEncoder->Init(doc, NS_LITERAL_STRING("text/html"), + nsIDocumentEncoder::OutputEncodeBasicEntities); + nsCOMPtr domDocRange = do_QueryInterface(domDoc); + if (!domDocRange) + return E_FAIL; + domDocRange->CreateRange(getter_AddRefs(domRange)); + if (!domRange) + return E_FAIL; + rv = domRange->SelectNode(mDOMNode); + NS_ENSURE_SUCCESS(rv, rv); + docEncoder->SetRange(domRange); + docEncoder->EncodeToString(outerHTML); + + USES_CONVERSION; + *p = SysAllocString(W2COLE(outerHTML.get())); + + return S_OK; } HRESULT STDMETHODCALLTYPE CIEHtmlElement::put_outerText(BSTR v)