po: Fix trailing full stops errors in the Korean translation.
[wine/multimedia.git] / dlls / mshtml / htmlanchor.c
blob27d39e36df97544a864bdbb7ff913c84908748b9
1 /*
2 * Copyright 2007 Jacek Caban for CodeWeavers
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.
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.
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
19 #include <stdarg.h>
20 #include <stdio.h>
21 #include <assert.h>
23 #define COBJMACROS
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
30 #include "mshtml_private.h"
31 #include "htmlevent.h"
32 #include "binding.h"
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
38 typedef struct {
39 HTMLElement element;
41 IHTMLAnchorElement IHTMLAnchorElement_iface;
43 nsIDOMHTMLAnchorElement *nsanchor;
44 } HTMLAnchorElement;
46 static HRESULT navigate_anchor_window(HTMLAnchorElement *This, const WCHAR *target)
48 nsAString href_str;
49 IUri *uri;
50 nsresult nsres;
51 HRESULT hres;
53 nsAString_Init(&href_str, NULL);
54 nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str);
55 if(NS_SUCCEEDED(nsres)) {
56 const PRUnichar *href;
58 nsAString_GetData(&href_str, &href);
59 hres = create_relative_uri(This->element.node.doc->basedoc.window, href, &uri);
60 }else {
61 ERR("Could not get anchor href: %08x\n", nsres);
62 hres = E_FAIL;
64 nsAString_Finish(&href_str);
65 if(FAILED(hres))
66 return hres;
68 hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL);
69 IUri_Release(uri);
70 return hres;
73 static HRESULT navigate_anchor(HTMLAnchorElement *This)
75 nsAString href_str, target_str;
76 nsresult nsres;
77 HRESULT hres = E_FAIL;
79 static const WCHAR _parentW[] = {'p','a','r','e','n','t',0};
80 static const WCHAR _selfW[] = {'_','s','e','l','f',0};
81 static const WCHAR _topW[] = {'_','t','o','p',0};
83 nsAString_Init(&target_str, NULL);
84 nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str);
85 if(NS_SUCCEEDED(nsres)) {
86 const PRUnichar *target;
88 nsAString_GetData(&target_str, &target);
89 if(*target && strcmpiW(target, _selfW)) {
90 if(strcmpiW(target, _parentW) && strcmpiW(target, _topW)) {
91 hres = navigate_anchor_window(This, target);
92 }else {
93 FIXME("Navigating to target %s is not implemented\n", debugstr_w(target));
94 hres = S_OK;
96 nsAString_Finish(&target_str);
97 return hres;
100 nsAString_Finish(&target_str);
102 nsAString_Init(&href_str, NULL);
103 nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str);
104 if(NS_SUCCEEDED(nsres)) {
105 const PRUnichar *href;
107 nsAString_GetData(&href_str, &href);
108 if(*href) {
109 HTMLWindow *window = This->element.node.doc->basedoc.window;
110 hres = navigate_url(window, href, window->url);
111 }else {
112 TRACE("empty href\n");
113 hres = S_OK;
116 nsAString_Finish(&href_str);
117 return hres;
120 static inline HTMLAnchorElement *impl_from_IHTMLAnchorElement(IHTMLAnchorElement *iface)
122 return CONTAINING_RECORD(iface, HTMLAnchorElement, IHTMLAnchorElement_iface);
125 static HRESULT WINAPI HTMLAnchorElement_QueryInterface(IHTMLAnchorElement *iface,
126 REFIID riid, void **ppv)
128 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
130 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
133 static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface)
135 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
137 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
140 static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface)
142 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
144 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
147 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo)
149 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
150 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
153 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement *iface, UINT iTInfo,
154 LCID lcid, ITypeInfo **ppTInfo)
156 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
157 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
158 ppTInfo);
161 static HRESULT WINAPI HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement *iface, REFIID riid,
162 LPOLESTR *rgszNames, UINT cNames,
163 LCID lcid, DISPID *rgDispId)
165 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
166 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
167 cNames, lcid, rgDispId);
170 static HRESULT WINAPI HTMLAnchorElement_Invoke(IHTMLAnchorElement *iface, DISPID dispIdMember,
171 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
172 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
174 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
175 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
176 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
179 static HRESULT WINAPI HTMLAnchorElement_put_href(IHTMLAnchorElement *iface, BSTR v)
181 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
182 nsAString nsstr;
183 nsresult nsres;
185 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
187 nsAString_InitDepend(&nsstr, v);
188 nsres = nsIDOMHTMLAnchorElement_SetHref(This->nsanchor, &nsstr);
189 nsAString_Finish(&nsstr);
190 if(NS_FAILED(nsres))
191 return E_FAIL;
193 return S_OK;
196 static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
198 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
199 nsAString href_str;
200 nsresult nsres;
201 HRESULT hres;
203 TRACE("(%p)->(%p)\n", This, p);
205 nsAString_Init(&href_str, NULL);
206 nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str);
207 if(NS_SUCCEEDED(nsres)) {
208 const PRUnichar *href;
210 nsAString_GetData(&href_str, &href);
211 hres = nsuri_to_url(href, TRUE, p);
212 }else {
213 ERR("GetHref failed: %08x\n", nsres);
214 hres = E_FAIL;
217 nsAString_Finish(&href_str);
218 return hres;
221 static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v)
223 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
224 nsAString nsstr;
225 nsresult nsres;
227 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
229 nsAString_InitDepend(&nsstr, v);
230 nsres = nsIDOMHTMLAnchorElement_SetTarget(This->nsanchor, &nsstr);
231 nsAString_Finish(&nsstr);
232 if(NS_FAILED(nsres))
233 return E_FAIL;
235 return S_OK;
238 static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p)
240 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
241 nsAString target_str;
242 nsresult nsres;
244 TRACE("(%p)->(%p)\n", This, p);
246 nsAString_Init(&target_str, NULL);
247 nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str);
249 return return_nsstr(nsres, &target_str, p);
252 static HRESULT WINAPI HTMLAnchorElement_put_rel(IHTMLAnchorElement *iface, BSTR v)
254 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
255 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
256 return E_NOTIMPL;
259 static HRESULT WINAPI HTMLAnchorElement_get_rel(IHTMLAnchorElement *iface, BSTR *p)
261 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
262 FIXME("(%p)->(%p)\n", This, p);
263 return E_NOTIMPL;
266 static HRESULT WINAPI HTMLAnchorElement_put_rev(IHTMLAnchorElement *iface, BSTR v)
268 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
269 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
270 return E_NOTIMPL;
273 static HRESULT WINAPI HTMLAnchorElement_get_rev(IHTMLAnchorElement *iface, BSTR *p)
275 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
276 FIXME("(%p)->(%p)\n", This, p);
277 return E_NOTIMPL;
280 static HRESULT WINAPI HTMLAnchorElement_put_urn(IHTMLAnchorElement *iface, BSTR v)
282 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
283 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
284 return E_NOTIMPL;
287 static HRESULT WINAPI HTMLAnchorElement_get_urn(IHTMLAnchorElement *iface, BSTR *p)
289 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
290 FIXME("(%p)->(%p)\n", This, p);
291 return E_NOTIMPL;
294 static HRESULT WINAPI HTMLAnchorElement_put_Methods(IHTMLAnchorElement *iface, BSTR v)
296 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
297 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
298 return E_NOTIMPL;
301 static HRESULT WINAPI HTMLAnchorElement_get_Methods(IHTMLAnchorElement *iface, BSTR *p)
303 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
304 FIXME("(%p)->(%p)\n", This, p);
305 return E_NOTIMPL;
308 static HRESULT WINAPI HTMLAnchorElement_put_name(IHTMLAnchorElement *iface, BSTR v)
310 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
311 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
312 return E_NOTIMPL;
315 static HRESULT WINAPI HTMLAnchorElement_get_name(IHTMLAnchorElement *iface, BSTR *p)
317 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
318 FIXME("(%p)->(%p)\n", This, p);
319 return E_NOTIMPL;
322 static HRESULT WINAPI HTMLAnchorElement_put_host(IHTMLAnchorElement *iface, BSTR v)
324 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
325 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
326 return E_NOTIMPL;
329 static HRESULT WINAPI HTMLAnchorElement_get_host(IHTMLAnchorElement *iface, BSTR *p)
331 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
332 FIXME("(%p)->(%p)\n", This, p);
333 return E_NOTIMPL;
336 static HRESULT WINAPI HTMLAnchorElement_put_hostname(IHTMLAnchorElement *iface, BSTR v)
338 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
339 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
340 return E_NOTIMPL;
343 static HRESULT WINAPI HTMLAnchorElement_get_hostname(IHTMLAnchorElement *iface, BSTR *p)
345 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
346 FIXME("(%p)->(%p)\n", This, p);
347 return E_NOTIMPL;
350 static HRESULT WINAPI HTMLAnchorElement_put_pathname(IHTMLAnchorElement *iface, BSTR v)
352 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
353 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
354 return E_NOTIMPL;
357 static HRESULT WINAPI HTMLAnchorElement_get_pathname(IHTMLAnchorElement *iface, BSTR *p)
359 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
360 FIXME("(%p)->(%p)\n", This, p);
361 return E_NOTIMPL;
364 static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR v)
366 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
367 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
368 return E_NOTIMPL;
371 static HRESULT WINAPI HTMLAnchorElement_get_port(IHTMLAnchorElement *iface, BSTR *p)
373 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
374 FIXME("(%p)->(%p)\n", This, p);
375 return E_NOTIMPL;
378 static HRESULT WINAPI HTMLAnchorElement_put_protocol(IHTMLAnchorElement *iface, BSTR v)
380 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
381 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
382 return E_NOTIMPL;
385 static HRESULT WINAPI HTMLAnchorElement_get_protocol(IHTMLAnchorElement *iface, BSTR *p)
387 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
388 FIXME("(%p)->(%p)\n", This, p);
389 return E_NOTIMPL;
392 static HRESULT WINAPI HTMLAnchorElement_put_search(IHTMLAnchorElement *iface, BSTR v)
394 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
395 FIXME("(%p)->(%p)\n", This, debugstr_w(v));
396 return E_NOTIMPL;
399 static HRESULT WINAPI HTMLAnchorElement_get_search(IHTMLAnchorElement *iface, BSTR *p)
401 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
402 FIXME("(%p)->(%p)\n", This, p);
403 return E_NOTIMPL;
406 static HRESULT WINAPI HTMLAnchorElement_put_hash(IHTMLAnchorElement *iface, BSTR v)
408 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
409 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
410 return E_NOTIMPL;
413 static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR *p)
415 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
416 FIXME("(%p)->(%p)\n", This, p);
417 return E_NOTIMPL;
420 static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v)
422 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
424 TRACE("(%p)->()\n", This);
426 return IHTMLElement2_put_onblur(&This->element.IHTMLElement2_iface, v);
429 static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p)
431 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
433 TRACE("(%p)->(%p)\n", This, p);
435 return IHTMLElement2_get_onblur(&This->element.IHTMLElement2_iface, p);
438 static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v)
440 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
442 TRACE("(%p)->()\n", This);
444 return IHTMLElement2_put_onfocus(&This->element.IHTMLElement2_iface, v);
447 static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p)
449 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
451 TRACE("(%p)->(%p)\n", This, p);
453 return IHTMLElement2_get_onfocus(&This->element.IHTMLElement2_iface, p);
456 static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v)
458 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
460 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
462 return IHTMLElement2_put_accessKey(&This->element.IHTMLElement2_iface, v);
465 static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p)
467 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
469 TRACE("(%p)->(%p)\n", This, p);
471 return IHTMLElement2_get_accessKey(&This->element.IHTMLElement2_iface, p);
474 static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p)
476 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
477 FIXME("(%p)->(%p)\n", This, p);
478 return E_NOTIMPL;
481 static HRESULT WINAPI HTMLAnchorElement_get_mimeType(IHTMLAnchorElement *iface, BSTR *p)
483 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
484 FIXME("(%p)->(%p)\n", This, p);
485 return E_NOTIMPL;
488 static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, BSTR *p)
490 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
491 FIXME("(%p)->(%p)\n", This, p);
492 return E_NOTIMPL;
495 static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v)
497 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
499 TRACE("(%p)->()\n", This);
501 return IHTMLElement2_put_tabIndex(&This->element.IHTMLElement2_iface, v);
504 static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p)
506 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
508 TRACE("(%p)->(%p)\n", This, p);
510 return IHTMLElement2_get_tabIndex(&This->element.IHTMLElement2_iface, p);
513 static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface)
515 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
517 TRACE("(%p)\n", This);
519 return IHTMLElement2_focus(&This->element.IHTMLElement2_iface);
522 static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface)
524 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
526 TRACE("(%p)\n", This);
528 return IHTMLElement2_blur(&This->element.IHTMLElement2_iface);
531 static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl = {
532 HTMLAnchorElement_QueryInterface,
533 HTMLAnchorElement_AddRef,
534 HTMLAnchorElement_Release,
535 HTMLAnchorElement_GetTypeInfoCount,
536 HTMLAnchorElement_GetTypeInfo,
537 HTMLAnchorElement_GetIDsOfNames,
538 HTMLAnchorElement_Invoke,
539 HTMLAnchorElement_put_href,
540 HTMLAnchorElement_get_href,
541 HTMLAnchorElement_put_target,
542 HTMLAnchorElement_get_target,
543 HTMLAnchorElement_put_rel,
544 HTMLAnchorElement_get_rel,
545 HTMLAnchorElement_put_rev,
546 HTMLAnchorElement_get_rev,
547 HTMLAnchorElement_put_urn,
548 HTMLAnchorElement_get_urn,
549 HTMLAnchorElement_put_Methods,
550 HTMLAnchorElement_get_Methods,
551 HTMLAnchorElement_put_name,
552 HTMLAnchorElement_get_name,
553 HTMLAnchorElement_put_host,
554 HTMLAnchorElement_get_host,
555 HTMLAnchorElement_put_hostname,
556 HTMLAnchorElement_get_hostname,
557 HTMLAnchorElement_put_pathname,
558 HTMLAnchorElement_get_pathname,
559 HTMLAnchorElement_put_port,
560 HTMLAnchorElement_get_port,
561 HTMLAnchorElement_put_protocol,
562 HTMLAnchorElement_get_protocol,
563 HTMLAnchorElement_put_search,
564 HTMLAnchorElement_get_search,
565 HTMLAnchorElement_put_hash,
566 HTMLAnchorElement_get_hash,
567 HTMLAnchorElement_put_onblur,
568 HTMLAnchorElement_get_onblur,
569 HTMLAnchorElement_put_onfocus,
570 HTMLAnchorElement_get_onfocus,
571 HTMLAnchorElement_put_accessKey,
572 HTMLAnchorElement_get_accessKey,
573 HTMLAnchorElement_get_protocolLong,
574 HTMLAnchorElement_get_mimeType,
575 HTMLAnchorElement_get_nameProp,
576 HTMLAnchorElement_put_tabIndex,
577 HTMLAnchorElement_get_tabIndex,
578 HTMLAnchorElement_focus,
579 HTMLAnchorElement_blur
582 static inline HTMLAnchorElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
584 return CONTAINING_RECORD(iface, HTMLAnchorElement, element.node);
587 static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
589 HTMLAnchorElement *This = impl_from_HTMLDOMNode(iface);
591 *ppv = NULL;
593 if(IsEqualGUID(&IID_IUnknown, riid)) {
594 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
595 *ppv = &This->IHTMLAnchorElement_iface;
596 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
597 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
598 *ppv = &This->IHTMLAnchorElement_iface;
599 }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) {
600 TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv);
601 *ppv = &This->IHTMLAnchorElement_iface;
604 if(*ppv) {
605 IUnknown_AddRef((IUnknown*)*ppv);
606 return S_OK;
609 return HTMLElement_QI(&This->element.node, riid, ppv);
612 static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
614 HTMLAnchorElement *This = impl_from_HTMLDOMNode(iface);
616 if(This->nsanchor)
617 nsIDOMHTMLAnchorElement_Release(This->nsanchor);
619 HTMLElement_destructor(&This->element.node);
622 static HRESULT HTMLAnchorElement_handle_event(HTMLDOMNode *iface, eventid_t eid, nsIDOMEvent *event, BOOL *prevent_default)
624 HTMLAnchorElement *This = impl_from_HTMLDOMNode(iface);
626 if(eid == EVENTID_CLICK) {
627 nsIDOMMouseEvent *mouse_event;
628 PRUint16 button;
629 nsresult nsres;
631 TRACE("CLICK\n");
633 nsres = nsIDOMEvent_QueryInterface(event, &IID_nsIDOMMouseEvent, (void**)&mouse_event);
634 assert(nsres == NS_OK);
636 nsres = nsIDOMMouseEvent_GetButton(mouse_event, &button);
637 assert(nsres == NS_OK);
639 nsIDOMMouseEvent_Release(mouse_event);
641 switch(button) {
642 case 0:
643 *prevent_default = TRUE;
644 return navigate_anchor(This);
645 case 1:
646 *prevent_default = TRUE;
647 return navigate_anchor_window(This, NULL);
648 default:
649 *prevent_default = FALSE;
650 return S_OK;
654 return S_OK;
657 static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
658 HTMLAnchorElement_QI,
659 HTMLAnchorElement_destructor,
660 HTMLElement_clone,
661 HTMLElement_get_attr_col,
662 NULL,
663 NULL,
664 HTMLAnchorElement_handle_event
667 static const tid_t HTMLAnchorElement_iface_tids[] = {
668 IHTMLAnchorElement_tid,
669 HTMLELEMENT_TIDS,
670 IHTMLTextContainer_tid,
671 IHTMLUniqueName_tid,
675 static dispex_static_data_t HTMLAnchorElement_dispex = {
676 NULL,
677 DispHTMLAnchorElement_tid,
678 NULL,
679 HTMLAnchorElement_iface_tids
682 HRESULT HTMLAnchorElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
684 HTMLAnchorElement *ret;
685 nsresult nsres;
687 ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
688 if(!ret)
689 return E_OUTOFMEMORY;
691 ret->IHTMLAnchorElement_iface.lpVtbl = &HTMLAnchorElementVtbl;
692 ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
694 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLAnchorElement, (void**)&ret->nsanchor);
695 if(NS_FAILED(nsres)) {
696 ERR("Could not get nsIDOMHTMLAnchorElement iface: %08x\n", nsres);
697 heap_free(ret);
698 return E_FAIL;
701 HTMLElement_Init(&ret->element, doc, nselem, &HTMLAnchorElement_dispex);
703 *elem = &ret->element;
704 return S_OK;