Jacek Caban : mshtml: Added IHTMLDocument3:: createDocumentFragment implementation.
Alexandre Julliard
julliard at winehq.org
Mon Nov 15 13:28:48 CST 2010
Module: wine
Branch: master
Commit: d9aacfd989199fee4a69c4c08564993ee52bfc99
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d9aacfd989199fee4a69c4c08564993ee52bfc99
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Nov 14 14:42:20 2010 +0100
mshtml: Added IHTMLDocument3::createDocumentFragment implementation.
---
dlls/mshtml/htmldoc.c | 49 +++++++++++++++++++++++++++++++++--------
dlls/mshtml/htmldoc3.c | 27 +++++++++++++++++++++-
dlls/mshtml/mshtml_private.h | 1 +
3 files changed, 65 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index dfa2a8b..9299170 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
};
-HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLWindow *window, HTMLDocumentNode **ret)
+static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLWindow *window)
{
HTMLDocumentNode *doc;
- HRESULT hres;
doc = heap_alloc_zero(sizeof(HTMLDocumentNode));
if(!doc)
- return E_OUTOFMEMORY;
+ 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);
- doc->ref = 1;
- doc->basedoc.window = window;
+ 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 = alloc_doc_node(doc_obj, window);
+ if(!doc)
+ return E_OUTOFMEMORY;
+
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 8d135ff..550cf5d 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 e99ecfd..5af4247 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*);
More information about the wine-cvs
mailing list