diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index b4ed5562d0d..b3ad4798927 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -318,6 +318,7 @@ void nsAString_Finish(nsAString*);
nsIInputStream *create_nsstream(const char*,PRInt32);
nsICommandParams *create_nscommand_params(void);
+void nsnode_to_nsstring(nsIDOMNode*,nsAString*);
BSCallback *create_bscallback(IMoniker*);
HRESULT start_binding(BSCallback*);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 265150cea9f..393e1d91378 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -41,6 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
#define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
#define NS_COMMANDPARAMS_CONTRACTID "@mozilla.org/embedcomp/command-params;1"
+#define NS_HTMLSERIALIZER_CONTRACTID "@mozilla.org/layout/contentserializer;1?mimetype=text/html"
#define APPSTARTUP_TOPIC "app-startup"
@@ -464,6 +465,103 @@ nsICommandParams *create_nscommand_params(void)
return ret;
}
+static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
+{
+ nsIDOMNodeList *node_list = NULL;
+ PRBool has_children = FALSE;
+ PRUint16 type;
+ nsresult nsres;
+
+ nsIDOMNode_HasChildNodes(nsnode, &has_children);
+
+ nsres = nsIDOMNode_GetNodeType(nsnode, &type);
+ if(NS_FAILED(nsres)) {
+ ERR("GetType failed: %08lx\n", nsres);
+ return;
+ }
+
+ switch(type) {
+ case ELEMENT_NODE: {
+ nsIDOMElement *nselem;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
+ nsIContentSerializer_AppendElementStart(serializer, nselem, has_children, str);
+ nsIDOMElement_Release(nselem);
+ break;
+ }
+ case TEXT_NODE: {
+ nsIDOMText *nstext;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&nstext);
+ nsIContentSerializer_AppendText(serializer, nstext, 0, -1, str);
+ nsIDOMText_Release(nstext);
+ break;
+ }
+ case DOCUMENT_NODE: {
+ nsIDOMDocument *nsdoc;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMDocument, (void**)&nsdoc);
+ nsIContentSerializer_AppendDocumentStart(serializer, nsdoc, str);
+ nsIDOMDocument_Release(nsdoc);
+ }
+ default:
+ FIXME("Unhandled type %u\n", type);
+ }
+
+ if(has_children) {
+ PRUint32 child_cnt, i;
+ nsIDOMNode *child_node;
+
+ nsIDOMNode_GetChildNodes(nsnode, &node_list);
+ nsIDOMNodeList_GetLength(node_list, &child_cnt);
+
+ for(i=0; i(%p %x)\n", This, pStm, fClearDirty);
- return E_NOTIMPL;
+ nsIDOMDocument *nsdoc;
+ nsIDOMNode *nsnode;
+ nsAString nsstr;
+ LPCWSTR strw;
+ char *str;
+ DWORD len, written=0;
+ nsresult nsres;
+ HRESULT hres;
+
+ WARN("(%p)->(%p %x) needs more work\n", This, pStm, fClearDirty);
+
+ if(!This->nscontainer)
+ return S_OK;
+
+ nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("GetDocument failed: %08lx\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
+ nsIDOMDocument_Release(nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDOMNode failed: %08lx\n", nsres);
+ return E_FAIL;
+ }
+
+ nsAString_Init(&nsstr, NULL);
+ nsnode_to_nsstring(nsnode, &nsstr);
+ nsIDOMNode_Release(nsnode);
+
+ nsAString_GetData(&nsstr, &strw, NULL);
+
+ len = WideCharToMultiByte(CP_ACP, 0, strw, -1, NULL, 0, NULL, NULL);
+ str = mshtml_alloc(len);
+ WideCharToMultiByte(CP_ACP, 0, strw, -1, str, len, NULL, NULL);
+
+ nsAString_Finish(&nsstr);
+
+ ERR("%s\n", debugstr_a(str));
+
+ hres = IStream_Write(pStm, str, len, &written);
+ if(FAILED(hres))
+ FIXME("Write failed: %08lx\n", hres);
+
+ mshtml_free(str);
+
+ return S_OK;
}
static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,