mshtml: Implement HTMLElement's toString.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gabriel Ivăncescu 2021-10-07 16:52:30 +03:00 committed by Alexandre Julliard
parent f7ea38d708
commit a0108b3095
2 changed files with 306 additions and 29 deletions

View File

@ -46,32 +46,119 @@ typedef struct {
HRESULT (*constructor)(HTMLDocumentNode*,nsIDOMElement*,HTMLElement**);
} tag_desc_t;
static HRESULT HTMLElement_Ctor(HTMLDocumentNode*,nsIDOMElement*,HTMLElement**);
static const tag_desc_t tag_descs[] = {
{L"A", HTMLAnchorElement_Create},
{L"AREA", HTMLAreaElement_Create},
{L"BODY", HTMLBodyElement_Create},
{L"BUTTON", HTMLButtonElement_Create},
{L"EMBED", HTMLEmbedElement_Create},
{L"FORM", HTMLFormElement_Create},
{L"FRAME", HTMLFrameElement_Create},
{L"HEAD", HTMLHeadElement_Create},
{L"HTML", HTMLHtmlElement_Create},
{L"IFRAME", HTMLIFrame_Create},
{L"IMG", HTMLImgElement_Create},
{L"INPUT", HTMLInputElement_Create},
{L"LABEL", HTMLLabelElement_Create},
{L"LINK", HTMLLinkElement_Create},
{L"META", HTMLMetaElement_Create},
{L"OBJECT", HTMLObjectElement_Create},
{L"OPTION", HTMLOptionElement_Create},
{L"SCRIPT", HTMLScriptElement_Create},
{L"SELECT", HTMLSelectElement_Create},
{L"STYLE", HTMLStyleElement_Create},
{L"TABLE", HTMLTable_Create},
{L"TD", HTMLTableCell_Create},
{L"TEXTAREA", HTMLTextAreaElement_Create},
{L"TITLE", HTMLTitleElement_Create},
{L"TR", HTMLTableRow_Create}
{L"A", HTMLAnchorElement_Create},
{L"ABBR", HTMLElement_Ctor},
{L"ACRONYM", HTMLElement_Ctor},
{L"ADDRESS", HTMLElement_Ctor},
{L"APPLET", HTMLElement_Ctor},
{L"AREA", HTMLAreaElement_Create},
{L"ARTICLE", HTMLElement_Ctor},
{L"ASIDE", HTMLElement_Ctor},
{L"AUDIO", HTMLElement_Ctor},
{L"B", HTMLElement_Ctor},
{L"BASE", HTMLElement_Ctor},
{L"BASEFONT", HTMLElement_Ctor},
{L"BDO", HTMLElement_Ctor},
{L"BIG", HTMLElement_Ctor},
{L"BLOCKQUOTE", HTMLElement_Ctor},
{L"BODY", HTMLBodyElement_Create},
{L"BR", HTMLElement_Ctor},
{L"BUTTON", HTMLButtonElement_Create},
{L"CANVAS", HTMLElement_Ctor},
{L"CAPTION", HTMLElement_Ctor},
{L"CENTER", HTMLElement_Ctor},
{L"CITE", HTMLElement_Ctor},
{L"CODE", HTMLElement_Ctor},
{L"COL", HTMLElement_Ctor},
{L"COLGROUP", HTMLElement_Ctor},
{L"DATALIST", HTMLElement_Ctor},
{L"DD", HTMLElement_Ctor},
{L"DEL", HTMLElement_Ctor},
{L"DFN", HTMLElement_Ctor},
{L"DIR", HTMLElement_Ctor},
{L"DIV", HTMLElement_Ctor},
{L"DL", HTMLElement_Ctor},
{L"DT", HTMLElement_Ctor},
{L"EM", HTMLElement_Ctor},
{L"EMBED", HTMLEmbedElement_Create},
{L"FIELDSET", HTMLElement_Ctor},
{L"FIGCAPTION", HTMLElement_Ctor},
{L"FIGURE", HTMLElement_Ctor},
{L"FONT", HTMLElement_Ctor},
{L"FOOTER", HTMLElement_Ctor},
{L"FORM", HTMLFormElement_Create},
{L"FRAME", HTMLFrameElement_Create},
{L"FRAMESET", HTMLElement_Ctor},
{L"H1", HTMLElement_Ctor},
{L"H2", HTMLElement_Ctor},
{L"H3", HTMLElement_Ctor},
{L"H4", HTMLElement_Ctor},
{L"H5", HTMLElement_Ctor},
{L"H6", HTMLElement_Ctor},
{L"HEAD", HTMLHeadElement_Create},
{L"HEADER", HTMLElement_Ctor},
{L"HR", HTMLElement_Ctor},
{L"HTML", HTMLHtmlElement_Create},
{L"I", HTMLElement_Ctor},
{L"IFRAME", HTMLIFrame_Create},
{L"IMG", HTMLImgElement_Create},
{L"INPUT", HTMLInputElement_Create},
{L"INS", HTMLElement_Ctor},
{L"KBD", HTMLElement_Ctor},
{L"LABEL", HTMLLabelElement_Create},
{L"LEGEND", HTMLElement_Ctor},
{L"LI", HTMLElement_Ctor},
{L"LINK", HTMLLinkElement_Create},
{L"MAP", HTMLElement_Ctor},
{L"MARK", HTMLElement_Ctor},
{L"META", HTMLMetaElement_Create},
{L"NAV", HTMLElement_Ctor},
{L"NOFRAMES", HTMLElement_Ctor},
{L"NOSCRIPT", HTMLElement_Ctor},
{L"OBJECT", HTMLObjectElement_Create},
{L"OL", HTMLElement_Ctor},
{L"OPTGROUP", HTMLElement_Ctor},
{L"OPTION", HTMLOptionElement_Create},
{L"P", HTMLElement_Ctor},
{L"PARAM", HTMLElement_Ctor},
{L"PRE", HTMLElement_Ctor},
{L"PROGRESS", HTMLElement_Ctor},
{L"Q", HTMLElement_Ctor},
{L"RP", HTMLElement_Ctor},
{L"RT", HTMLElement_Ctor},
{L"RUBY", HTMLElement_Ctor},
{L"S", HTMLElement_Ctor},
{L"SAMP", HTMLElement_Ctor},
{L"SCRIPT", HTMLScriptElement_Create},
{L"SECTION", HTMLElement_Ctor},
{L"SELECT", HTMLSelectElement_Create},
{L"SMALL", HTMLElement_Ctor},
{L"SOURCE", HTMLElement_Ctor},
{L"SPAN", HTMLElement_Ctor},
{L"STRIKE", HTMLElement_Ctor},
{L"STRONG", HTMLElement_Ctor},
{L"STYLE", HTMLStyleElement_Create},
{L"SUB", HTMLElement_Ctor},
{L"SUP", HTMLElement_Ctor},
{L"TABLE", HTMLTable_Create},
{L"TBODY", HTMLElement_Ctor},
{L"TD", HTMLTableCell_Create},
{L"TEXTAREA", HTMLTextAreaElement_Create},
{L"TFOOT", HTMLElement_Ctor},
{L"TH", HTMLElement_Ctor},
{L"THEAD", HTMLElement_Ctor},
{L"TITLE", HTMLTitleElement_Create},
{L"TR", HTMLTableRow_Create},
{L"TRACK", HTMLElement_Ctor},
{L"TT", HTMLElement_Ctor},
{L"U", HTMLElement_Ctor},
{L"UL", HTMLElement_Ctor},
{L"VAR", HTMLElement_Ctor},
{L"VIDEO", HTMLElement_Ctor},
{L"WBR", HTMLElement_Ctor}
};
static const tag_desc_t *get_tag_desc(const WCHAR *tag_name)
@ -2114,8 +2201,21 @@ static HRESULT WINAPI HTMLElement_get_ondragstart(IHTMLElement *iface, VARIANT *
static HRESULT WINAPI HTMLElement_toString(IHTMLElement *iface, BSTR *String)
{
HTMLElement *This = impl_from_IHTMLElement(iface);
FIXME("(%p)->(%p)\n", This, String);
return E_NOTIMPL;
HRESULT hres;
VARIANT var;
TRACE("(%p)->(%p)\n", This, String);
if(!String)
return E_INVALIDARG;
hres = IDispatchEx_InvokeEx(&This->node.event_target.dispex.IDispatchEx_iface, DISPID_VALUE,
LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL);
if(SUCCEEDED(hres)) {
assert(V_VT(&var) == VT_BSTR);
*String = V_BSTR(&var);
}
return hres;
}
static HRESULT WINAPI HTMLElement_put_onbeforeupdate(IHTMLElement *iface, VARIANT v)
@ -6789,6 +6889,14 @@ static dispex_static_data_t HTMLElement_dispex = {
HTMLElement_init_dispex_info
};
static dispex_static_data_t HTMLUnknownElement_dispex = {
L"HTMLUnknownElement",
&HTMLElement_event_target_vtbl.dispex_vtbl,
DispHTMLUnknownElement_tid,
HTMLElement_iface_tids,
HTMLElement_init_dispex_info
};
void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMElement *nselem, dispex_static_data_t *dispex_data)
{
This->IHTMLElement_iface.lpVtbl = &HTMLElementVtbl;
@ -6810,7 +6918,7 @@ void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMElement *n
nsIDOMHTMLElement *html_element;
nsresult nsres;
HTMLDOMNode_Init(doc, &This->node, (nsIDOMNode*)nselem, dispex_data ? dispex_data : &HTMLElement_dispex);
HTMLDOMNode_Init(doc, &This->node, (nsIDOMNode*)nselem, dispex_data ? dispex_data : &HTMLUnknownElement_dispex);
/* No AddRef, share reference with HTMLDOMNode */
assert((nsIDOMNode*)nselem == This->node.nsnode);
@ -6865,7 +6973,7 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g
elem = heap_alloc_zero(sizeof(HTMLElement));
if(elem) {
elem->node.vtbl = &HTMLElementImplVtbl;
HTMLElement_Init(elem, doc, nselem, &HTMLElement_dispex);
HTMLElement_Init(elem, doc, nselem, &HTMLUnknownElement_dispex);
hres = S_OK;
}else {
hres = E_OUTOFMEMORY;
@ -6884,6 +6992,21 @@ HRESULT HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_g
return S_OK;
}
static HRESULT HTMLElement_Ctor(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTMLElement **elem)
{
HTMLElement *ret;
ret = heap_alloc_zero(sizeof(*ret));
if(!ret)
return E_OUTOFMEMORY;
ret->node.vtbl = &HTMLElementImplVtbl;
HTMLElement_Init(ret, doc, nselem, &HTMLElement_dispex);
*elem = ret;
return S_OK;
}
HRESULT get_element(nsIDOMElement *nselem, HTMLElement **ret)
{
HTMLDOMNode *node;

View File

@ -19,6 +19,160 @@
var compat_version;
var tests = [];
sync_test("builtin_toString", function() {
var tags = [
[ "abbr", "Phrase" ],
[ "acronym", "Phrase" ],
[ "address", "Block" ],
// [ "applet", "Applet" ], // makes Windows pop up a dialog box
[ "article", "" ],
[ "aside", "" ],
[ "audio", "Audio" ],
[ "b", "Phrase" ],
[ "base", "Base" ],
[ "basefont", "BaseFont" ],
[ "bdi", "Unknown" ],
[ "bdo", "Phrase" ],
[ "big", "Phrase" ],
[ "blockquote", "Block" ],
[ "body", "Body" ],
[ "br", "BR" ],
[ "button", "Button" ],
[ "canvas", "Canvas" ],
[ "caption", "TableCaption" ],
[ "center", "Block" ],
[ "cite", "Phrase" ],
[ "code", "Phrase" ],
[ "col", "TableCol" ],
[ "colgroup", "TableCol" ],
[ "data", "Unknown" ],
[ "datalist", "DataList", 10 ],
[ "dd", "DD" ],
[ "del", "Mod" ],
[ "details", "Unknown" ],
[ "dfn", "Phrase" ],
[ "dialog", "Unknown" ],
[ "dir", "Directory" ],
[ "div", "Div" ],
[ "dl", "DList" ],
[ "dt", "DT" ],
[ "em", "Phrase" ],
[ "embed", "Embed" ],
[ "fieldset", "FieldSet" ],
[ "figcaption", "" ],
[ "figure", "" ],
[ "font", "Font" ],
[ "footer", "" ],
[ "form", "Form" ],
[ "frame", "Frame" ],
[ "frameset", "FrameSet" ],
[ "h1", "Heading" ],
[ "h2", "Heading" ],
[ "h3", "Heading" ],
[ "h4", "Heading" ],
[ "h5", "Heading" ],
[ "h6", "Heading" ],
[ "h7", "Unknown" ],
[ "head", "Head" ],
[ "header", "" ],
[ "hr", "HR" ],
[ "html", "Html" ],
[ "i", "Phrase" ],
[ "iframe", "IFrame" ],
[ "img", "Image" ],
[ "input", "Input" ],
[ "ins", "Mod" ],
[ "kbd", "Phrase" ],
[ "label", "Label" ],
[ "legend", "Legend" ],
[ "li", "LI" ],
[ "link", "Link" ],
[ "main", "Unknown" ],
[ "map", "Map" ],
[ "mark", "" ],
[ "meta", "Meta" ],
[ "meter", "Unknown" ],
[ "nav", "" ],
[ "noframes", "" ],
[ "noscript", "" ],
[ "object", "Object" ],
[ "ol", "OList" ],
[ "optgroup", "OptGroup" ],
[ "option", "Option" ],
[ "output", "Unknown" ],
[ "p", "Paragraph" ],
[ "param", "Param" ],
[ "picture", "Unknown" ],
[ "pre", "Pre" ],
[ "progress", "Progress", 10 ],
[ "q", "Quote" ],
[ "rp", "Phrase" ],
[ "rt", "Phrase" ],
[ "ruby", "Phrase" ],
[ "s", "Phrase" ],
[ "samp", "Phrase" ],
[ "script", "Script" ],
[ "section", "" ],
[ "select", "Select" ],
[ "small", "Phrase" ],
[ "source", "Source" ],
[ "span", "Span" ],
[ "strike", "Phrase" ],
[ "strong", "Phrase" ],
[ "style", "Style" ],
[ "sub", "Phrase" ],
[ "summary", "Unknown" ],
[ "sup", "Phrase" ],
[ "svg", "Unknown" ],
[ "table", "Table" ],
[ "tbody", "TableSection" ],
[ "td", "TableDataCell" ],
[ "template", "Unknown" ],
[ "textarea", "TextArea" ],
[ "tfoot", "TableSection" ],
[ "th", "TableHeaderCell" ],
[ "thead", "TableSection" ],
[ "time", "Unknown" ],
[ "title", "Title" ],
[ "tr", "TableRow" ],
[ "track", "Track", 10 ],
[ "tt", "Phrase" ],
[ "u", "Phrase" ],
[ "ul", "UList" ],
[ "var", "Phrase" ],
[ "video", "Video" ],
[ "wbr", "" ],
[ "winetest", "Unknown" ]
];
var v = document.documentMode, e;
function test(msg, obj, name, tostr) {
var s;
if(obj.toString) {
s = obj.toString();
todo_wine_if(name !== "HTMLElement" && s === "[object HTMLElement]").
ok(s === (tostr ? tostr : (v < 9 ? "[object]" : "[object " + name + "]")), msg + " toString returned " + s);
}
s = Object.prototype.toString.call(obj);
todo_wine_if(v >= 9 && name != "Object").
ok(s === (v < 9 ? "[object Object]" : "[object " + name + "]"), msg + " Object.toString returned " + s);
}
for(var i = 0; i < tags.length; i++)
if(tags[i].length < 3 || v >= tags[i][2])
test("tag '" + tags[i][0] + "'", document.createElement(tags[i][0]), "HTML" + tags[i][1] + "Element");
e = document.createElement("a");
ok(e.toString() === "", "tag 'a' (without href) toString returned " + e.toString());
e.href = "https://www.winehq.org/";
test("tag 'a'", e, "HTMLAnchorElement", "https://www.winehq.org/");
e = document.createElement("area");
ok(e.toString() === "", "tag 'area' (without href) toString returned " + e.toString());
e.href = "https://www.winehq.org/";
test("tag 'area'", e, "HTMLAreaElement", "https://www.winehq.org/");
});
sync_test("elem_props", function() {
var elem = document.documentElement;