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},