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>
This commit is contained in:
Jacek Caban 2018-02-19 14:48:44 +01:00 committed by Alexandre Julliard
parent b5aff99233
commit 23b1d3a79d
3 changed files with 37 additions and 1 deletions

View File

@ -5205,6 +5205,25 @@ static HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *do
return S_OK; 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) static inline HTMLDocumentObj *impl_from_IUnknown(IUnknown *iface)
{ {
return CONTAINING_RECORD(iface, HTMLDocumentObj, IUnknown_outer); return CONTAINING_RECORD(iface, HTMLDocumentObj, IUnknown_outer);

View File

@ -1616,8 +1616,11 @@ void init_node_cc(void)
HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret) HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret)
{ {
nsIDOMDocument *dom_document;
HTMLDocumentNode *document;
nsISupports *unk = NULL; nsISupports *unk = NULL;
nsresult nsres; nsresult nsres;
HRESULT hres;
nsres = nsIDOMNode_GetMshtmlNode(nsnode, &unk); nsres = nsIDOMNode_GetMshtmlNode(nsnode, &unk);
assert(nsres == NS_OK); assert(nsres == NS_OK);
@ -1633,5 +1636,18 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO
return S_OK; 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;
} }

View File

@ -1074,6 +1074,7 @@ void HTMLFrameBase_destructor(HTMLFrameBase*) DECLSPEC_HIDDEN;
HRESULT get_node(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN; HRESULT get_node(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN;
HRESULT get_elem(HTMLDocumentNode*,nsIDOMElement*,HTMLElement**) 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; HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN;