From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 35 ++++++++++++++++++++++++------- dlls/mshtml/tests/documentmode.js | 1 + dlls/mshtml/tests/es5.js | 10 +++++++++ 3 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index fe57bc0dfef..354f521697c 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7524,6 +7524,8 @@ static void Element_init_dispex_info(dispex_data_t *info, compat_mode_t mode) DISPID_UNKNOWN };
+ HTMLDOMNode_init_dispex_info(info, mode); + dispex_info_add_dispids(info, IHTMLElement2_tid, elem2_dispids); dispex_info_add_dispids(info, IHTMLElement6_tid, elem6_dispids); if(mode >= COMPAT_MODE_IE10) { @@ -7542,6 +7544,7 @@ static void Element_init_dispex_info(dispex_data_t *info, compat_mode_t mode) dispex_static_data_t Element_dispex = { .id = OBJID_Element, .prototype_id = OBJID_Node, + .vtbl = &HTMLElement_event_target_vtbl.dispex_vtbl, .init_info = Element_init_dispex_info, };
@@ -7598,6 +7601,8 @@ void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMElement *n
HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_generic, HTMLElement **ret) { + nsIDOMHTMLElement *nshtmlelem; + nsIDOMSVGElement *svg_element; nsIDOMElement *nselem; nsAString tag_name_str; const PRUnichar *tag_name; @@ -7617,17 +7622,32 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g
nsAString_GetData(&tag_name_str, &tag_name);
+ /* Check this first, as Gecko treats svg elements as non-HTML */ + nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMSVGElement, (void**)&svg_element); + if(NS_SUCCEEDED(nsres)) { + hres = create_svg_element(doc, svg_element, tag_name, &elem); + nsIDOMSVGElement_Release(svg_element); + goto done; + } + + nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMHTMLElement, (void**)&nshtmlelem); + if(NS_FAILED(nsres)) { + if(!(elem = calloc(1, sizeof(HTMLElement)))) + hres = E_OUTOFMEMORY; + else { + elem->node.vtbl = &HTMLElementImplVtbl; + HTMLElement_Init(elem, doc, nselem, &Element_dispex); + hres = S_OK; + } + goto done; + } + nsIDOMHTMLElement_Release(nshtmlelem); + tag = get_tag_desc(tag_name); if(tag) { hres = tag->constructor(doc, nselem, &elem); }else { - nsIDOMSVGElement *svg_element; - - nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMSVGElement, (void**)&svg_element); - if(NS_SUCCEEDED(nsres)) { - hres = create_svg_element(doc, svg_element, tag_name, &elem); - nsIDOMSVGElement_Release(svg_element); - }else if(use_generic || dispex_compat_mode(&doc->node.event_target.dispex) >= COMPAT_MODE_IE9) { + if(use_generic || dispex_compat_mode(&doc->node.event_target.dispex) >= COMPAT_MODE_IE9) { hres = HTMLGenericElement_Create(doc, nselem, &elem); }else { elem = calloc(1, sizeof(HTMLElement)); @@ -7641,6 +7661,7 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g } }
+done: TRACE("%s ret %p\n", debugstr_w(tag_name), elem);
nsIDOMElement_Release(nselem); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 6a90f9f7a8b..dd228ee1bae 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3861,6 +3861,7 @@ sync_test("prototypes", function() { check(window.navigator, Navigator.prototype, "navigator"); check(Navigator.prototype, Object.prototype, "navigator prototype"); check(document.body, HTMLBodyElement.prototype, "body element"); + check(new DOMParser().parseFromString("<tag>foobar</tag>", "text/xml").getElementsByTagName("tag")[0], Element.prototype, "xml element"); check(HTMLBodyElement.prototype, HTMLElement.prototype, "body prototype"); check(HTMLElement.prototype, Element.prototype, "html element prototype"); check(Element.prototype, Node.prototype, "element prototype"); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 02f72586d26..3dfb6458655 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2884,8 +2884,18 @@ sync_test("DOMParser", function() { r = r[0]; todo_wine. ok(r === xml.childNodes[0], "anchor of XML document with mime type " + m + " = " + r); + r = Object.prototype.toString.call(xml.getElementsByTagName("a")[0]); + todo_wine. + ok(r === "[object HTMLAnchorElement]", "element's Object.toString of XML document with mime type " + m + " = " + r); }else { ok(r.length === 0, "anchors.length of XML document with mime type " + m + " = " + r.length); + r = Object.getPrototypeOf(xml.getElementsByTagName("a")[0]); + ok(r === Element.prototype, "element's prototype of XML document with mime type " + m + " = " + r); + r = document.importNode(xml.childNodes[0], true); + ok(r.nodeName === "a", "imported node name of XML document with mime type " + m + " = " + r.nodeName); + ok(r.nodeValue === null, "imported node value of XML document with mime type " + m + " = " + r.nodeValue); + r = Object.getPrototypeOf(r); + ok(r === Element.prototype, "imported node's prototype of XML document with mime type " + m + " = " + r); } }