[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