From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 10 ++++----- dlls/mshtml/htmlnode.c | 31 ++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/mshtml_private_iface.idl | 15 +++++++++++++- dlls/mshtml/tests/documentmode.js | 4 ++-- 5 files changed, 54 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index dd8b58eacf2..0c6640f2b40 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6668,18 +6668,18 @@ static HRESULT IHTMLElement6_setAttribute_hook(DispatchEx *dispex, WORD flags, D
void HTMLElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode) { - static const dispex_hook_t elem6_ie9_hooks[] = { - {DISPID_IHTMLELEMENT6_SETATTRIBUTENS, IHTMLElement6_setAttributeNS_hook}, - {DISPID_UNKNOWN} - }; static const dispex_hook_t elem6_ie10_hooks[] = { {DISPID_IHTMLELEMENT6_HASATTRIBUTENS, IHTMLElement6_hasAttributeNS_hook}, {DISPID_IHTMLELEMENT6_GETATTRIBUTENS, IHTMLElement6_getAttributeNS_hook}, - {DISPID_IHTMLELEMENT6_SETATTRIBUTENS, IHTMLElement6_setAttributeNS_hook}, {DISPID_IHTMLELEMENT6_REMOVEATTRIBUTENS, IHTMLElement6_removeAttributeNS_hook}, {DISPID_IHTMLELEMENT6_IE9_SETATTRIBUTE, IHTMLElement6_setAttribute_hook}, + + /* IE9+ */ + {DISPID_IHTMLELEMENT6_SETATTRIBUTENS, IHTMLElement6_setAttributeNS_hook}, + {DISPID_IHTMLELEMENT6_IE9_HASATTRIBUTES, NULL}, {DISPID_UNKNOWN} }; + const dispex_hook_t *const elem6_ie9_hooks = elem6_ie10_hooks + 4; static const dispex_hook_t elem_ie9_hooks[] = { {DISPID_IHTMLELEMENT_TOSTRING, NULL}, {DISPID_UNKNOWN} diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 7df7b5bdc6a..aa498fa7fbb 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1191,6 +1191,33 @@ static const IHTMLDOMNode3Vtbl HTMLDOMNode3Vtbl = { HTMLDOMNode3_isSupported };
+static inline HTMLDOMNode *impl_from_IWineHTMLDOMNodePrivate(IWineHTMLDOMNodePrivate *iface) +{ + return CONTAINING_RECORD(iface, HTMLDOMNode, IWineHTMLDOMNodePrivate_iface); +} + +DISPEX_IDISPATCH_IMPL(HTMLDOMNode_private, IWineHTMLDOMNodePrivate, impl_from_IWineHTMLDOMNodePrivate(iface)->event_target.dispex) + +static HRESULT WINAPI HTMLDOMNode_private_get_hasAttributes(IWineHTMLDOMNodePrivate *iface, VARIANT_BOOL *p) +{ + HTMLDOMNode *This = impl_from_IWineHTMLDOMNodePrivate(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IWineHTMLDOMNodePrivateVtbl HTMLDOMNode_private_vtbl = { + HTMLDOMNode_private_QueryInterface, + HTMLDOMNode_private_AddRef, + HTMLDOMNode_private_Release, + HTMLDOMNode_private_GetTypeInfoCount, + HTMLDOMNode_private_GetTypeInfo, + HTMLDOMNode_private_GetIDsOfNames, + HTMLDOMNode_private_Invoke, + HTMLDOMNode_private_get_hasAttributes, +}; + static inline HTMLDOMNode *HTMLDOMNode_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, HTMLDOMNode, event_target.dispex); @@ -1210,6 +1237,8 @@ void *HTMLDOMNode_query_interface(DispatchEx *dispex, REFIID riid) return &This->IHTMLDOMNode2_iface; if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) return &This->IHTMLDOMNode3_iface; + if(IsEqualGUID(&IID_IWineHTMLDOMNodePrivate, riid)) + return &This->IWineHTMLDOMNodePrivate_iface;
return EventTarget_query_interface(&This->event_target, riid); } @@ -1265,6 +1294,7 @@ void HTMLDOMNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode) if(mode >= COMPAT_MODE_IE9) { dispex_info_add_interface(info, IHTMLDOMNode2_tid, NULL); dispex_info_add_interface(info, IHTMLDOMNode3_tid, NULL); + dispex_info_add_interface(info, IWineHTMLDOMNodePrivate_tid, NULL); }
EventTarget_init_dispex_info(info, mode); @@ -1284,6 +1314,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode_iface.lpVtbl = &HTMLDOMNodeVtbl; node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl; + node->IWineHTMLDOMNodePrivate_iface.lpVtbl = &HTMLDOMNode_private_vtbl;
init_event_target(&node->event_target, dispex_data, doc->script_global);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1d41949aca6..d82a3106b12 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -300,6 +300,7 @@ typedef struct ScriptHost ScriptHost; #define PRIVATE_TID_LIST \ XIID(IWineDOMTokenList) \ XIID(IWineHTMLCharacterData) \ + XIID(IWineHTMLDOMNodePrivate) \ XIID(IWineHTMLElementPrivate) \ XIID(IWineHTMLWindowPrivate) \ XIID(IWineHTMLWindowCompatPrivate) \ @@ -1012,6 +1013,7 @@ struct HTMLDOMNode { IHTMLDOMNode IHTMLDOMNode_iface; IHTMLDOMNode2 IHTMLDOMNode2_iface; IHTMLDOMNode3 IHTMLDOMNode3_iface; + IWineHTMLDOMNodePrivate IWineHTMLDOMNodePrivate_iface; const NodeImplVtbl *vtbl;
nsIDOMNode *nsnode; diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index e32687329f9..73cf4f1c4df 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -149,6 +149,19 @@ interface IWineHTMLWindowCompatPrivate : IDispatch HRESULT performance([out, retval] VARIANT *p); }
+[ + odl, + oleautomation, + dual, + hidden, + uuid(465908fd-f394-489f-b7a3-4c00fbbe9eea) +] +interface IWineHTMLDOMNodePrivate : IDispatch +{ + [propget, id(1)] + HRESULT hasAttributes([retval, out] VARIANT_BOOL *p); +} + [ odl, oleautomation, @@ -185,7 +198,7 @@ interface IWineHTMLCharacterData : IDispatch ] interface IWineHTMLElementPrivate : IDispatch { - [propget, id(1)] + [propget, id(32)] HRESULT classList([retval, out] IDispatch **class_list); }
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index b444726d3b5..6c6b1b6b684 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3746,7 +3746,7 @@ sync_test("prototype props", function() { "uniqueID", "uniqueNumber" ], [ ["addBehavior",11], ["addFilter",10], ["all",11], ["behaviorUrns",11], ["dataset",11], ["document",10], ["draggable",10], ["filters",10], - "getExpression", "hasAttributes", ["hidden",11], ["msGetInputContext",11], "normalize", ["onafterupdate",11], ["onbeforeeditfocus",11], + "getExpression", ["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], @@ -3786,7 +3786,7 @@ sync_test("prototype props", function() { "DOCUMENT_POSITION_CONTAINED_BY", "DOCUMENT_POSITION_CONTAINS", "DOCUMENT_POSITION_DISCONNECTED", "DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", "DOCUMENT_POSITION_PRECEDING", "DOCUMENT_TYPE_NODE", "ELEMENT_NODE", "ENTITY_NODE", "ENTITY_REFERENCE_NODE", "NOTATION_NODE", - "PROCESSING_INSTRUCTION_NODE", "TEXT_NODE", "hasAttributes", "normalize" + "PROCESSING_INSTRUCTION_NODE", "TEXT_NODE", "normalize" ]); if(v >= 11) check(PageTransitionEvent, [ "persisted" ]);