From 23b1d3a79df224f14f39278731477ff3ee86f194 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 19 Feb 2018 14:48:44 +0100 Subject: [PATCH] mshtml: Get owner document from Gecko node in get_node. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/mshtml/htmldoc.c | 19 +++++++++++++++++++ dlls/mshtml/htmlnode.c | 18 +++++++++++++++++- dlls/mshtml/mshtml_private.h | 1 + 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 174ef20fc0e..a4e281b39c2 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5205,6 +5205,25 @@ static HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *do return S_OK; } +HRESULT get_document_node(nsIDOMDocument *dom_document, HTMLDocumentNode **ret) +{ + HTMLDOMNode *node; + HRESULT hres; + + hres = get_node(NULL, (nsIDOMNode*)dom_document, FALSE, &node); + if(FAILED(hres)) + return hres; + + if(!node) { + ERR("document not initialized\n"); + return E_FAIL; + } + + assert(node->vtbl == &HTMLDocumentNodeImplVtbl); + *ret = impl_from_HTMLDOMNode(node); + return S_OK; +} + static inline HTMLDocumentObj *impl_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, HTMLDocumentObj, IUnknown_outer); diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 0aad4912b0d..44983bce368 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1616,8 +1616,11 @@ void init_node_cc(void) HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret) { + nsIDOMDocument *dom_document; + HTMLDocumentNode *document; nsISupports *unk = NULL; nsresult nsres; + HRESULT hres; nsres = nsIDOMNode_GetMshtmlNode(nsnode, &unk); assert(nsres == NS_OK); @@ -1633,5 +1636,18 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO return S_OK; } - return create_node(This, nsnode, ret); + nsres = nsIDOMNode_GetOwnerDocument(nsnode, &dom_document); + if(NS_FAILED(nsres) || !dom_document) { + ERR("GetOwnerDocument failed: %08x\n", nsres); + return E_FAIL; + } + + hres = get_document_node(dom_document, &document); + nsIDOMDocument_Release(dom_document); + if(!document) + return E_FAIL; + + hres = create_node(document, nsnode, ret); + htmldoc_release(&document->basedoc); + return hres; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index de200cffd36..cd5b9c332e4 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1074,6 +1074,7 @@ void HTMLFrameBase_destructor(HTMLFrameBase*) DECLSPEC_HIDDEN; HRESULT get_node(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN; HRESULT get_elem(HTMLDocumentNode*,nsIDOMElement*,HTMLElement**) DECLSPEC_HIDDEN; +HRESULT get_document_node(nsIDOMDocument*,HTMLDocumentNode**) DECLSPEC_HIDDEN; HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN; -- 2.11.4.GIT