From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 5 +++- dlls/mshtml/htmlattr.c | 42 ++++++++++++++++++++++++++++++- dlls/mshtml/tests/documentmode.js | 35 +++++++++++++++++++++++++- dlls/mshtml/tests/dom.c | 1 + 4 files changed, 80 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 92a3746f4e5..111f3377ff9 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1384,7 +1384,10 @@ HRESULT dispex_get_chain_builtin_id(DispatchEx *dispex, const WCHAR *name, DWORD const dispex_data_t *info = dispex->info; HRESULT hres;
- assert(compat_mode >= COMPAT_MODE_IE9); + hres = get_builtin_id(info, name, flags, pid); + if(hres != DISP_E_UNKNOWNNAME || compat_mode < COMPAT_MODE_IE9) + return hres; + info = info->desc->prototype_info[compat_mode - COMPAT_MODE_IE9];
for(;;) { hres = get_builtin_id(info, name, flags, pid); diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 0816ccefdbe..76c8f7dfa68 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -208,10 +208,50 @@ static HRESULT WINAPI HTMLDOMAttribute2_get_value(IHTMLDOMAttribute2 *iface, BST static HRESULT WINAPI HTMLDOMAttribute2_get_expando(IHTMLDOMAttribute2 *iface, VARIANT_BOOL *p) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface); + const PRUnichar *name; + nsIDOMElement *nselem; + HTMLElement *elem; + nsAString nsname; + nsresult nsres; + HRESULT hres; + DISPID id;
TRACE("(%p)->(%p)\n", This, p);
- *p = variant_bool(!This->dom_attr && This->elem && get_dispid_type(This->dispid) != DISPEXPROP_BUILTIN); + if(This->dom_attr) { + nsres = nsIDOMAttr_GetOwnerElement(This->dom_attr, &nselem); + assert(nsres == NS_OK); + if(!nselem) { + *p = VARIANT_FALSE; + return S_OK; + } + + hres = get_element(nselem, &elem); + nsIDOMElement_Release(nselem); + if(FAILED(hres)) + return hres; + + nsAString_InitDepend(&nsname, NULL); + nsres = nsIDOMAttr_GetName(This->dom_attr, &nsname); + if(NS_FAILED(nsres)) { + IHTMLElement2_Release(&elem->IHTMLElement2_iface); + return map_nsresult(nsres); + } + + nsAString_GetData(&nsname, &name); + hres = dispex_get_chain_builtin_id(&elem->node.event_target.dispex, name, fdexNameCaseInsensitive, &id); + nsAString_Finish(&nsname); + if(SUCCEEDED(hres)) + *p = variant_bool(dispex_builtin_is_noattr(&elem->node.event_target.dispex, id)); + else if(hres == DISP_E_UNKNOWNNAME) { + *p = VARIANT_TRUE; + hres = S_OK; + } + IHTMLElement2_Release(&elem->IHTMLElement2_iface); + return hres; + } + + *p = variant_bool(This->elem && get_dispid_type(This->dispid) != DISPEXPROP_BUILTIN); return S_OK; }
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index ae8212f0c48..13772b52606 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -580,7 +580,16 @@ sync_test("attr_props", function() {
elem.innerHTML = '<span id="test"></span>'; elem = elem.getElementsByTagName("span")[0]; - attr = elem.attributes[0]; + attr = elem.getAttributeNode("id"); + + if(v < 8) + ok(elem.attributes.length > 50, "attributes.length = " + elem.attributes.length); + else { + todo_wine_if(v === 8). + ok(elem.attributes.length === 1, "attributes.length = " + elem.attributes.length); + todo_wine_if(v === 8). + ok(elem.attributes[0] === attr, "attributes[0] != attr"); + }
function test_exposed(prop, expect) { if(expect) @@ -589,6 +598,13 @@ sync_test("attr_props", function() { ok(!(prop in attr), prop + " found in attribute."); }
+ function test_attr(expando, specified) { + var r = attr.expando; + ok(r === expando, attr.name + " attr.expando = " + r); + r = attr.specified; + ok(r === specified, attr.name + " attr.specified = " + r); + } + test_exposed("appendChild", true); test_exposed("attributes", true); test_exposed("childNodes", true); @@ -622,6 +638,23 @@ sync_test("attr_props", function() { test_exposed("specified", true); test_exposed("textContent", v >= 9); test_exposed("value", true); + test_attr(false, true); + + elem.setAttribute("test", "wine"); + elem.setAttribute("z-index", "foobar"); + + attr = elem.getAttributeNode("test"); + test_attr(true, true); + + attr = elem.getAttributeNode("z-index"); + test_attr(true, true); + + attr = elem.getAttributeNode("tabIndex"); + if(v < 8) + test_attr(false, false); + else + todo_wine_if(v === 8). + ok(attr === null, "tabIndex attr not null."); });
sync_test("doc_props", function() { diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 4f22895f3c3..26b487b9175 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -10930,6 +10930,7 @@ static void test_attr(IHTMLDocument2 *doc, IHTMLElement *elem) ok(elem_has_attr((IUnknown*)elem, L"emptyattr"), "elem does not have emptyattr"); attr = get_elem6_attr_node((IUnknown*)elem, L"emptyattr", TRUE); test_attr_specified(attr, VARIANT_TRUE); + test_attr_expando(attr, VARIANT_TRUE); test_attr_node(attr, doc); IHTMLDOMAttribute_Release(attr);