mshtml: Fixed attribute object caching logic.
[wine] / dlls / mshtml / htmlhead.c
1  /*
2  * Copyright 2011 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29
30 #include "mshtml_private.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 typedef struct {
35     HTMLElement element;
36
37     IHTMLTitleElement IHTMLTitleElement_iface;
38 } HTMLTitleElement;
39
40 static inline HTMLTitleElement *impl_from_IHTMLTitleElement(IHTMLTitleElement *iface)
41 {
42     return CONTAINING_RECORD(iface, HTMLTitleElement, IHTMLTitleElement_iface);
43 }
44
45 static HRESULT WINAPI HTMLTitleElement_QueryInterface(IHTMLTitleElement *iface,
46                                                          REFIID riid, void **ppv)
47 {
48     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
49
50     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
51 }
52
53 static ULONG WINAPI HTMLTitleElement_AddRef(IHTMLTitleElement *iface)
54 {
55     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
56
57     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
58 }
59
60 static ULONG WINAPI HTMLTitleElement_Release(IHTMLTitleElement *iface)
61 {
62     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
63
64     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
65 }
66
67 static HRESULT WINAPI HTMLTitleElement_GetTypeInfoCount(IHTMLTitleElement *iface, UINT *pctinfo)
68 {
69     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
70
71     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
72 }
73
74 static HRESULT WINAPI HTMLTitleElement_GetTypeInfo(IHTMLTitleElement *iface, UINT iTInfo,
75         LCID lcid, ITypeInfo **ppTInfo)
76 {
77     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
78
79     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
80             ppTInfo);
81 }
82
83 static HRESULT WINAPI HTMLTitleElement_GetIDsOfNames(IHTMLTitleElement *iface, REFIID riid,
84         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
85 {
86     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
87
88     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
89             cNames, lcid, rgDispId);
90 }
91
92 static HRESULT WINAPI HTMLTitleElement_Invoke(IHTMLTitleElement *iface, DISPID dispIdMember,
93         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
94         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
95 {
96     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
97
98     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
99             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
100 }
101
102 static HRESULT WINAPI HTMLTitleElement_put_text(IHTMLTitleElement *iface, BSTR v)
103 {
104     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
105     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI HTMLTitleElement_get_text(IHTMLTitleElement *iface, BSTR *p)
110 {
111     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
112     FIXME("(%p)->(%p)\n", This, p);
113     return E_NOTIMPL;
114 }
115
116 static const IHTMLTitleElementVtbl HTMLTitleElementVtbl = {
117     HTMLTitleElement_QueryInterface,
118     HTMLTitleElement_AddRef,
119     HTMLTitleElement_Release,
120     HTMLTitleElement_GetTypeInfoCount,
121     HTMLTitleElement_GetTypeInfo,
122     HTMLTitleElement_GetIDsOfNames,
123     HTMLTitleElement_Invoke,
124     HTMLTitleElement_put_text,
125     HTMLTitleElement_get_text
126 };
127
128 static inline HTMLTitleElement *HTMLTitleElement_from_HTMLDOMNode(HTMLDOMNode *iface)
129 {
130     return CONTAINING_RECORD(iface, HTMLTitleElement, element.node);
131 }
132
133 static HRESULT HTMLTitleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
134 {
135     HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface);
136
137     if(IsEqualGUID(&IID_IHTMLTitleElement, riid)) {
138         TRACE("(%p)->(IID_IHTMLTitleElement %p)\n", This, ppv);
139         *ppv = &This->IHTMLTitleElement_iface;
140     }else {
141         return HTMLElement_QI(&This->element.node, riid, ppv);
142     }
143
144     IUnknown_AddRef((IUnknown*)*ppv);
145     return S_OK;
146 }
147
148 static void HTMLTitleElement_destructor(HTMLDOMNode *iface)
149 {
150     HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface);
151
152     HTMLElement_destructor(&This->element.node);
153 }
154
155 static const NodeImplVtbl HTMLTitleElementImplVtbl = {
156     HTMLTitleElement_QI,
157     HTMLTitleElement_destructor,
158     HTMLElement_clone,
159     HTMLElement_handle_event,
160     HTMLElement_get_attr_col
161 };
162
163 static const tid_t HTMLTitleElement_iface_tids[] = {
164     HTMLELEMENT_TIDS,
165     IHTMLTitleElement_tid,
166     0
167 };
168 static dispex_static_data_t HTMLTitleElement_dispex = {
169     NULL,
170     DispHTMLTitleElement_tid,
171     NULL,
172     HTMLTitleElement_iface_tids
173 };
174
175 HRESULT HTMLTitleElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
176 {
177     HTMLTitleElement *ret;
178
179     ret = heap_alloc_zero(sizeof(*ret));
180     if(!ret)
181         return E_OUTOFMEMORY;
182
183     ret->IHTMLTitleElement_iface.lpVtbl = &HTMLTitleElementVtbl;
184     ret->element.node.vtbl = &HTMLTitleElementImplVtbl;
185
186     HTMLElement_Init(&ret->element, doc, nselem, &HTMLTitleElement_dispex);
187
188     *elem = &ret->element;
189     return S_OK;
190 }
191
192 typedef struct {
193     HTMLElement element;
194
195     IHTMLHeadElement IHTMLHeadElement_iface;
196 } HTMLHeadElement;
197
198 static inline HTMLHeadElement *impl_from_IHTMLHeadElement(IHTMLHeadElement *iface)
199 {
200     return CONTAINING_RECORD(iface, HTMLHeadElement, IHTMLHeadElement_iface);
201 }
202
203 static HRESULT WINAPI HTMLHeadElement_QueryInterface(IHTMLHeadElement *iface,
204                                                          REFIID riid, void **ppv)
205 {
206     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
207
208     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
209 }
210
211 static ULONG WINAPI HTMLHeadElement_AddRef(IHTMLHeadElement *iface)
212 {
213     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
214
215     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
216 }
217
218 static ULONG WINAPI HTMLHeadElement_Release(IHTMLHeadElement *iface)
219 {
220     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
221
222     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
223 }
224
225 static HRESULT WINAPI HTMLHeadElement_GetTypeInfoCount(IHTMLHeadElement *iface, UINT *pctinfo)
226 {
227     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
228
229     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
230 }
231
232 static HRESULT WINAPI HTMLHeadElement_GetTypeInfo(IHTMLHeadElement *iface, UINT iTInfo,
233                                               LCID lcid, ITypeInfo **ppTInfo)
234 {
235     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
236
237     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
238             ppTInfo);
239 }
240
241 static HRESULT WINAPI HTMLHeadElement_GetIDsOfNames(IHTMLHeadElement *iface, REFIID riid,
242                                                 LPOLESTR *rgszNames, UINT cNames,
243                                                 LCID lcid, DISPID *rgDispId)
244 {
245     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
246
247     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
248             cNames, lcid, rgDispId);
249 }
250
251 static HRESULT WINAPI HTMLHeadElement_Invoke(IHTMLHeadElement *iface, DISPID dispIdMember,
252                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
253                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
254 {
255     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
256
257     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
258             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
259 }
260
261 static HRESULT WINAPI HTMLHeadElement_put_profile(IHTMLHeadElement *iface, BSTR v)
262 {
263     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
264     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI HTMLHeadElement_get_profile(IHTMLHeadElement *iface, BSTR *p)
269 {
270     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
271     FIXME("(%p)->(%p)\n", This, p);
272     return E_NOTIMPL;
273 }
274
275 static const IHTMLHeadElementVtbl HTMLHeadElementVtbl = {
276     HTMLHeadElement_QueryInterface,
277     HTMLHeadElement_AddRef,
278     HTMLHeadElement_Release,
279     HTMLHeadElement_GetTypeInfoCount,
280     HTMLHeadElement_GetTypeInfo,
281     HTMLHeadElement_GetIDsOfNames,
282     HTMLHeadElement_Invoke,
283     HTMLHeadElement_put_profile,
284     HTMLHeadElement_get_profile
285 };
286
287 static inline HTMLHeadElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
288 {
289     return CONTAINING_RECORD(iface, HTMLHeadElement, element.node);
290 }
291
292 static HRESULT HTMLHeadElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
293 {
294     HTMLHeadElement *This = impl_from_HTMLDOMNode(iface);
295
296     if(IsEqualGUID(&IID_IHTMLHeadElement, riid)) {
297         TRACE("(%p)->(IID_IHTMLHeadElement %p)\n", This, ppv);
298         *ppv = &This->IHTMLHeadElement_iface;
299     }else {
300         return HTMLElement_QI(&This->element.node, riid, ppv);
301     }
302
303     IUnknown_AddRef((IUnknown*)*ppv);
304     return S_OK;
305 }
306
307 static void HTMLHeadElement_destructor(HTMLDOMNode *iface)
308 {
309     HTMLHeadElement *This = impl_from_HTMLDOMNode(iface);
310
311     HTMLElement_destructor(&This->element.node);
312 }
313
314 static const NodeImplVtbl HTMLHeadElementImplVtbl = {
315     HTMLHeadElement_QI,
316     HTMLHeadElement_destructor,
317     HTMLElement_clone,
318     HTMLElement_handle_event,
319     HTMLElement_get_attr_col
320 };
321
322 static const tid_t HTMLHeadElement_iface_tids[] = {
323     HTMLELEMENT_TIDS,
324     IHTMLHeadElement_tid,
325     0
326 };
327 static dispex_static_data_t HTMLHeadElement_dispex = {
328     NULL,
329     DispHTMLHeadElement_tid,
330     NULL,
331     HTMLHeadElement_iface_tids
332 };
333
334 HRESULT HTMLHeadElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
335 {
336     HTMLHeadElement *ret;
337
338     ret = heap_alloc_zero(sizeof(*ret));
339     if(!ret)
340         return E_OUTOFMEMORY;
341
342     ret->IHTMLHeadElement_iface.lpVtbl = &HTMLHeadElementVtbl;
343     ret->element.node.vtbl = &HTMLHeadElementImplVtbl;
344
345     HTMLElement_Init(&ret->element, doc, nselem, &HTMLHeadElement_dispex);
346
347     *elem = &ret->element;
348     return S_OK;
349 }