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 "mshtml_private.h"
24 IHTMLAnchorElement IHTMLAnchorElement_iface
;
26 nsIDOMHTMLAnchorElement
*nsanchor
;
29 static HRESULT
navigate_anchor_window(HTMLAnchorElement
*This
, const WCHAR
*target
)
36 nsAString_Init(&href_str
, NULL
);
37 nsres
= nsIDOMHTMLAnchorElement_GetHref(This
->nsanchor
, &href_str
);
38 if(NS_SUCCEEDED(nsres
)) {
39 const PRUnichar
*href
;
41 nsAString_GetData(&href_str
, &href
);
42 hres
= create_relative_uri(This
->element
.node
.doc
->basedoc
.window
, href
, &uri
);
44 ERR("Could not get anchor href: %08x\n", nsres
);
47 nsAString_Finish(&href_str
);
51 hres
= navigate_new_window(This
->element
.node
.doc
->basedoc
.window
, uri
, target
, NULL
);
56 static HRESULT
navigate_anchor(HTMLAnchorElement
*This
)
58 nsAString href_str
, target_str
;
59 HTMLOuterWindow
*window
= NULL
;
61 HRESULT hres
= E_FAIL
;
63 static const WCHAR _parentW
[] = {'p','a','r','e','n','t',0};
64 static const WCHAR _selfW
[] = {'_','s','e','l','f',0};
65 static const WCHAR _topW
[] = {'_','t','o','p',0};
67 nsAString_Init(&target_str
, NULL
);
68 nsres
= nsIDOMHTMLAnchorElement_GetTarget(This
->nsanchor
, &target_str
);
69 if(NS_SUCCEEDED(nsres
)) {
70 const PRUnichar
*target
;
72 nsAString_GetData(&target_str
, &target
);
73 TRACE("target %s\n", debugstr_w(target
));
74 if(*target
&& strcmpiW(target
, _selfW
)) {
75 if(!strcmpiW(target
, _topW
)) {
76 TRACE("target _top\n");
77 get_top_window(This
->element
.node
.doc
->basedoc
.window
, &window
);
78 }else if(!strcmpiW(target
, _parentW
)) {
79 FIXME("Navigating to target _parent is not implemented\n");
80 nsAString_Finish(&target_str
);
83 HTMLOuterWindow
*top_window
;
85 get_top_window(This
->element
.node
.doc
->basedoc
.window
, &top_window
);
87 hres
= get_frame_by_name(top_window
, target
, TRUE
, &window
);
88 if(FAILED(hres
) || !window
) {
89 hres
= navigate_anchor_window(This
, target
);
90 nsAString_Finish(&target_str
);
96 nsAString_Finish(&target_str
);
98 nsAString_Init(&href_str
, NULL
);
99 nsres
= nsIDOMHTMLAnchorElement_GetHref(This
->nsanchor
, &href_str
);
100 if(NS_SUCCEEDED(nsres
)) {
101 const PRUnichar
*href
;
103 nsAString_GetData(&href_str
, &href
);
106 window
= This
->element
.node
.doc
->basedoc
.window
;
107 hres
= navigate_url(window
, href
, window
->uri
, BINDING_NAVIGATED
);
109 TRACE("empty href\n");
113 nsAString_Finish(&href_str
);
117 static inline HTMLAnchorElement
*impl_from_IHTMLAnchorElement(IHTMLAnchorElement
*iface
)
119 return CONTAINING_RECORD(iface
, HTMLAnchorElement
, IHTMLAnchorElement_iface
);
122 static HRESULT WINAPI
HTMLAnchorElement_QueryInterface(IHTMLAnchorElement
*iface
,
123 REFIID riid
, void **ppv
)
125 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
127 return IHTMLDOMNode_QueryInterface(&This
->element
.node
.IHTMLDOMNode_iface
, riid
, ppv
);
130 static ULONG WINAPI
HTMLAnchorElement_AddRef(IHTMLAnchorElement
*iface
)
132 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
134 return IHTMLDOMNode_AddRef(&This
->element
.node
.IHTMLDOMNode_iface
);
137 static ULONG WINAPI
HTMLAnchorElement_Release(IHTMLAnchorElement
*iface
)
139 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
141 return IHTMLDOMNode_Release(&This
->element
.node
.IHTMLDOMNode_iface
);
144 static HRESULT WINAPI
HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement
*iface
, UINT
*pctinfo
)
146 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
147 return IDispatchEx_GetTypeInfoCount(&This
->element
.node
.dispex
.IDispatchEx_iface
, pctinfo
);
150 static HRESULT WINAPI
HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement
*iface
, UINT iTInfo
,
151 LCID lcid
, ITypeInfo
**ppTInfo
)
153 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
154 return IDispatchEx_GetTypeInfo(&This
->element
.node
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
,
158 static HRESULT WINAPI
HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement
*iface
, REFIID riid
,
159 LPOLESTR
*rgszNames
, UINT cNames
,
160 LCID lcid
, DISPID
*rgDispId
)
162 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
163 return IDispatchEx_GetIDsOfNames(&This
->element
.node
.dispex
.IDispatchEx_iface
, riid
, rgszNames
,
164 cNames
, lcid
, rgDispId
);
167 static HRESULT WINAPI
HTMLAnchorElement_Invoke(IHTMLAnchorElement
*iface
, DISPID dispIdMember
,
168 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
169 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
171 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
172 return IDispatchEx_Invoke(&This
->element
.node
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
173 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
176 static HRESULT WINAPI
HTMLAnchorElement_put_href(IHTMLAnchorElement
*iface
, BSTR v
)
178 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
182 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
184 nsAString_InitDepend(&nsstr
, v
);
185 nsres
= nsIDOMHTMLAnchorElement_SetHref(This
->nsanchor
, &nsstr
);
186 nsAString_Finish(&nsstr
);
193 static HRESULT WINAPI
HTMLAnchorElement_get_href(IHTMLAnchorElement
*iface
, BSTR
*p
)
195 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
200 TRACE("(%p)->(%p)\n", This
, p
);
202 nsAString_Init(&href_str
, NULL
);
203 nsres
= nsIDOMHTMLAnchorElement_GetHref(This
->nsanchor
, &href_str
);
204 if(NS_SUCCEEDED(nsres
)) {
205 const PRUnichar
*href
;
207 nsAString_GetData(&href_str
, &href
);
208 hres
= nsuri_to_url(href
, TRUE
, p
);
210 ERR("GetHref failed: %08x\n", nsres
);
214 nsAString_Finish(&href_str
);
218 static HRESULT WINAPI
HTMLAnchorElement_put_target(IHTMLAnchorElement
*iface
, BSTR v
)
220 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
224 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
226 nsAString_InitDepend(&nsstr
, v
);
227 nsres
= nsIDOMHTMLAnchorElement_SetTarget(This
->nsanchor
, &nsstr
);
228 nsAString_Finish(&nsstr
);
235 static HRESULT WINAPI
HTMLAnchorElement_get_target(IHTMLAnchorElement
*iface
, BSTR
*p
)
237 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
238 nsAString target_str
;
241 TRACE("(%p)->(%p)\n", This
, p
);
243 nsAString_Init(&target_str
, NULL
);
244 nsres
= nsIDOMHTMLAnchorElement_GetTarget(This
->nsanchor
, &target_str
);
246 return return_nsstr(nsres
, &target_str
, p
);
249 static HRESULT WINAPI
HTMLAnchorElement_put_rel(IHTMLAnchorElement
*iface
, BSTR v
)
251 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
255 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
257 nsAString_InitDepend(&nsstr
, v
);
258 nsres
= nsIDOMHTMLAnchorElement_SetRel(This
->nsanchor
, &nsstr
);
259 nsAString_Finish(&nsstr
);
266 static HRESULT WINAPI
HTMLAnchorElement_get_rel(IHTMLAnchorElement
*iface
, BSTR
*p
)
268 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
272 TRACE("(%p)->(%p)\n", This
, p
);
274 nsAString_Init(&nsstr
, NULL
);
275 nsres
= nsIDOMHTMLAnchorElement_GetRel(This
->nsanchor
, &nsstr
);
276 return return_nsstr(nsres
, &nsstr
, p
);
279 static HRESULT WINAPI
HTMLAnchorElement_put_rev(IHTMLAnchorElement
*iface
, BSTR v
)
281 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
282 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
286 static HRESULT WINAPI
HTMLAnchorElement_get_rev(IHTMLAnchorElement
*iface
, BSTR
*p
)
288 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
289 FIXME("(%p)->(%p)\n", This
, p
);
293 static HRESULT WINAPI
HTMLAnchorElement_put_urn(IHTMLAnchorElement
*iface
, BSTR v
)
295 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
296 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
300 static HRESULT WINAPI
HTMLAnchorElement_get_urn(IHTMLAnchorElement
*iface
, BSTR
*p
)
302 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
303 FIXME("(%p)->(%p)\n", This
, p
);
307 static HRESULT WINAPI
HTMLAnchorElement_put_Methods(IHTMLAnchorElement
*iface
, BSTR v
)
309 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
310 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
314 static HRESULT WINAPI
HTMLAnchorElement_get_Methods(IHTMLAnchorElement
*iface
, BSTR
*p
)
316 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
317 FIXME("(%p)->(%p)\n", This
, p
);
321 static HRESULT WINAPI
HTMLAnchorElement_put_name(IHTMLAnchorElement
*iface
, BSTR v
)
323 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
327 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
329 nsAString_InitDepend(&nsstr
, v
);
330 nsres
= nsIDOMHTMLAnchorElement_SetName(This
->nsanchor
, &nsstr
);
331 nsAString_Finish(&nsstr
);
338 static HRESULT WINAPI
HTMLAnchorElement_get_name(IHTMLAnchorElement
*iface
, BSTR
*p
)
340 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
344 TRACE("(%p)->(%p)\n", This
, p
);
346 nsAString_Init(&name_str
, NULL
);
347 nsres
= nsIDOMHTMLAnchorElement_GetName(This
->nsanchor
, &name_str
);
349 return return_nsstr(nsres
, &name_str
, p
);
352 static HRESULT WINAPI
HTMLAnchorElement_put_host(IHTMLAnchorElement
*iface
, BSTR v
)
354 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
355 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
359 static HRESULT WINAPI
HTMLAnchorElement_get_host(IHTMLAnchorElement
*iface
, BSTR
*p
)
361 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
362 FIXME("(%p)->(%p)\n", This
, p
);
366 static HRESULT WINAPI
HTMLAnchorElement_put_hostname(IHTMLAnchorElement
*iface
, BSTR v
)
368 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
369 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
373 static HRESULT WINAPI
HTMLAnchorElement_get_hostname(IHTMLAnchorElement
*iface
, BSTR
*p
)
375 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
376 nsAString hostname_str
;
379 TRACE("(%p)->(%p)\n", This
, p
);
381 nsAString_Init(&hostname_str
, NULL
);
382 nsres
= nsIDOMHTMLAnchorElement_GetHostname(This
->nsanchor
, &hostname_str
);
383 return return_nsstr(nsres
, &hostname_str
, p
);
386 static HRESULT WINAPI
HTMLAnchorElement_put_pathname(IHTMLAnchorElement
*iface
, BSTR v
)
388 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
389 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
393 static HRESULT WINAPI
HTMLAnchorElement_get_pathname(IHTMLAnchorElement
*iface
, BSTR
*p
)
395 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
396 FIXME("(%p)->(%p)\n", This
, p
);
400 static HRESULT WINAPI
HTMLAnchorElement_put_port(IHTMLAnchorElement
*iface
, BSTR v
)
402 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
403 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
407 static HRESULT WINAPI
HTMLAnchorElement_get_port(IHTMLAnchorElement
*iface
, BSTR
*p
)
409 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
410 FIXME("(%p)->(%p)\n", This
, p
);
414 static HRESULT WINAPI
HTMLAnchorElement_put_protocol(IHTMLAnchorElement
*iface
, BSTR v
)
416 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
417 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
421 static HRESULT WINAPI
HTMLAnchorElement_get_protocol(IHTMLAnchorElement
*iface
, BSTR
*p
)
423 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
424 FIXME("(%p)->(%p)\n", This
, p
);
428 static HRESULT WINAPI
HTMLAnchorElement_put_search(IHTMLAnchorElement
*iface
, BSTR v
)
430 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
431 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
435 static HRESULT WINAPI
HTMLAnchorElement_get_search(IHTMLAnchorElement
*iface
, BSTR
*p
)
437 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
438 FIXME("(%p)->(%p)\n", This
, p
);
442 static HRESULT WINAPI
HTMLAnchorElement_put_hash(IHTMLAnchorElement
*iface
, BSTR v
)
444 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
445 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
449 static HRESULT WINAPI
HTMLAnchorElement_get_hash(IHTMLAnchorElement
*iface
, BSTR
*p
)
451 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
455 TRACE("(%p)->(%p)\n", This
, p
);
457 nsAString_Init(&hash_str
, NULL
);
458 nsres
= nsIDOMHTMLAnchorElement_GetHash(This
->nsanchor
, &hash_str
);
459 return return_nsstr(nsres
, &hash_str
, p
);
462 static HRESULT WINAPI
HTMLAnchorElement_put_onblur(IHTMLAnchorElement
*iface
, VARIANT v
)
464 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
466 TRACE("(%p)->()\n", This
);
468 return IHTMLElement2_put_onblur(&This
->element
.IHTMLElement2_iface
, v
);
471 static HRESULT WINAPI
HTMLAnchorElement_get_onblur(IHTMLAnchorElement
*iface
, VARIANT
*p
)
473 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
475 TRACE("(%p)->(%p)\n", This
, p
);
477 return IHTMLElement2_get_onblur(&This
->element
.IHTMLElement2_iface
, p
);
480 static HRESULT WINAPI
HTMLAnchorElement_put_onfocus(IHTMLAnchorElement
*iface
, VARIANT v
)
482 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
484 TRACE("(%p)->()\n", This
);
486 return IHTMLElement2_put_onfocus(&This
->element
.IHTMLElement2_iface
, v
);
489 static HRESULT WINAPI
HTMLAnchorElement_get_onfocus(IHTMLAnchorElement
*iface
, VARIANT
*p
)
491 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
493 TRACE("(%p)->(%p)\n", This
, p
);
495 return IHTMLElement2_get_onfocus(&This
->element
.IHTMLElement2_iface
, p
);
498 static HRESULT WINAPI
HTMLAnchorElement_put_accessKey(IHTMLAnchorElement
*iface
, BSTR v
)
500 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
502 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
504 return IHTMLElement2_put_accessKey(&This
->element
.IHTMLElement2_iface
, v
);
507 static HRESULT WINAPI
HTMLAnchorElement_get_accessKey(IHTMLAnchorElement
*iface
, BSTR
*p
)
509 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
511 TRACE("(%p)->(%p)\n", This
, p
);
513 return IHTMLElement2_get_accessKey(&This
->element
.IHTMLElement2_iface
, p
);
516 static HRESULT WINAPI
HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement
*iface
, BSTR
*p
)
518 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
519 FIXME("(%p)->(%p)\n", This
, p
);
523 static HRESULT WINAPI
HTMLAnchorElement_get_mimeType(IHTMLAnchorElement
*iface
, BSTR
*p
)
525 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
526 FIXME("(%p)->(%p)\n", This
, p
);
530 static HRESULT WINAPI
HTMLAnchorElement_get_nameProp(IHTMLAnchorElement
*iface
, BSTR
*p
)
532 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
533 FIXME("(%p)->(%p)\n", This
, p
);
537 static HRESULT WINAPI
HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement
*iface
, short v
)
539 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
541 TRACE("(%p)->()\n", This
);
543 return IHTMLElement2_put_tabIndex(&This
->element
.IHTMLElement2_iface
, v
);
546 static HRESULT WINAPI
HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement
*iface
, short *p
)
548 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
550 TRACE("(%p)->(%p)\n", This
, p
);
552 return IHTMLElement2_get_tabIndex(&This
->element
.IHTMLElement2_iface
, p
);
555 static HRESULT WINAPI
HTMLAnchorElement_focus(IHTMLAnchorElement
*iface
)
557 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
559 TRACE("(%p)\n", This
);
561 return IHTMLElement2_focus(&This
->element
.IHTMLElement2_iface
);
564 static HRESULT WINAPI
HTMLAnchorElement_blur(IHTMLAnchorElement
*iface
)
566 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
568 TRACE("(%p)\n", This
);
570 return IHTMLElement2_blur(&This
->element
.IHTMLElement2_iface
);
573 static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl
= {
574 HTMLAnchorElement_QueryInterface
,
575 HTMLAnchorElement_AddRef
,
576 HTMLAnchorElement_Release
,
577 HTMLAnchorElement_GetTypeInfoCount
,
578 HTMLAnchorElement_GetTypeInfo
,
579 HTMLAnchorElement_GetIDsOfNames
,
580 HTMLAnchorElement_Invoke
,
581 HTMLAnchorElement_put_href
,
582 HTMLAnchorElement_get_href
,
583 HTMLAnchorElement_put_target
,
584 HTMLAnchorElement_get_target
,
585 HTMLAnchorElement_put_rel
,
586 HTMLAnchorElement_get_rel
,
587 HTMLAnchorElement_put_rev
,
588 HTMLAnchorElement_get_rev
,
589 HTMLAnchorElement_put_urn
,
590 HTMLAnchorElement_get_urn
,
591 HTMLAnchorElement_put_Methods
,
592 HTMLAnchorElement_get_Methods
,
593 HTMLAnchorElement_put_name
,
594 HTMLAnchorElement_get_name
,
595 HTMLAnchorElement_put_host
,
596 HTMLAnchorElement_get_host
,
597 HTMLAnchorElement_put_hostname
,
598 HTMLAnchorElement_get_hostname
,
599 HTMLAnchorElement_put_pathname
,
600 HTMLAnchorElement_get_pathname
,
601 HTMLAnchorElement_put_port
,
602 HTMLAnchorElement_get_port
,
603 HTMLAnchorElement_put_protocol
,
604 HTMLAnchorElement_get_protocol
,
605 HTMLAnchorElement_put_search
,
606 HTMLAnchorElement_get_search
,
607 HTMLAnchorElement_put_hash
,
608 HTMLAnchorElement_get_hash
,
609 HTMLAnchorElement_put_onblur
,
610 HTMLAnchorElement_get_onblur
,
611 HTMLAnchorElement_put_onfocus
,
612 HTMLAnchorElement_get_onfocus
,
613 HTMLAnchorElement_put_accessKey
,
614 HTMLAnchorElement_get_accessKey
,
615 HTMLAnchorElement_get_protocolLong
,
616 HTMLAnchorElement_get_mimeType
,
617 HTMLAnchorElement_get_nameProp
,
618 HTMLAnchorElement_put_tabIndex
,
619 HTMLAnchorElement_get_tabIndex
,
620 HTMLAnchorElement_focus
,
621 HTMLAnchorElement_blur
624 static inline HTMLAnchorElement
*impl_from_HTMLDOMNode(HTMLDOMNode
*iface
)
626 return CONTAINING_RECORD(iface
, HTMLAnchorElement
, element
.node
);
629 static HRESULT
HTMLAnchorElement_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
631 HTMLAnchorElement
*This
= impl_from_HTMLDOMNode(iface
);
635 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
636 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
637 *ppv
= &This
->IHTMLAnchorElement_iface
;
638 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
639 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
640 *ppv
= &This
->IHTMLAnchorElement_iface
;
641 }else if(IsEqualGUID(&IID_IHTMLAnchorElement
, riid
)) {
642 TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This
, ppv
);
643 *ppv
= &This
->IHTMLAnchorElement_iface
;
647 IUnknown_AddRef((IUnknown
*)*ppv
);
651 return HTMLElement_QI(&This
->element
.node
, riid
, ppv
);
654 static HRESULT
HTMLAnchorElement_handle_event(HTMLDOMNode
*iface
, eventid_t eid
, nsIDOMEvent
*event
, BOOL
*prevent_default
)
656 HTMLAnchorElement
*This
= impl_from_HTMLDOMNode(iface
);
658 if(eid
== EVENTID_CLICK
) {
659 nsIDOMMouseEvent
*mouse_event
;
665 nsres
= nsIDOMEvent_QueryInterface(event
, &IID_nsIDOMMouseEvent
, (void**)&mouse_event
);
666 assert(nsres
== NS_OK
);
668 nsres
= nsIDOMMouseEvent_GetButton(mouse_event
, &button
);
669 assert(nsres
== NS_OK
);
671 nsIDOMMouseEvent_Release(mouse_event
);
675 *prevent_default
= TRUE
;
676 return navigate_anchor(This
);
678 *prevent_default
= TRUE
;
679 return navigate_anchor_window(This
, NULL
);
681 *prevent_default
= FALSE
;
686 return HTMLElement_handle_event(&This
->element
.node
, eid
, event
, prevent_default
);
689 static const NodeImplVtbl HTMLAnchorElementImplVtbl
= {
690 HTMLAnchorElement_QI
,
691 HTMLElement_destructor
,
694 HTMLAnchorElement_handle_event
,
695 HTMLElement_get_attr_col
698 static const tid_t HTMLAnchorElement_iface_tids
[] = {
699 IHTMLAnchorElement_tid
,
705 static dispex_static_data_t HTMLAnchorElement_dispex
= {
707 DispHTMLAnchorElement_tid
,
709 HTMLAnchorElement_iface_tids
712 HRESULT
HTMLAnchorElement_Create(HTMLDocumentNode
*doc
, nsIDOMHTMLElement
*nselem
, HTMLElement
**elem
)
714 HTMLAnchorElement
*ret
;
717 ret
= heap_alloc_zero(sizeof(HTMLAnchorElement
));
719 return E_OUTOFMEMORY
;
721 ret
->IHTMLAnchorElement_iface
.lpVtbl
= &HTMLAnchorElementVtbl
;
722 ret
->element
.node
.vtbl
= &HTMLAnchorElementImplVtbl
;
724 HTMLElement_Init(&ret
->element
, doc
, nselem
, &HTMLAnchorElement_dispex
);
726 nsres
= nsIDOMHTMLElement_QueryInterface(nselem
, &IID_nsIDOMHTMLAnchorElement
, (void**)&ret
->nsanchor
);
728 /* Shere the reference with nsnode */
729 assert(nsres
== NS_OK
&& (nsIDOMNode
*)ret
->nsanchor
== ret
->element
.node
.nsnode
);
730 nsIDOMNode_Release(ret
->element
.node
.nsnode
);
732 *elem
= &ret
->element
;