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)