From: Gabriel Ivăncescu gabrielopcode@gmail.com
Instead of HTMLElement.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 28 +++++++++- dlls/mshtml/htmlelem.c | 93 +++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/documentmode.js | 56 +++++++++++++++++++ 4 files changed, 175 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index f0a69c8734c..823b7283d7a 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -438,7 +438,8 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc, } }
-static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo, const dispex_hook_t *hooks) +static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo, const dispex_hook_t *hooks, + const DISPID *allow_list) { unsigned i = 7; /* skip IDispatch functions */ ITypeInfo *typeinfo; @@ -451,6 +452,7 @@ static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp
while(1) { const dispex_hook_t *hook = NULL; + const DISPID *dispid = NULL;
hres = ITypeInfo_GetFuncDesc(typeinfo, i++, &funcdesc); if(FAILED(hres)) @@ -465,6 +467,17 @@ static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp hook = NULL; }
+ if(allow_list) { + for(dispid = allow_list; *dispid != DISPID_UNKNOWN; dispid++) { + if(*dispid == funcdesc->memid) + break; + } + if(*dispid == DISPID_UNKNOWN) { + ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc); + continue; + } + } + if(!hook || hook->invoke || hook->name) { add_func_info(data, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo, hook ? hook->invoke : NULL, hook ? hook->name : NULL); @@ -480,7 +493,16 @@ void dispex_info_add_interface(dispex_data_t *info, tid_t tid, const dispex_hook { HRESULT hres;
- hres = process_interface(info, tid, NULL, hooks); + hres = process_interface(info, tid, NULL, hooks, NULL); + if(FAILED(hres)) + ERR("process_interface failed: %08lx\n", hres); +} + +void dispex_info_add_dispids(dispex_data_t *info, tid_t tid, const DISPID *dispids) +{ + HRESULT hres; + + hres = process_interface(info, tid, NULL, NULL, dispids); if(FAILED(hres)) ERR("process_interface failed: %08lx\n", hres); } @@ -574,7 +596,7 @@ static dispex_data_t *preprocess_dispex_data(dispex_static_data_t *desc, compat_
if(desc->iface_tids) { for(tid = desc->iface_tids; *tid; tid++) { - hres = process_interface(data, *tid, dti, NULL); + hres = process_interface(data, *tid, dti, NULL, NULL); if(FAILED(hres)) break; } diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 72aeaae816e..117417b3e7c 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7236,9 +7236,102 @@ static const IWineHTMLElementPrivateVtbl WineHTMLElementPrivateVtbl = { htmlelement_private_get_classList, };
+static void Element_init_dispex_info(dispex_data_t *info, compat_mode_t mode) +{ + static const DISPID elem_dispids[] = { + DISPID_IHTMLELEMENT_SETATTRIBUTE, + DISPID_IHTMLELEMENT_GETATTRIBUTE, + DISPID_IHTMLELEMENT_REMOVEATTRIBUTE, + DISPID_IHTMLELEMENT_TAGNAME, + DISPID_UNKNOWN + }; + static const DISPID elem2_dispids[] = { + DISPID_IHTMLELEMENT2_GETCLIENTRECTS, + DISPID_IHTMLELEMENT2_GETBOUNDINGCLIENTRECT, + DISPID_IHTMLELEMENT2_CLIENTHEIGHT, + DISPID_IHTMLELEMENT2_CLIENTWIDTH, + DISPID_IHTMLELEMENT2_CLIENTTOP, + DISPID_IHTMLELEMENT2_CLIENTLEFT, + DISPID_IHTMLELEMENT2_SCROLLHEIGHT, + DISPID_IHTMLELEMENT2_SCROLLWIDTH, + DISPID_IHTMLELEMENT2_SCROLLTOP, + DISPID_IHTMLELEMENT2_SCROLLLEFT, + DISPID_IHTMLELEMENT2_GETELEMENTSBYTAGNAME, + DISPID_UNKNOWN + }; + static const DISPID elem3_pre_ie11_dispids[] = { + DISPID_IHTMLELEMENT3_FIREEVENT, + DISPID_UNKNOWN + }; + static const DISPID elem4_dispids[] = { + DISPID_IHTMLELEMENT4_GETATTRIBUTENODE, + DISPID_IHTMLELEMENT4_SETATTRIBUTENODE, + DISPID_IHTMLELEMENT4_REMOVEATTRIBUTENODE, + DISPID_UNKNOWN + }; + static const DISPID elem6_dispids[] = { + DISPID_IHTMLELEMENT6_GETATTRIBUTENS, + DISPID_IHTMLELEMENT6_SETATTRIBUTENS, + DISPID_IHTMLELEMENT6_REMOVEATTRIBUTENS, + DISPID_IHTMLELEMENT6_GETATTRIBUTENODENS, + DISPID_IHTMLELEMENT6_SETATTRIBUTENODENS, + DISPID_IHTMLELEMENT6_HASATTRIBUTENS, + DISPID_IHTMLELEMENT6_IE9_GETATTRIBUTE, + DISPID_IHTMLELEMENT6_IE9_SETATTRIBUTE, + DISPID_IHTMLELEMENT6_IE9_REMOVEATTRIBUTE, + DISPID_IHTMLELEMENT6_IE9_GETATTRIBUTENODE, + DISPID_IHTMLELEMENT6_IE9_SETATTRIBUTENODE, + DISPID_IHTMLELEMENT6_IE9_REMOVEATTRIBUTENODE, + DISPID_IHTMLELEMENT6_IE9_HASATTRIBUTE, + DISPID_IHTMLELEMENT6_GETELEMENTSBYTAGNAMENS, + DISPID_IHTMLELEMENT6_IE9_TAGNAME, + DISPID_IHTMLELEMENT6_MSMATCHESSELECTOR, + DISPID_UNKNOWN + }; + static const DISPID elem7_dispids[] = { + DISPID_IHTMLELEMENT7_ONMSPOINTERDOWN, + DISPID_IHTMLELEMENT7_ONMSPOINTERMOVE, + DISPID_IHTMLELEMENT7_ONMSPOINTERUP, + DISPID_IHTMLELEMENT7_ONMSPOINTEROVER, + DISPID_IHTMLELEMENT7_ONMSPOINTEROUT, + DISPID_IHTMLELEMENT7_ONMSPOINTERCANCEL, + DISPID_IHTMLELEMENT7_ONMSLOSTPOINTERCAPTURE, + DISPID_IHTMLELEMENT7_ONMSGOTPOINTERCAPTURE, + DISPID_IHTMLELEMENT7_ONMSGESTURESTART, + DISPID_IHTMLELEMENT7_ONMSGESTURECHANGE, + DISPID_IHTMLELEMENT7_ONMSGESTUREEND, + DISPID_IHTMLELEMENT7_ONMSGESTUREHOLD, + DISPID_IHTMLELEMENT7_ONMSGESTURETAP, + DISPID_IHTMLELEMENT7_ONMSGESTUREDOUBLETAP, + DISPID_IHTMLELEMENT7_ONMSINERTIASTART, + DISPID_IHTMLELEMENT7_MSSETPOINTERCAPTURE, + DISPID_IHTMLELEMENT7_MSRELEASEPOINTERCAPTURE, + DISPID_UNKNOWN + }; + static const DISPID elem7_ie10_dispids[] = { + DISPID_IHTMLELEMENT7_ONMSPOINTERHOVER, + DISPID_UNKNOWN + }; + + dispex_info_add_dispids(info, IHTMLElement2_tid, elem2_dispids); + dispex_info_add_dispids(info, IHTMLElement6_tid, elem6_dispids); + if(mode >= COMPAT_MODE_IE10) { + dispex_info_add_dispids(info, IHTMLElement7_tid, elem7_dispids); + if(mode == COMPAT_MODE_IE10) + dispex_info_add_dispids(info, IHTMLElement7_tid, elem7_ie10_dispids); + } + if(mode <= COMPAT_MODE_IE10) + dispex_info_add_dispids(info, IHTMLElement3_tid, elem3_pre_ie11_dispids); + dispex_info_add_dispids(info, IHTMLElement_tid, elem_dispids); + dispex_info_add_dispids(info, IHTMLElement4_tid, elem4_dispids); + dispex_info_add_interface(info, IElementSelector_tid, NULL); + dispex_info_add_interface(info, IElementTraversal_tid, NULL); +} + dispex_static_data_t Element_dispex = { .id = PROT_Element, .prototype_id = PROT_Node, + .init_info = Element_init_dispex_info, };
dispex_static_data_t HTMLElement_dispex = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 881049c6cd3..9e2bdf38681 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -625,6 +625,7 @@ void release_typelib(void); HRESULT get_class_typeinfo(const CLSID*,ITypeInfo**); const void *dispex_get_vtbl(DispatchEx*); void dispex_info_add_interface(dispex_data_t*,tid_t,const dispex_hook_t*); +void dispex_info_add_dispids(dispex_data_t*,tid_t,const DISPID*); compat_mode_t dispex_compat_mode(DispatchEx*); HRESULT dispex_to_string(DispatchEx*,BSTR*); HRESULT dispex_call_builtin(DispatchEx *dispex, DISPID id, DISPPARAMS *dp, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 2cd4623f06e..2e3848349a1 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3692,11 +3692,67 @@ sync_test("prototype props", function() { check(CSSStyleRule, [ "readOnly", "selectorText", "style" ]); check(CustomEvent, [ "detail", "initCustomEvent" ]); check(DocumentType, [ "entities", "internalSubset", "name", "notations", "publicId", "systemId" ]); + check(Element, [ + "childElementCount", "clientHeight", "clientLeft", "clientTop", "clientWidth", ["fireEvent",9,10], "firstElementChild", + "getAttribute", "getAttributeNS", "getAttributeNode", "getAttributeNodeNS", "getBoundingClientRect", "getClientRects", + "getElementsByTagName", "getElementsByTagNameNS", "hasAttribute", "hasAttributeNS", "lastElementChild", + ["msContentZoomFactor",10], ["msGetRegionContent",10], ["msGetUntransformedBounds",11], "msMatchesSelector", + ["msRegionOverflow",10], ["msReleasePointerCapture",10], ["msRequestFullscreen",11], ["msSetPointerCapture",10], + ["msZoomTo",11], "nextElementSibling", ["ongotpointercapture",11], ["onlostpointercapture",11], ["onmsgesturechange",10], + ["onmsgesturedoubletap",10], ["onmsgestureend",10], ["onmsgesturehold",10], ["onmsgesturestart",10], ["onmsgesturetap",10], + ["onmsgotpointercapture",10], ["onmsinertiastart",10], ["onmslostpointercapture",10], ["onmspointercancel",10], + ["onmspointerdown",10], ["onmspointerenter",11], ["onmspointerhover",10,10], ["onmspointerleave",11], ["onmspointermove",10], + ["onmspointerout",10], ["onmspointerover",10], ["onmspointerup",10], ["onpointercancel",11], ["onpointerdown",11], + ["onpointerenter",11], ["onpointerleave",11], ["onpointermove",11], ["onpointerout",11], ["onpointerover",11], + ["onpointerup",11], "previousElementSibling", "querySelector", "querySelectorAll", ["releasePointerCapture",11], + "removeAttribute", "removeAttributeNS", "removeAttributeNode", "scrollHeight", "scrollLeft", "scrollTop", "scrollWidth", + "setAttribute", "setAttributeNS", "setAttributeNode", "setAttributeNodeNS", ["setPointerCapture",11], "tagName" + ], [ + ["msContentZoomFactor",10], ["msGetRegionContent",10], ["msGetUntransformedBounds",11], ["msRegionOverflow",10], + ["msRequestFullscreen",11], ["msZoomTo",11], ["ongotpointercapture",11], ["onlostpointercapture",11], + ["onmspointerenter",11], ["onmspointerleave",11], ["onpointercancel",11], ["onpointerdown",11], ["onpointerenter",11], + ["onpointerleave",11], ["onpointermove",11], ["onpointerout",11], ["onpointerover",11], ["onpointerup",11], + ["releasePointerCapture",11], ["setPointerCapture",11] + ]); check(Event, [ "AT_TARGET", "BUBBLING_PHASE", "CAPTURING_PHASE", "bubbles", "cancelBubble", "cancelable", "currentTarget", "defaultPrevented", "eventPhase", "initEvent", "isTrusted", "preventDefault", "srcElement", "stopImmediatePropagation", "stopPropagation", "target", "timeStamp", "type" ], [ "AT_TARGET", "BUBBLING_PHASE", "CAPTURING_PHASE" ]); + check(HTMLElement, [ + "accessKey", ["addBehavior",9,10], ["addFilter",9,9], ["all",9,10], "applyElement", ["attachEvent",9,10], ["behaviorUrns",9,10], "blur", + "canHaveChildren", "canHaveHTML", "children", ["classList",10], "className", "clearAttributes", "click", "componentFromPoint", "contains", + "contentEditable", "createControlRange", "currentStyle", ["dataset",11], ["detachEvent",9,10], "dir", "disabled", ["doScroll",9,10], + ["document",9,9], "dragDrop", ["draggable",10], ["filters",9,9], "focus", "getAdjacentText", "getElementsByClassName", ["hidden",11], + "hideFocus", "id", "innerHTML", "innerText", "insertAdjacentElement", "insertAdjacentHTML", "insertAdjacentText", "isContentEditable", + "isDisabled", "isMultiLine", "isTextEdit", "lang", "language", "mergeAttributes", ["msGetInputContext",11], "offsetHeight", "offsetLeft", + "offsetParent", "offsetTop", "offsetWidth", "onabort", "onactivate", ["onafterupdate",9,10], "onbeforeactivate", "onbeforecopy", + "onbeforecut", "onbeforedeactivate", ["onbeforeeditfocus",9,10], "onbeforepaste", ["onbeforeupdate",9,10], "onblur", "oncanplay", + "oncanplaythrough", ["oncellchange",9,10], "onchange", "onclick", "oncontextmenu", ["oncontrolselect",9,10], "oncopy", ["oncuechange",10], + "oncut", ["ondataavailable",9,10], ["ondatasetchanged",9,10], ["ondatasetcomplete",9,10], "ondblclick", "ondeactivate", "ondrag", + "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", + ["onerrorupdate",9,10], ["onfilterchange",9,10], "onfocus", "onfocusin", "onfocusout", "onhelp", "oninput", "onkeydown", "onkeypress", + "onkeyup", ["onlayoutcomplete",9,10], "onload", "onloadeddata", "onloadedmetadata", "onloadstart", ["onlosecapture",9,10], + "onmousedown", "onmouseenter", "onmouseleave", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmousewheel", ["onmove",9,10], + ["onmoveend",9,10], ["onmovestart",9,10], ["onmscontentzoom",10], ["onmsmanipulationstatechanged",10], "onpaste", "onpause", "onplay", + "onplaying", "onprogress", ["onpropertychange",9,10], "onratechange", ["onreadystatechange",9,10], "onreset", ["onresize",9,10], + ["onresizeend",9,10], ["onresizestart",9,10], ["onrowenter",9,10], ["onrowexit",9,10], ["onrowsdelete",9,10], ["onrowsinserted",9,10], + "onscroll", "onseeked", "onseeking", "onselect", "onselectstart", "onstalled", "onsubmit", "onsuspend", "ontimeupdate", "onvolumechange", + "onwaiting", "outerHTML", "outerText", "parentElement", "parentTextEdit", ["readyState",9,10], "recordNumber", "releaseCapture", + ["removeBehavior",9,10], ["removeFilter",9,9], "removeNode", "replaceAdjacentText", "replaceNode", "runtimeStyle", ["scopeName",9,9], + "scrollIntoView", "setActive", "setCapture", "sourceIndex", ["spellcheck",10], "style", "swapNode", "tabIndex", ["tagUrn",9,9], "title", + "uniqueID", "uniqueNumber" + ], [ + ["addBehavior",11], ["addFilter",10], ["all",11], ["behaviorUrns",11], ["dataset",11], ["document",10], ["draggable",10], ["filters",10], + ["fireEvent",11], "getExpression", "hasAttributes", ["hidden",11], ["msGetInputContext",11], "normalize", ["onafterupdate",11], + ["onbeforeeditfocus",11], ["onbeforeupdate",11], ["oncellchange",11], ["oncontrolselect",11], ["ondataavailable",11], ["ondatasetchanged",11], + ["ondatasetcomplete",11], ["onerrorupdate",11], ["onfilterchange",11], ["oninvalid",10], ["onlayoutcomplete",11], ["onlosecapture",11], + ["onmove",11], ["onmoveend",11], ["onmovestart",11], ["onmsanimationend",10], ["onmsanimationiteration",10], ["onmsanimationstart",10], + ["onmscontentzoom",10], ["onmspointerhover",11], ["onmstransitionend",10], ["onmstransitionstart",10], "onpage", ["onpropertychange",11], + ["onreadystatechange",11], ["onresize",11], ["onresizeend",11], ["onresizestart",11], ["onrowenter",11], ["onrowexit",11], + ["onrowsdelete",11], ["onrowsinserted",11], ["removeBehavior",11], "removeExpression", ["removeFilter",10], ["scopeName",10], "setExpression", + ["tagUrn",10], "toString", ["xmsAcceleratorKey",10] + ]); check(HTMLUnknownElement, [ "namedRecordset", "recordset" ]); check(KeyboardEvent, [ "DOM_KEY_LOCATION_JOYSTICK", "DOM_KEY_LOCATION_LEFT", "DOM_KEY_LOCATION_MOBILE",