Module: wine Branch: master Commit: 23b1d3a79df224f14f39278731477ff3ee86f194 URL: https://source.winehq.org/git/wine.git/?a=commit;h=23b1d3a79df224f14f3927873...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Feb 19 14:48:44 2018 +0100
mshtml: Get owner document from Gecko node in get_node.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 174ef20..a4e281b 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 0aad491..44983bc 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 de200cf..cd5b9c3 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;