Module: wine Branch: master Commit: baf9db63ed8f248c5674e408438dc6f28d70102d URL: http://source.winehq.org/git/wine.git/?a=commit;h=baf9db63ed8f248c5674e40843...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Mar 31 14:51:08 2016 +0200
mshtml: Added HTMLHtmlElement object implementation.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/htmlelem.c | 2 + dlls/mshtml/htmlhead.c | 184 +++++++++++++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 3 + dlls/mshtml/tests/dom.c | 11 ++- 4 files changed, 198 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index ce1ed8a..ac077f7 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -46,6 +46,7 @@ static const WCHAR embedW[] = {'E','M','B','E','D',0}; static const WCHAR formW[] = {'F','O','R','M',0}; static const WCHAR frameW[] = {'F','R','A','M','E',0}; static const WCHAR headW[] = {'H','E','A','D',0}; +static const WCHAR htmlW[] = {'H','T','M','L',0}; static const WCHAR iframeW[] = {'I','F','R','A','M','E',0}; static const WCHAR imgW[] = {'I','M','G',0}; static const WCHAR inputW[] = {'I','N','P','U','T',0}; @@ -81,6 +82,7 @@ static const tag_desc_t tag_descs[] = { {formW, HTMLFormElement_Create}, {frameW, HTMLFrameElement_Create}, {headW, HTMLHeadElement_Create}, + {htmlW, HTMLHtmlElement_Create}, {iframeW, HTMLIFrame_Create}, {imgW, HTMLImgElement_Create}, {inputW, HTMLInputElement_Create}, diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c index e64568c..fab6fa5 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "mshtmdid.h"
#include "wine/debug.h"
@@ -193,6 +194,189 @@ HRESULT HTMLTitleElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem typedef struct { HTMLElement element;
+ IHTMLHtmlElement IHTMLHtmlElement_iface; +} HTMLHtmlElement; + +static inline HTMLHtmlElement *impl_from_IHTMLHtmlElement(IHTMLHtmlElement *iface) +{ + return CONTAINING_RECORD(iface, HTMLHtmlElement, IHTMLHtmlElement_iface); +} + +static HRESULT WINAPI HTMLHtmlElement_QueryInterface(IHTMLHtmlElement *iface, + REFIID riid, void **ppv) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); +} + +static ULONG WINAPI HTMLHtmlElement_AddRef(IHTMLHtmlElement *iface) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); +} + +static ULONG WINAPI HTMLHtmlElement_Release(IHTMLHtmlElement *iface) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); +} + +static HRESULT WINAPI HTMLHtmlElement_GetTypeInfoCount(IHTMLHtmlElement *iface, UINT *pctinfo) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLHtmlElement_GetTypeInfo(IHTMLHtmlElement *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid, + ppTInfo); +} + +static HRESULT WINAPI HTMLHtmlElement_GetIDsOfNames(IHTMLHtmlElement *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames, + cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLHtmlElement_Invoke(IHTMLHtmlElement *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + + return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid, + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLHtmlElement_put_version(IHTMLHtmlElement *iface, BSTR v) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLHtmlElement_get_version(IHTMLHtmlElement *iface, BSTR *p) +{ + HTMLHtmlElement *This = impl_from_IHTMLHtmlElement(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLHtmlElementVtbl HTMLHtmlElementVtbl = { + HTMLHtmlElement_QueryInterface, + HTMLHtmlElement_AddRef, + HTMLHtmlElement_Release, + HTMLHtmlElement_GetTypeInfoCount, + HTMLHtmlElement_GetTypeInfo, + HTMLHtmlElement_GetIDsOfNames, + HTMLHtmlElement_Invoke, + HTMLHtmlElement_put_version, + HTMLHtmlElement_get_version +}; + +static inline HTMLHtmlElement *HTMLHtmlElement_from_HTMLDOMNode(HTMLDOMNode *iface) +{ + return CONTAINING_RECORD(iface, HTMLHtmlElement, element.node); +} + +static HRESULT HTMLHtmlElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +{ + HTMLHtmlElement *This = HTMLHtmlElement_from_HTMLDOMNode(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + + if(IsEqualGUID(&IID_IHTMLHtmlElement, riid)) + *ppv = &This->IHTMLHtmlElement_iface; + else + return HTMLElement_QI(&This->element.node, riid, ppv); + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static void HTMLHtmlElement_destructor(HTMLDOMNode *iface) +{ + HTMLHtmlElement *This = HTMLHtmlElement_from_HTMLDOMNode(iface); + + HTMLElement_destructor(&This->element.node); +} + +static BOOL HTMLHtmlElement_is_settable(HTMLDOMNode *iface, DISPID dispid) +{ + switch(dispid) { + case DISPID_IHTMLELEMENT_OUTERTEXT: + return FALSE; + default: + return TRUE; + } +} + +static const NodeImplVtbl HTMLHtmlElementImplVtbl = { + HTMLHtmlElement_QI, + HTMLHtmlElement_destructor, + HTMLElement_cpc, + HTMLElement_clone, + HTMLElement_handle_event, + HTMLElement_get_attr_col, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + HTMLHtmlElement_is_settable +}; + +static const tid_t HTMLHtmlElement_iface_tids[] = { + HTMLELEMENT_TIDS, + IHTMLHtmlElement_tid, + 0 +}; +static dispex_static_data_t HTMLHtmlElement_dispex = { + NULL, + DispHTMLHtmlElement_tid, + NULL, + HTMLHtmlElement_iface_tids +}; + +HRESULT HTMLHtmlElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem) +{ + HTMLHtmlElement *ret; + + ret = heap_alloc_zero(sizeof(*ret)); + if(!ret) + return E_OUTOFMEMORY; + + ret->IHTMLHtmlElement_iface.lpVtbl = &HTMLHtmlElementVtbl; + ret->element.node.vtbl = &HTMLHtmlElementImplVtbl; + + HTMLElement_Init(&ret->element, doc, nselem, &HTMLHtmlElement_dispex); + + *elem = &ret->element; + return S_OK; +} + +typedef struct { + HTMLElement element; + IHTMLHeadElement IHTMLHeadElement_iface; } HTMLHeadElement;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index fe69487..9fe8a75 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -94,6 +94,7 @@ typedef struct event_target_t event_target_t; XDIID(DispHTMLGenericElement) \ XDIID(DispHTMLFrameElement) \ XDIID(DispHTMLHeadElement) \ + XDIID(DispHTMLHtmlElement) \ XDIID(DispHTMLHistory) \ XDIID(DispHTMLIFrame) \ XDIID(DispHTMLImg) \ @@ -162,6 +163,7 @@ typedef struct event_target_t event_target_t; XIID(IHTMLFrameElement3) \ XIID(IHTMLGenericElement) \ XIID(IHTMLHeadElement) \ + XIID(IHTMLHtmlElement) \ XIID(IHTMLIFrameElement) \ XIID(IHTMLIFrameElement2) \ XIID(IHTMLIFrameElement3) \ @@ -968,6 +970,7 @@ HRESULT HTMLEmbedElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement HRESULT HTMLFormElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLFrameElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLHeadElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; +HRESULT HTMLHtmlElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLIFrame_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLStyleElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLImgElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 81fbad9..9e8d8b5 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -328,6 +328,13 @@ static const IID * const frame_iids[] = { NULL };
+static const IID * const html_iids[] = { + ELEM_IFACES, + &IID_IHTMLHtmlElement, + &IID_IConnectionPointContainer, + NULL +}; + static const IID * const head_iids[] = { ELEM_IFACES, &IID_IHTMLHeadElement, @@ -449,7 +456,7 @@ typedef struct {
static const elem_type_info_t elem_type_infos[] = { {"", none_iids, NULL}, - {"HTML", elem_iids, NULL}, + {"HTML", html_iids, &DIID_DispHTMLHtmlElement}, {"HEAD", head_iids, &DIID_DispHTMLHeadElement}, {"TITLE", title_iids, &DIID_DispHTMLTitleElement}, {"BODY", body_iids, &DIID_DispHTMLBody}, @@ -6353,7 +6360,7 @@ static void test_doc_elem(IHTMLDocument2 *doc)
test_node_name((IUnknown*)elem, "HTML"); test_elem_tag((IUnknown*)elem, "HTML"); - todo_wine test_elem_set_outertext_fail(elem); + test_elem_set_outertext_fail(elem);
doc_node = get_doc_node(doc); owner_doc = get_owner_doc((IUnknown*)elem);