While IHTMLDOMNode_QueryInterface(node, &IID_IHTMLBlockElement) works fine in my local VM with fully updated Windows XP and IE8 it fails under many of testbot VMs, and even adding is_ie9plus check doesn't help. So, instead of checking is_ie9plus I've added a broken() statement.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/mshtml/htmlnode.c | 82 ++++++++++++++++++++++++++++++++++++ dlls/mshtml/main.c | 1 + dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/dom.c | 9 ++++ include/mshtmdid.h | 3 ++ include/mshtml.idl | 18 ++++++++ 6 files changed, 114 insertions(+)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index faffb6bd02..59d3be0ffb 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1390,6 +1390,85 @@ static const IHTMLDOMNode3Vtbl HTMLDOMNode3Vtbl = { HTMLDOMNode3_isSupported };
+static inline HTMLDOMNode *impl_from_IHTMLBlockElement(IHTMLBlockElement *iface) +{ + return CONTAINING_RECORD(iface, HTMLDOMNode, IHTMLBlockElement_iface); +} + +static HRESULT WINAPI HTMLBlockElement_QueryInterface(IHTMLBlockElement *iface, REFIID riid, void **ppv) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IHTMLDOMNode_QueryInterface(&This->IHTMLDOMNode_iface, riid, ppv); +} + +static ULONG WINAPI HTMLBlockElement_AddRef(IHTMLBlockElement *iface) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IHTMLDOMNode_AddRef(&This->IHTMLDOMNode_iface); +} + +static ULONG WINAPI HTMLBlockElement_Release(IHTMLBlockElement *iface) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IHTMLDOMNode_Release(&This->IHTMLDOMNode_iface); +} + +static HRESULT WINAPI HTMLBlockElement_GetTypeInfoCount(IHTMLBlockElement *iface, UINT *pctinfo) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IDispatchEx_GetTypeInfoCount(&This->event_target.dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLBlockElement_GetTypeInfo(IHTMLBlockElement *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IDispatchEx_GetTypeInfo(&This->event_target.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLBlockElement_GetIDsOfNames(IHTMLBlockElement *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IDispatchEx_GetIDsOfNames(&This->event_target.dispex.IDispatchEx_iface, riid, rgszNames, cNames, + lcid, rgDispId); +} + +static HRESULT WINAPI HTMLBlockElement_Invoke(IHTMLBlockElement *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + return IDispatchEx_Invoke(&This->event_target.dispex.IDispatchEx_iface, dispIdMember, riid, lcid, + wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLBlockElement_put_clear(IHTMLBlockElement *iface, BSTR v) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLBlockElement_get_clear(IHTMLBlockElement *iface, BSTR *p) +{ + HTMLDOMNode *This = impl_from_IHTMLBlockElement(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLBlockElementVtbl HTMLBlockElementVtbl = { + HTMLBlockElement_QueryInterface, + HTMLBlockElement_AddRef, + HTMLBlockElement_Release, + HTMLBlockElement_GetTypeInfoCount, + HTMLBlockElement_GetTypeInfo, + HTMLBlockElement_GetIDsOfNames, + HTMLBlockElement_Invoke, + HTMLBlockElement_put_clear, + HTMLBlockElement_get_clear +}; + HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv) { TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); @@ -1404,6 +1483,8 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv) *ppv = &This->IHTMLDOMNode2_iface; }else if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) { *ppv = &This->IHTMLDOMNode3_iface; + }else if(IsEqualGUID(&IID_IHTMLBlockElement, riid)) { + *ppv = &This->IHTMLBlockElement_iface; }else if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) { *ppv = &node_ccp; return S_OK; @@ -1457,6 +1538,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->IHTMLBlockElement_iface.lpVtbl = &HTMLBlockElementVtbl;
ccref_init(&node->ccref, 1); EventTarget_Init(&node->event_target, (IUnknown*)&node->IHTMLDOMNode_iface, dispex_data, doc->document_mode); diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c index 29396a5475..8ce7f8680c 100644 --- a/dlls/mshtml/main.c +++ b/dlls/mshtml/main.c @@ -710,6 +710,7 @@ const char *debugstr_mshtml_guid(const GUID *iid) X(IID_IEnumConnections); X(IID_IEnumVARIANT); X(IID_IHlinkTarget); + X(IID_IHTMLBlockElement); X(IID_IHTMLDocument6); X(IID_IHTMLDocument7); X(IID_IHTMLEditServices); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index a36da94e43..6c25cc828c 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -776,6 +776,7 @@ struct HTMLDOMNode { IHTMLDOMNode IHTMLDOMNode_iface; IHTMLDOMNode2 IHTMLDOMNode2_iface; IHTMLDOMNode3 IHTMLDOMNode3_iface; + IHTMLBlockElement IHTMLBlockElement_iface; const NodeImplVtbl *vtbl;
nsCycleCollectingAutoRefCnt ccref; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 01c6191a6e..320be5b43a 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -8521,6 +8521,7 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElementCollection *col; IHTMLDOMChildrenCollection *child_col; IHTMLElement *elem, *elem2, *elem3; + IHTMLBlockElement *block_elem; IHTMLDOMNode *node, *node2; IHTMLWindow2 *window; IDispatch *disp; @@ -8650,10 +8651,18 @@ static void test_elems(IHTMLDocument2 *doc) node = test_node_get_parent((IUnknown*)elem); ok(node != NULL, "node == NULL\n"); test_node_name((IUnknown*)node, "BODY"); + hres = IHTMLDOMNode_QueryInterface(node, &IID_IHTMLBlockElement, (void**)&block_elem); + ok(hres == S_OK || broken(hres == E_NOINTERFACE), "Could not get IHTMLBlockElement iface: %08x\n", hres); + if (block_elem) + IHTMLBlockElement_Release(block_elem); node2 = test_node_get_parent((IUnknown*)node); IHTMLDOMNode_Release(node); ok(node2 != NULL, "node == NULL\n"); test_node_name((IUnknown*)node2, "HTML"); + hres = IHTMLDOMNode_QueryInterface(node2, &IID_IHTMLBlockElement, (void**)&block_elem); + ok(hres == S_OK || broken(hres == E_NOINTERFACE), "Could not get IHTMLBlockElement iface: %08x\n", hres); + if (block_elem) + IHTMLBlockElement_Release(block_elem); node = test_node_get_parent((IUnknown*)node2); IHTMLDOMNode_Release(node2); ok(node != NULL, "node == NULL\n"); diff --git a/include/mshtmdid.h b/include/mshtmdid.h index 82055f690b..a58b3f9247 100644 --- a/include/mshtmdid.h +++ b/include/mshtmdid.h @@ -3857,6 +3857,9 @@ /* IHTMLLabelElement2 */ #define DISPID_IHTMLLABELELEMENT2_FORM DISPID_LABEL+2
+/* IHTMLBlockElement */ +#define DISPID_IHTMLBLOCKELEMENT_CLEAR DISPID_A_CLEAR + /* IHTMLTxtRange */ #define DISPID_IHTMLTXTRANGE_HTMLTEXT DISPID_RANGE+3 #define DISPID_IHTMLTXTRANGE_TEXT DISPID_RANGE+4 diff --git a/include/mshtml.idl b/include/mshtml.idl index f7ebd9e71a..e90e0018a8 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -28609,6 +28609,24 @@ interface IHTMLDOMConstructorCollection : IDispatch HRESULT XMLHttpRequest([out, retval] IDispatch **p); }
+/***************************************************************************** + * IHTMLBlockElement interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f208-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLBlockElement : IDispatch +{ + [propput, id(DISPID_IHTMLBLOCKELEMENT_CLEAR), displaybind, bindable] + HRESULT clear([in] BSTR v); + + [propget, id(DISPID_IHTMLBLOCKELEMENT_CLEAR), displaybind, bindable] + HRESULT clear([retval, out] BSTR *p); +}; + /***************************************************************************** * IXMLGenericParse interface */