diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index dfa2a8b54aa..9299170067e 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -1930,35 +1930,47 @@ static dispex_static_data_t HTMLDocumentNode_dispex = { HTMLDocumentNode_iface_tids }; +static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLWindow *window) +{ + HTMLDocumentNode *doc; + + doc = heap_alloc_zero(sizeof(HTMLDocumentNode)); + if(!doc) + return NULL; + + doc->ref = 1; + doc->basedoc.doc_node = doc; + doc->basedoc.doc_obj = doc_obj; + doc->basedoc.window = window; + + init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex); + init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex)); + HTMLDocumentNode_SecMgr_Init(doc); + + init_nsevents(doc); + + list_init(&doc->bindings); + list_init(&doc->selection_list); + list_init(&doc->range_list); + + return doc; +} + HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLWindow *window, HTMLDocumentNode **ret) { HTMLDocumentNode *doc; HRESULT hres; - doc = heap_alloc_zero(sizeof(HTMLDocumentNode)); + doc = alloc_doc_node(doc_obj, window); if(!doc) return E_OUTOFMEMORY; - doc->basedoc.doc_node = doc; - doc->basedoc.doc_obj = doc_obj; - - init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex); - init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex)); - HTMLDocumentNode_SecMgr_Init(doc); - doc->ref = 1; - - doc->basedoc.window = window; if(window == doc_obj->basedoc.window) doc->basedoc.cp_container.forward_container = &doc_obj->basedoc.cp_container; nsIDOMHTMLDocument_AddRef(nsdoc); doc->nsdoc = nsdoc; init_mutation(doc); - init_nsevents(doc); - - list_init(&doc->bindings); - list_init(&doc->selection_list); - list_init(&doc->range_list); HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc); doc->node.vtbl = &HTMLDocumentNodeImplVtbl; @@ -1974,6 +1986,23 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob return S_OK; } +HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node, HTMLDocumentNode **ret) +{ + HTMLDocumentNode *doc_frag; + + doc_frag = alloc_doc_node(doc_node->basedoc.doc_obj, doc_node->basedoc.window); + if(!doc_frag) + return E_OUTOFMEMORY; + + HTMLDOMNode_Init(doc_node, &doc_frag->node, nsnode); + doc_frag->node.vtbl = &HTMLDocumentNodeImplVtbl; + doc_frag->node.cp_container = &doc_frag->basedoc.cp_container; + + htmldoc_addref(&doc_frag->basedoc); + *ret = doc_frag; + return S_OK; +} + /********************************************************** * ICustomDoc implementation */ diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c index 8d135ff37d2..550cf5d338e 100644 --- a/dlls/mshtml/htmldoc3.c +++ b/dlls/mshtml/htmldoc3.c @@ -343,8 +343,31 @@ static HRESULT WINAPI HTMLDocument3_createDocumentFragment(IHTMLDocument3 *iface IHTMLDocument2 **ppNewDoc) { HTMLDocument *This = HTMLDOC3_THIS(iface); - FIXME("(%p)->(%p)\n", This, ppNewDoc); - return E_NOTIMPL; + nsIDOMDocumentFragment *doc_frag; + HTMLDocumentNode *docnode; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, ppNewDoc); + + if(!This->doc_node->nsdoc) { + FIXME("NULL nsdoc\n"); + return E_NOTIMPL; + } + + nsres = nsIDOMHTMLDocument_CreateDocumentFragment(This->doc_node->nsdoc, &doc_frag); + if(NS_FAILED(nsres)) { + ERR("CreateDocumentFragment failed: %08x\n", nsres); + return E_FAIL; + } + + hres = create_document_fragment((nsIDOMNode*)doc_frag, This->doc_node, &docnode); + nsIDOMDocumentFragment_Release(doc_frag); + if(FAILED(hres)) + return hres; + + *ppNewDoc = HTMLDOC(&docnode->basedoc); + return S_OK; } static HRESULT WINAPI HTMLDocument3_get_parentDocument(IHTMLDocument3 *iface, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index e99ecfd81e7..5af4247df2e 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -701,6 +701,7 @@ struct HTMLDocumentNode { HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**); HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**); HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**); +HRESULT create_document_fragment(nsIDOMNode*,HTMLDocumentNode*,HTMLDocumentNode**); HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow*,HTMLWindow**); void update_window_doc(HTMLWindow*);