[PATCH 3/4] mshtml: Add IHTMLBlockElement interface stub.
Dmitry Timoshkov
dmitry at baikal.ru
Tue Jun 18 01:10:27 CDT 2019
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 at 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
*/
--
2.20.1
More information about the wine-devel
mailing list