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,