From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/htmlelem.c | 6 +++--- dlls/mshtml/htmlgeneric.c | 17 +++++++++-------- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/documentmode.js | 2 ++ 4 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index e9ecfc77a65..0cc41bf41a3 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7250,7 +7250,7 @@ dispex_static_data_t HTMLElement_dispex = { .init_info = HTMLElement_init_dispex_info, };
-static dispex_static_data_t HTMLUnknownElement_dispex = { +static dispex_static_data_t LegacyUnknownElement_dispex = { "HTMLUnknownElement", &HTMLElement_event_target_vtbl.dispex_vtbl, DispHTMLUnknownElement_tid, @@ -7325,13 +7325,13 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g if(NS_SUCCEEDED(nsres)) { hres = create_svg_element(doc, svg_element, tag_name, &elem); nsIDOMSVGElement_Release(svg_element); - }else if(use_generic) { + }else 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)); if(elem) { elem->node.vtbl = &HTMLElementImplVtbl; - HTMLElement_Init(elem, doc, nselem, &HTMLUnknownElement_dispex); + HTMLElement_Init(elem, doc, nselem, &LegacyUnknownElement_dispex); hres = S_OK; }else { hres = E_OUTOFMEMORY; diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c index 88237fac403..acd4998832b 100644 --- a/dlls/mshtml/htmlgeneric.c +++ b/dlls/mshtml/htmlgeneric.c @@ -108,18 +108,19 @@ static const event_target_vtbl_t HTMLGenericElement_event_target_vtbl = { .handle_event = HTMLElement_handle_event };
-static const tid_t HTMLGenericElement_iface_tids[] = { +static const tid_t HTMLUnknownElement_iface_tids[] = { HTMLELEMENT_TIDS, IHTMLGenericElement_tid, 0 };
-static dispex_static_data_t HTMLGenericElement_dispex = { - "HTMLUnknownElement", - &HTMLGenericElement_event_target_vtbl.dispex_vtbl, - DispHTMLGenericElement_tid, - HTMLGenericElement_iface_tids, - HTMLElement_init_dispex_info +dispex_static_data_t HTMLUnknownElement_dispex = { + .id = PROT_HTMLUnknownElement, + .prototype_id = PROT_HTMLElement, + .vtbl = &HTMLGenericElement_event_target_vtbl.dispex_vtbl, + .disp_tid = DispHTMLGenericElement_tid, + .iface_tids = HTMLUnknownElement_iface_tids, + .init_info = HTMLElement_init_dispex_info, };
HRESULT HTMLGenericElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTMLElement **elem) @@ -133,7 +134,7 @@ HRESULT HTMLGenericElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, ret->IHTMLGenericElement_iface.lpVtbl = &HTMLGenericElementVtbl; ret->element.node.vtbl = &HTMLGenericElementImplVtbl;
- HTMLElement_Init(&ret->element, doc, nselem, &HTMLGenericElement_dispex); + HTMLElement_Init(&ret->element, doc, nselem, &HTMLUnknownElement_dispex);
*elem = &ret->element; return S_OK; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 0220285ac8e..ff9335be2fe 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -451,6 +451,7 @@ typedef struct { X(HTMLTableRowElement) \ X(HTMLTextAreaElement) \ X(HTMLTitleElement) \ + X(HTMLUnknownElement) \ X(History) \ X(KeyboardEvent) \ X(MSCSSProperties) \ diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index c0c671dfdfa..459ac523239 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3201,6 +3201,8 @@ sync_test("prototypes", function() { check(HTMLTableCellElement.prototype, HTMLElement.prototype, "table cell prototype"); check(document.createElement("textarea"), HTMLTextAreaElement.prototype, "textarea element"); check(HTMLTextAreaElement.prototype, HTMLElement.prototype, "textarea element prototype"); + check(document.createElement("test"), HTMLUnknownElement.prototype, "unknown element"); + check(HTMLUnknownElement.prototype, HTMLElement.prototype, "unknown element prototype"); check(document.createElementNS(svg_ns, "svg"), SVGSVGElement.prototype, "svg:svg element"); check(SVGSVGElement.prototype, SVGElement.prototype, "svg:svg element prototype"); check(SVGElement.prototype, Element.prototype, "svg element prototype");