a70c487450ccd75ecf971a870bdaff9ffdb17831
[reactos.git] / dll / win32 / mshtml / htmlarea.c
1 /*
2 * Copyright 2015 Alex Henrie
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 "mshtml_private.h"
20
21 typedef struct {
22 HTMLElement element;
23
24 IHTMLAreaElement IHTMLAreaElement_iface;
25
26 nsIDOMHTMLAreaElement *nsarea;
27 } HTMLAreaElement;
28
29 static inline HTMLAreaElement *impl_from_IHTMLAreaElement(IHTMLAreaElement *iface)
30 {
31 return CONTAINING_RECORD(iface, HTMLAreaElement, IHTMLAreaElement_iface);
32 }
33
34 static HRESULT WINAPI HTMLAreaElement_QueryInterface(IHTMLAreaElement *iface, REFIID riid, void **ppv)
35 {
36 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
37
38 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
39 }
40
41 static ULONG WINAPI HTMLAreaElement_AddRef(IHTMLAreaElement *iface)
42 {
43 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
44
45 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
46 }
47
48 static ULONG WINAPI HTMLAreaElement_Release(IHTMLAreaElement *iface)
49 {
50 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
51
52 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
53 }
54
55 static HRESULT WINAPI HTMLAreaElement_GetTypeInfoCount(IHTMLAreaElement *iface, UINT *pctinfo)
56 {
57 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
58 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
59 }
60
61 static HRESULT WINAPI HTMLAreaElement_GetTypeInfo(IHTMLAreaElement *iface, UINT iTInfo,
62 LCID lcid, ITypeInfo **ppTInfo)
63 {
64 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
65 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
66 ppTInfo);
67 }
68
69 static HRESULT WINAPI HTMLAreaElement_GetIDsOfNames(IHTMLAreaElement *iface, REFIID riid,
70 LPOLESTR *rgszNames, UINT cNames,
71 LCID lcid, DISPID *rgDispId)
72 {
73 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
74 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
75 cNames, lcid, rgDispId);
76 }
77
78 static HRESULT WINAPI HTMLAreaElement_Invoke(IHTMLAreaElement *iface, DISPID dispIdMember,
79 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
80 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
81 {
82 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
83 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
84 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
85 }
86
87 static HRESULT WINAPI HTMLAreaElement_put_shape(IHTMLAreaElement *iface, BSTR v)
88 {
89 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
90 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
91 return E_NOTIMPL;
92 }
93
94 static HRESULT WINAPI HTMLAreaElement_get_shape(IHTMLAreaElement *iface, BSTR *p)
95 {
96 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
97 FIXME("(%p)->(%p)\n", This, p);
98 return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI HTMLAreaElement_put_coords(IHTMLAreaElement *iface, BSTR v)
102 {
103 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
104 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
105 return E_NOTIMPL;
106 }
107
108 static HRESULT WINAPI HTMLAreaElement_get_coords(IHTMLAreaElement *iface, BSTR *p)
109 {
110 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
111 FIXME("(%p)->(%p)\n", This, p);
112 return E_NOTIMPL;
113 }
114
115 static HRESULT WINAPI HTMLAreaElement_put_href(IHTMLAreaElement *iface, BSTR v)
116 {
117 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
118 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
119 return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI HTMLAreaElement_get_href(IHTMLAreaElement *iface, BSTR *p)
123 {
124 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
125 FIXME("(%p)->(%p)\n", This, p);
126 return E_NOTIMPL;
127 }
128
129 static HRESULT WINAPI HTMLAreaElement_put_target(IHTMLAreaElement *iface, BSTR v)
130 {
131 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
132 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
133 return E_NOTIMPL;
134 }
135
136 static HRESULT WINAPI HTMLAreaElement_get_target(IHTMLAreaElement *iface, BSTR *p)
137 {
138 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
139 FIXME("(%p)->(%p)\n", This, p);
140 return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI HTMLAreaElement_put_alt(IHTMLAreaElement *iface, BSTR v)
144 {
145 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
146 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
147 return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI HTMLAreaElement_get_alt(IHTMLAreaElement *iface, BSTR *p)
151 {
152 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
153 FIXME("(%p)->(%p)\n", This, p);
154 return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI HTMLAreaElement_put_noHref(IHTMLAreaElement *iface, VARIANT_BOOL v)
158 {
159 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
160 FIXME("(%p)->(%i)\n", This, v);
161 return E_NOTIMPL;
162 }
163
164 static HRESULT WINAPI HTMLAreaElement_get_noHref(IHTMLAreaElement *iface, VARIANT_BOOL *p)
165 {
166 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
167 FIXME("(%p)->(%p)\n", This, p);
168 return E_NOTIMPL;
169 }
170
171 static HRESULT WINAPI HTMLAreaElement_put_host(IHTMLAreaElement *iface, BSTR v)
172 {
173 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
174 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
175 return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI HTMLAreaElement_get_host(IHTMLAreaElement *iface, BSTR *p)
179 {
180 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
181 FIXME("(%p)->(%p)\n", This, p);
182 return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI HTMLAreaElement_put_hostname(IHTMLAreaElement *iface, BSTR v)
186 {
187 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
188 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
189 return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI HTMLAreaElement_get_hostname(IHTMLAreaElement *iface, BSTR *p)
193 {
194 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
195 FIXME("(%p)->(%p)\n", This, p);
196 return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI HTMLAreaElement_put_pathname(IHTMLAreaElement *iface, BSTR v)
200 {
201 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
202 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
203 return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI HTMLAreaElement_get_pathname(IHTMLAreaElement *iface, BSTR *p)
207 {
208 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
209 FIXME("(%p)->(%p)\n", This, p);
210 return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI HTMLAreaElement_put_port(IHTMLAreaElement *iface, BSTR v)
214 {
215 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
216 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
217 return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI HTMLAreaElement_get_port(IHTMLAreaElement *iface, BSTR *p)
221 {
222 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
223 FIXME("(%p)->(%p)\n", This, p);
224 return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI HTMLAreaElement_put_protocol(IHTMLAreaElement *iface, BSTR v)
228 {
229 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
230 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
231 return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI HTMLAreaElement_get_protocol(IHTMLAreaElement *iface, BSTR *p)
235 {
236 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
237 FIXME("(%p)->(%p)\n", This, p);
238 return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI HTMLAreaElement_put_search(IHTMLAreaElement *iface, BSTR v)
242 {
243 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
244 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
245 return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI HTMLAreaElement_get_search(IHTMLAreaElement *iface, BSTR *p)
249 {
250 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
251 FIXME("(%p)->(%p)\n", This, p);
252 return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI HTMLAreaElement_put_hash(IHTMLAreaElement *iface, BSTR v)
256 {
257 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
258 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
259 return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI HTMLAreaElement_get_hash(IHTMLAreaElement *iface, BSTR *p)
263 {
264 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
265 FIXME("(%p)->(%p)\n", This, p);
266 return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI HTMLAreaElement_put_onblur(IHTMLAreaElement *iface, VARIANT v)
270 {
271 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
272 FIXME("(%p)->(%p)\n", This, &v);
273 return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI HTMLAreaElement_get_onblur(IHTMLAreaElement *iface, VARIANT *p)
277 {
278 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
279 FIXME("(%p)->(%p)\n", This, p);
280 return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI HTMLAreaElement_put_onfocus(IHTMLAreaElement *iface, VARIANT v)
284 {
285 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
286 FIXME("(%p)->(%p)\n", This, &v);
287 return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI HTMLAreaElement_get_onfocus(IHTMLAreaElement *iface, VARIANT *p)
291 {
292 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
293 FIXME("(%p)->(%p)\n", This, p);
294 return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI HTMLAreaElement_put_tabIndex(IHTMLAreaElement *iface, short v)
298 {
299 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
300 FIXME("(%p)->(%i)\n", This, v);
301 return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI HTMLAreaElement_get_tabIndex(IHTMLAreaElement *iface, short *p)
305 {
306 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
307 FIXME("(%p)->(%p)\n", This, p);
308 return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI HTMLAreaElement_focus(IHTMLAreaElement *iface)
312 {
313 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
314 FIXME("(%p)\n", This);
315 return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLAreaElement_blur(IHTMLAreaElement *iface)
319 {
320 HTMLAreaElement *This = impl_from_IHTMLAreaElement(iface);
321 FIXME("(%p)\n", This);
322 return E_NOTIMPL;
323 }
324
325 static const IHTMLAreaElementVtbl HTMLAreaElementVtbl = {
326 HTMLAreaElement_QueryInterface,
327 HTMLAreaElement_AddRef,
328 HTMLAreaElement_Release,
329 HTMLAreaElement_GetTypeInfoCount,
330 HTMLAreaElement_GetTypeInfo,
331 HTMLAreaElement_GetIDsOfNames,
332 HTMLAreaElement_Invoke,
333 HTMLAreaElement_put_shape,
334 HTMLAreaElement_get_shape,
335 HTMLAreaElement_put_coords,
336 HTMLAreaElement_get_coords,
337 HTMLAreaElement_put_href,
338 HTMLAreaElement_get_href,
339 HTMLAreaElement_put_target,
340 HTMLAreaElement_get_target,
341 HTMLAreaElement_put_alt,
342 HTMLAreaElement_get_alt,
343 HTMLAreaElement_put_noHref,
344 HTMLAreaElement_get_noHref,
345 HTMLAreaElement_put_host,
346 HTMLAreaElement_get_host,
347 HTMLAreaElement_put_hostname,
348 HTMLAreaElement_get_hostname,
349 HTMLAreaElement_put_pathname,
350 HTMLAreaElement_get_pathname,
351 HTMLAreaElement_put_port,
352 HTMLAreaElement_get_port,
353 HTMLAreaElement_put_protocol,
354 HTMLAreaElement_get_protocol,
355 HTMLAreaElement_put_search,
356 HTMLAreaElement_get_search,
357 HTMLAreaElement_put_hash,
358 HTMLAreaElement_get_hash,
359 HTMLAreaElement_put_onblur,
360 HTMLAreaElement_get_onblur,
361 HTMLAreaElement_put_onfocus,
362 HTMLAreaElement_get_onfocus,
363 HTMLAreaElement_put_tabIndex,
364 HTMLAreaElement_get_tabIndex,
365 HTMLAreaElement_focus,
366 HTMLAreaElement_blur
367 };
368
369 static inline HTMLAreaElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
370 {
371 return CONTAINING_RECORD(iface, HTMLAreaElement, element.node);
372 }
373
374 static HRESULT HTMLAreaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
375 {
376 HTMLAreaElement *This = impl_from_HTMLDOMNode(iface);
377
378 *ppv = NULL;
379
380 if(IsEqualGUID(&IID_IHTMLAreaElement, riid)) {
381 TRACE("(%p)->(IID_IHTMLAreaElement %p)\n", This, ppv);
382 *ppv = &This->IHTMLAreaElement_iface;
383 }else {
384 return HTMLElement_QI(&This->element.node, riid, ppv);
385 }
386
387 IUnknown_AddRef((IUnknown*)*ppv);
388 return S_OK;
389 }
390
391 static HRESULT HTMLAreaElement_handle_event(HTMLDOMNode *iface, eventid_t eid, nsIDOMEvent *event, BOOL *prevent_default)
392 {
393 HTMLAreaElement *This = impl_from_HTMLDOMNode(iface);
394 nsAString href_str, target_str;
395 nsresult nsres;
396
397 if(eid == EVENTID_CLICK) {
398 nsAString_Init(&href_str, NULL);
399 nsres = nsIDOMHTMLAreaElement_GetHref(This->nsarea, &href_str);
400 if (NS_FAILED(nsres)) {
401 ERR("Could not get area href: %08x\n", nsres);
402 goto fallback;
403 }
404
405 nsAString_Init(&target_str, NULL);
406 nsres = nsIDOMHTMLAreaElement_GetTarget(This->nsarea, &target_str);
407 if (NS_FAILED(nsres)) {
408 ERR("Could not get area target: %08x\n", nsres);
409 goto fallback;
410 }
411
412 return handle_link_click_event(&This->element, &href_str, &target_str, event, prevent_default);
413
414 fallback:
415 nsAString_Finish(&href_str);
416 nsAString_Finish(&target_str);
417 }
418
419 return HTMLElement_handle_event(&This->element.node, eid, event, prevent_default);
420 }
421
422 static const NodeImplVtbl HTMLAreaElementImplVtbl = {
423 HTMLAreaElement_QI,
424 HTMLElement_destructor,
425 HTMLElement_cpc,
426 HTMLElement_clone,
427 HTMLAreaElement_handle_event,
428 HTMLElement_get_attr_col
429 };
430
431 static const tid_t HTMLAreaElement_iface_tids[] = {
432 HTMLELEMENT_TIDS,
433 IHTMLAreaElement_tid,
434 0
435 };
436 static dispex_static_data_t HTMLAreaElement_dispex = {
437 NULL,
438 DispHTMLAreaElement_tid,
439 NULL,
440 HTMLAreaElement_iface_tids
441 };
442
443 HRESULT HTMLAreaElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
444 {
445 HTMLAreaElement *ret;
446 nsresult nsres;
447
448 ret = heap_alloc_zero(sizeof(HTMLAreaElement));
449 if(!ret)
450 return E_OUTOFMEMORY;
451
452 ret->IHTMLAreaElement_iface.lpVtbl = &HTMLAreaElementVtbl;
453 ret->element.node.vtbl = &HTMLAreaElementImplVtbl;
454
455 HTMLElement_Init(&ret->element, doc, nselem, &HTMLAreaElement_dispex);
456
457 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLAreaElement, (void**)&ret->nsarea);
458 assert(nsres == NS_OK);
459
460 *elem = &ret->element;
461 return S_OK;
462 }