From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlattr.c | 18 ++++++++++++++++-- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/dom.c | 28 ++++++++++++++++++++++------ 3 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 01d9773c5b4..a5e46c0dd4b 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -273,8 +273,12 @@ static HRESULT WINAPI HTMLDOMAttribute2_get_attributes(IHTMLDOMAttribute2 *iface static HRESULT WINAPI HTMLDOMAttribute2_get_ownerDocument(IHTMLDOMAttribute2 *iface, IDispatch **p) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + *p = (IDispatch*)&This->doc->IHTMLDocument2_iface; + IDispatch_AddRef(*p); + return S_OK; }
static HRESULT WINAPI HTMLDOMAttribute2_insertBefore(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *newChild, @@ -374,6 +378,8 @@ static void HTMLDOMAttribute_traverse(DispatchEx *dispex, nsCycleCollectionTrave { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex);
+ if(This->doc) + note_cc_edge((nsISupports*)&This->doc->node.IHTMLDOMNode_iface, "doc", cb); if(This->elem) note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); traverse_variant(&This->value, "value", cb); @@ -383,6 +389,11 @@ static void HTMLDOMAttribute_unlink(DispatchEx *dispex) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex);
+ if(This->doc) { + HTMLDocumentNode *doc = This->doc; + This->doc = NULL; + IHTMLDOMNode_Release(&doc->node.IHTMLDOMNode_iface); + } if(This->elem) { HTMLElement *elem = This->elem; This->elem = NULL; @@ -466,6 +477,9 @@ HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dis } }
+ ret->doc = doc; + IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); + *attr = ret; return S_OK; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c02f4515c7d..4bee0a26607 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1340,6 +1340,7 @@ typedef struct { /* name must be valid for detached attributes */ WCHAR *name;
+ HTMLDocumentNode *doc; HTMLElement *elem; DISPID dispid; struct list entry; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index a60ede8d21f..4daeb4ff552 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -9944,9 +9944,11 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLWindow2_Release(window); }
-static void test_attr_node(IHTMLDOMAttribute *test_attr) +static void test_attr_node(IHTMLDOMAttribute *test_attr, IHTMLDocument2 *doc) { IHTMLDOMAttribute2 *attr; + IHTMLDocument2 *doc_node; + IHTMLWindow2 *window; IDispatch *disp; HRESULT hres; LONG type; @@ -9962,6 +9964,20 @@ static void test_attr_node(IHTMLDOMAttribute *test_attr) ok(hres == S_OK, "get_attributes failed: %08lx\n", hres); ok(!disp, "attributes != NULL\n");
+ hres = IHTMLDocument2_get_parentWindow(doc, &window); + ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres); + hres = IHTMLWindow2_get_document(window, &doc_node); + ok(hres == S_OK, "get_document failed: %08lx\n", hres); + IHTMLWindow2_Release(window); + + hres = IHTMLDOMAttribute2_get_ownerDocument(attr, &disp); + ok(hres == S_OK, "get_ownerDocument failed: %08lx\n", hres); + ok(disp != NULL, "ownerDocument == NULL\n"); + ok(!iface_cmp((IUnknown*)disp, (IUnknown*)doc), "ownerDocument == doc\n"); + ok(iface_cmp((IUnknown*)disp, (IUnknown*)doc_node), "ownerDocument != doc_node\n"); + IHTMLDocument2_Release(doc_node); + IDispatch_Release(disp); + IHTMLDOMAttribute2_Release(attr); }
@@ -10006,7 +10022,7 @@ static void test_attr(IHTMLDocument2 *doc, IHTMLElement *elem) ok(!lstrcmpW(V_BSTR(&v), L"divid3"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
- test_attr_node(attr); + test_attr_node(attr, doc); IHTMLDOMAttribute_Release(attr);
attr = get_elem_attr_node((IUnknown*)elem, L"emptyattr", TRUE); @@ -10026,7 +10042,7 @@ static void test_attr(IHTMLDocument2 *doc, IHTMLElement *elem) VariantClear(&v);
test_attr_specified(attr, VARIANT_TRUE); - test_attr_node(attr); + test_attr_node(attr, doc); IHTMLDOMAttribute_Release(attr);
V_VT(&v) = VT_I4; @@ -10049,13 +10065,13 @@ static void test_attr(IHTMLDocument2 *doc, IHTMLElement *elem) ok(!lstrcmpW(V_BSTR(&v), L"160"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
- test_attr_node(attr); + test_attr_node(attr, doc); IHTMLDOMAttribute_Release(attr);
attr = get_elem_attr_node((IUnknown*)elem, L"tabIndex", TRUE); test_attr_specified(attr, VARIANT_FALSE); test_attr_expando(attr, VARIANT_FALSE); - test_attr_node(attr); + test_attr_node(attr, doc); IHTMLDOMAttribute_Release(attr);
/* Test created, detached attribute. */ @@ -10127,7 +10143,7 @@ static void test_attr(IHTMLDocument2 *doc, IHTMLElement *elem) test_elem_attr(elem, L"Test", L"new replace value"); test_attr_value(attr, L"new value2"); test_attr_value(attr3, L"new replace value"); - test_attr_node(attr); + test_attr_node(attr, doc);
/* Attached attributes cause errors. */ hres = IHTMLElement4_setAttributeNode(elem4, attr3, &attr2);