diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 24d7b088202..40c8ff574fd 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -53,6 +53,7 @@ static const WCHAR selectW[] = {'S','E','L','E','C','T',0}; static const WCHAR styleW[] = {'S','T','Y','L','E',0}; static const WCHAR tableW[] = {'T','A','B','L','E',0}; static const WCHAR textareaW[] = {'T','E','X','T','A','R','E','A',0}; +static const WCHAR title_tagW[]= {'T','I','T','L','E',0}; static const WCHAR trW[] = {'T','R',0}; typedef struct { @@ -77,6 +78,7 @@ static const tag_desc_t tag_descs[] = { {styleW, HTMLStyleElement_Create}, {tableW, HTMLTable_Create}, {textareaW, HTMLTextAreaElement_Create}, + {title_tagW, HTMLTitleElement_Create}, {trW, HTMLTableRow_Create} }; diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c index eacbcd4733e..181d0dd2781 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -31,6 +31,150 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +typedef struct { + HTMLElement element; + + IHTMLTitleElement IHTMLTitleElement_iface; +} HTMLTitleElement; + +static inline HTMLTitleElement *impl_from_IHTMLTitleElement(IHTMLTitleElement *iface) +{ + return CONTAINING_RECORD(iface, HTMLTitleElement, IHTMLTitleElement_iface); +} + +static HRESULT WINAPI HTMLTitleElement_QueryInterface(IHTMLTitleElement *iface, + REFIID riid, void **ppv) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); +} + +static ULONG WINAPI HTMLTitleElement_AddRef(IHTMLTitleElement *iface) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); +} + +static ULONG WINAPI HTMLTitleElement_Release(IHTMLTitleElement *iface) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); +} + +static HRESULT WINAPI HTMLTitleElement_GetTypeInfoCount(IHTMLTitleElement *iface, UINT *pctinfo) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLTitleElement_GetTypeInfo(IHTMLTitleElement *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid, + ppTInfo); +} + +static HRESULT WINAPI HTMLTitleElement_GetIDsOfNames(IHTMLTitleElement *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames, + cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLTitleElement_Invoke(IHTMLTitleElement *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + + return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid, + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLTitleElement_put_text(IHTMLTitleElement *iface, BSTR v) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLTitleElement_get_text(IHTMLTitleElement *iface, BSTR *p) +{ + HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLTitleElementVtbl HTMLTitleElementVtbl = { + HTMLTitleElement_QueryInterface, + HTMLTitleElement_AddRef, + HTMLTitleElement_Release, + HTMLTitleElement_GetTypeInfoCount, + HTMLTitleElement_GetTypeInfo, + HTMLTitleElement_GetIDsOfNames, + HTMLTitleElement_Invoke, + HTMLTitleElement_put_text, + HTMLTitleElement_get_text +}; + +static inline HTMLTitleElement *HTMLTitleElement_from_HTMLDOMNode(HTMLDOMNode *iface) +{ + return CONTAINING_RECORD(iface, HTMLTitleElement, element.node); +} + +static HRESULT HTMLTitleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +{ + HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface); + + if(IsEqualGUID(&IID_IHTMLTitleElement, riid)) { + TRACE("(%p)->(IID_IHTMLTitleElement %p)\n", This, ppv); + *ppv = &This->IHTMLTitleElement_iface; + }else { + return HTMLElement_QI(&This->element.node, riid, ppv); + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static void HTMLTitleElement_destructor(HTMLDOMNode *iface) +{ + HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface); + + HTMLElement_destructor(&This->element.node); +} + +static const NodeImplVtbl HTMLTitleElementImplVtbl = { + HTMLTitleElement_QI, + HTMLTitleElement_destructor, + HTMLElement_clone, +}; + +HRESULT HTMLTitleElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem) +{ + HTMLTitleElement *ret; + + ret = heap_alloc_zero(sizeof(*ret)); + if(!ret) + return E_OUTOFMEMORY; + + ret->IHTMLTitleElement_iface.lpVtbl = &HTMLTitleElementVtbl; + ret->element.node.vtbl = &HTMLTitleElementImplVtbl; + + HTMLElement_Init(&ret->element, doc, nselem, NULL); + + *elem = &ret->element; + return S_OK; +} + typedef struct { HTMLElement element; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 0b0b6b03e75..1e6b13911b0 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -793,6 +793,7 @@ HRESULT HTMLSelectElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElemen HRESULT HTMLTable_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLTableRow_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLTextAreaElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; +HRESULT HTMLTitleElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; HRESULT HTMLGenericElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLElement**) DECLSPEC_HIDDEN; void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index a637a3f7afd..da890a0133b 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -288,6 +288,13 @@ static const IID * const head_iids[] = { NULL }; +static const IID * const title_iids[] = { + ELEM_IFACES, + &IID_IHTMLTitleElement, + &IID_IConnectionPointContainer, + NULL +}; + static const IID * const object_iids[] = { ELEM_IFACES, &IID_IHTMLObjectElement, @@ -369,7 +376,7 @@ static const elem_type_info_t elem_type_infos[] = { {"", none_iids, NULL}, {"HTML", elem_iids, NULL}, {"HEAD", head_iids, &DIID_DispHTMLHeadElement}, - {"TITLE", elem_iids, NULL}, + {"TITLE", title_iids, NULL}, {"BODY", body_iids, &DIID_DispHTMLBody}, {"A", anchor_iids, &DIID_DispHTMLAnchorElement}, {"INPUT", input_iids, &DIID_DispHTMLInputElement},