From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlattr.c | 13 +++++++++++-- dlls/mshtml/tests/dom.c | 28 ++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 87ea6f984fd..963909fdc00 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->node.doc->IHTMLDocument2_iface; + IDispatch_AddRef(*p); + return S_OK; }
static HRESULT WINAPI HTMLDOMAttribute2_insertBefore(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *newChild, @@ -373,6 +377,7 @@ static void *HTMLDOMAttribute_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLDOMAttribute_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex); + HTMLDOMNode_traverse(&This->node.event_target.dispex, cb);
if(This->elem) note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); @@ -382,6 +387,7 @@ static void HTMLDOMAttribute_traverse(DispatchEx *dispex, nsCycleCollectionTrave static void HTMLDOMAttribute_unlink(DispatchEx *dispex) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex); + HTMLDOMNode_unlink(&This->node.event_target.dispex);
if(This->elem) { HTMLElement *elem = This->elem; @@ -466,6 +472,9 @@ HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dis } }
+ ret->node.doc = doc; + IHTMLDocument2_AddRef(&doc->IHTMLDocument2_iface); + *attr = ret; return S_OK; } 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);