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
30 #include "mshtml_private.h"
31 #include "htmlevent.h"
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
41 IHTMLAnchorElement IHTMLAnchorElement_iface
;
43 nsIDOMHTMLAnchorElement
*nsanchor
;
46 static HRESULT
navigate_anchor_window(HTMLAnchorElement
*This
, const WCHAR
*target
)
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
);
61 ERR("Could not get anchor href: %08x\n", nsres
);
64 nsAString_Finish(&href_str
);
68 hres
= navigate_new_window(This
->element
.node
.doc
->basedoc
.window
, uri
, target
, NULL
);
73 static HRESULT
navigate_anchor(HTMLAnchorElement
*This
)
75 nsAString href_str
, target_str
;
76 HTMLOuterWindow
*window
= NULL
;
78 HRESULT hres
= E_FAIL
;
80 static const WCHAR _parentW
[] = {'p','a','r','e','n','t',0};
81 static const WCHAR _selfW
[] = {'_','s','e','l','f',0};
82 static const WCHAR _topW
[] = {'_','t','o','p',0};
84 nsAString_Init(&target_str
, NULL
);
85 nsres
= nsIDOMHTMLAnchorElement_GetTarget(This
->nsanchor
, &target_str
);
86 if(NS_SUCCEEDED(nsres
)) {
87 const PRUnichar
*target
;
89 nsAString_GetData(&target_str
, &target
);
90 TRACE("target %s\n", debugstr_w(target
));
91 if(*target
&& strcmpiW(target
, _selfW
)) {
92 if(!strcmpiW(target
, _topW
)) {
93 TRACE("target _top\n");
94 get_top_window(This
->element
.node
.doc
->basedoc
.window
, &window
);
95 }else if(!strcmpiW(target
, _parentW
)) {
96 FIXME("Navigating to target _parent is not implemented\n");
97 nsAString_Finish(&target_str
);
100 HTMLOuterWindow
*top_window
;
102 get_top_window(This
->element
.node
.doc
->basedoc
.window
, &top_window
);
104 hres
= get_frame_by_name(top_window
, target
, TRUE
, &window
);
105 if(FAILED(hres
) || !window
) {
106 hres
= navigate_anchor_window(This
, target
);
107 nsAString_Finish(&target_str
);
113 nsAString_Finish(&target_str
);
115 nsAString_Init(&href_str
, NULL
);
116 nsres
= nsIDOMHTMLAnchorElement_GetHref(This
->nsanchor
, &href_str
);
117 if(NS_SUCCEEDED(nsres
)) {
118 const PRUnichar
*href
;
120 nsAString_GetData(&href_str
, &href
);
123 window
= This
->element
.node
.doc
->basedoc
.window
;
124 hres
= navigate_url(window
, href
, window
->uri
, BINDING_NAVIGATED
);
126 TRACE("empty href\n");
130 nsAString_Finish(&href_str
);
134 static inline HTMLAnchorElement
*impl_from_IHTMLAnchorElement(IHTMLAnchorElement
*iface
)
136 return CONTAINING_RECORD(iface
, HTMLAnchorElement
, IHTMLAnchorElement_iface
);
139 static HRESULT WINAPI
HTMLAnchorElement_QueryInterface(IHTMLAnchorElement
*iface
,
140 REFIID riid
, void **ppv
)
142 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
144 return IHTMLDOMNode_QueryInterface(&This
->element
.node
.IHTMLDOMNode_iface
, riid
, ppv
);
147 static ULONG WINAPI
HTMLAnchorElement_AddRef(IHTMLAnchorElement
*iface
)
149 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
151 return IHTMLDOMNode_AddRef(&This
->element
.node
.IHTMLDOMNode_iface
);
154 static ULONG WINAPI
HTMLAnchorElement_Release(IHTMLAnchorElement
*iface
)
156 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
158 return IHTMLDOMNode_Release(&This
->element
.node
.IHTMLDOMNode_iface
);
161 static HRESULT WINAPI
HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement
*iface
, UINT
*pctinfo
)
163 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
164 return IDispatchEx_GetTypeInfoCount(&This
->element
.node
.dispex
.IDispatchEx_iface
, pctinfo
);
167 static HRESULT WINAPI
HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement
*iface
, UINT iTInfo
,
168 LCID lcid
, ITypeInfo
**ppTInfo
)
170 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
171 return IDispatchEx_GetTypeInfo(&This
->element
.node
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
,
175 static HRESULT WINAPI
HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement
*iface
, REFIID riid
,
176 LPOLESTR
*rgszNames
, UINT cNames
,
177 LCID lcid
, DISPID
*rgDispId
)
179 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
180 return IDispatchEx_GetIDsOfNames(&This
->element
.node
.dispex
.IDispatchEx_iface
, riid
, rgszNames
,
181 cNames
, lcid
, rgDispId
);
184 static HRESULT WINAPI
HTMLAnchorElement_Invoke(IHTMLAnchorElement
*iface
, DISPID dispIdMember
,
185 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
186 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
188 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
189 return IDispatchEx_Invoke(&This
->element
.node
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
190 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
193 static HRESULT WINAPI
HTMLAnchorElement_put_href(IHTMLAnchorElement
*iface
, BSTR v
)
195 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
199 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
201 nsAString_InitDepend(&nsstr
, v
);
202 nsres
= nsIDOMHTMLAnchorElement_SetHref(This
->nsanchor
, &nsstr
);
203 nsAString_Finish(&nsstr
);
210 static HRESULT WINAPI
HTMLAnchorElement_get_href(IHTMLAnchorElement
*iface
, BSTR
*p
)
212 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
217 TRACE("(%p)->(%p)\n", This
, p
);
219 nsAString_Init(&href_str
, NULL
);
220 nsres
= nsIDOMHTMLAnchorElement_GetHref(This
->nsanchor
, &href_str
);
221 if(NS_SUCCEEDED(nsres
)) {
222 const PRUnichar
*href
;
224 nsAString_GetData(&href_str
, &href
);
225 hres
= nsuri_to_url(href
, TRUE
, p
);
227 ERR("GetHref failed: %08x\n", nsres
);
231 nsAString_Finish(&href_str
);
235 static HRESULT WINAPI
HTMLAnchorElement_put_target(IHTMLAnchorElement
*iface
, BSTR v
)
237 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
241 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
243 nsAString_InitDepend(&nsstr
, v
);
244 nsres
= nsIDOMHTMLAnchorElement_SetTarget(This
->nsanchor
, &nsstr
);
245 nsAString_Finish(&nsstr
);
252 static HRESULT WINAPI
HTMLAnchorElement_get_target(IHTMLAnchorElement
*iface
, BSTR
*p
)
254 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
255 nsAString target_str
;
258 TRACE("(%p)->(%p)\n", This
, p
);
260 nsAString_Init(&target_str
, NULL
);
261 nsres
= nsIDOMHTMLAnchorElement_GetTarget(This
->nsanchor
, &target_str
);
263 return return_nsstr(nsres
, &target_str
, p
);
266 static HRESULT WINAPI
HTMLAnchorElement_put_rel(IHTMLAnchorElement
*iface
, BSTR v
)
268 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
272 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
274 nsAString_InitDepend(&nsstr
, v
);
275 nsres
= nsIDOMHTMLAnchorElement_SetRel(This
->nsanchor
, &nsstr
);
276 nsAString_Finish(&nsstr
);
283 static HRESULT WINAPI
HTMLAnchorElement_get_rel(IHTMLAnchorElement
*iface
, BSTR
*p
)
285 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
289 TRACE("(%p)->(%p)\n", This
, p
);
291 nsAString_Init(&nsstr
, NULL
);
292 nsres
= nsIDOMHTMLAnchorElement_GetRel(This
->nsanchor
, &nsstr
);
293 return return_nsstr(nsres
, &nsstr
, p
);
296 static HRESULT WINAPI
HTMLAnchorElement_put_rev(IHTMLAnchorElement
*iface
, BSTR v
)
298 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
299 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
303 static HRESULT WINAPI
HTMLAnchorElement_get_rev(IHTMLAnchorElement
*iface
, BSTR
*p
)
305 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
306 FIXME("(%p)->(%p)\n", This
, p
);
310 static HRESULT WINAPI
HTMLAnchorElement_put_urn(IHTMLAnchorElement
*iface
, BSTR v
)
312 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
313 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
317 static HRESULT WINAPI
HTMLAnchorElement_get_urn(IHTMLAnchorElement
*iface
, BSTR
*p
)
319 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
320 FIXME("(%p)->(%p)\n", This
, p
);
324 static HRESULT WINAPI
HTMLAnchorElement_put_Methods(IHTMLAnchorElement
*iface
, BSTR v
)
326 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
327 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
331 static HRESULT WINAPI
HTMLAnchorElement_get_Methods(IHTMLAnchorElement
*iface
, BSTR
*p
)
333 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
334 FIXME("(%p)->(%p)\n", This
, p
);
338 static HRESULT WINAPI
HTMLAnchorElement_put_name(IHTMLAnchorElement
*iface
, BSTR v
)
340 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
344 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
346 nsAString_InitDepend(&nsstr
, v
);
347 nsres
= nsIDOMHTMLAnchorElement_SetName(This
->nsanchor
, &nsstr
);
348 nsAString_Finish(&nsstr
);
355 static HRESULT WINAPI
HTMLAnchorElement_get_name(IHTMLAnchorElement
*iface
, BSTR
*p
)
357 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
361 TRACE("(%p)->(%p)\n", This
, p
);
363 nsAString_Init(&name_str
, NULL
);
364 nsres
= nsIDOMHTMLAnchorElement_GetName(This
->nsanchor
, &name_str
);
366 return return_nsstr(nsres
, &name_str
, p
);
369 static HRESULT WINAPI
HTMLAnchorElement_put_host(IHTMLAnchorElement
*iface
, BSTR v
)
371 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
372 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
376 static HRESULT WINAPI
HTMLAnchorElement_get_host(IHTMLAnchorElement
*iface
, BSTR
*p
)
378 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
379 FIXME("(%p)->(%p)\n", This
, p
);
383 static HRESULT WINAPI
HTMLAnchorElement_put_hostname(IHTMLAnchorElement
*iface
, BSTR v
)
385 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
386 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
390 static HRESULT WINAPI
HTMLAnchorElement_get_hostname(IHTMLAnchorElement
*iface
, BSTR
*p
)
392 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
393 nsAString hostname_str
;
396 TRACE("(%p)->(%p)\n", This
, p
);
398 nsAString_Init(&hostname_str
, NULL
);
399 nsres
= nsIDOMHTMLAnchorElement_GetHostname(This
->nsanchor
, &hostname_str
);
400 return return_nsstr(nsres
, &hostname_str
, p
);
403 static HRESULT WINAPI
HTMLAnchorElement_put_pathname(IHTMLAnchorElement
*iface
, BSTR v
)
405 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
406 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
410 static HRESULT WINAPI
HTMLAnchorElement_get_pathname(IHTMLAnchorElement
*iface
, BSTR
*p
)
412 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
413 FIXME("(%p)->(%p)\n", This
, p
);
417 static HRESULT WINAPI
HTMLAnchorElement_put_port(IHTMLAnchorElement
*iface
, BSTR v
)
419 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
420 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
424 static HRESULT WINAPI
HTMLAnchorElement_get_port(IHTMLAnchorElement
*iface
, BSTR
*p
)
426 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
427 FIXME("(%p)->(%p)\n", This
, p
);
431 static HRESULT WINAPI
HTMLAnchorElement_put_protocol(IHTMLAnchorElement
*iface
, BSTR v
)
433 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
434 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
438 static HRESULT WINAPI
HTMLAnchorElement_get_protocol(IHTMLAnchorElement
*iface
, BSTR
*p
)
440 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
441 FIXME("(%p)->(%p)\n", This
, p
);
445 static HRESULT WINAPI
HTMLAnchorElement_put_search(IHTMLAnchorElement
*iface
, BSTR v
)
447 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
448 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
452 static HRESULT WINAPI
HTMLAnchorElement_get_search(IHTMLAnchorElement
*iface
, BSTR
*p
)
454 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
455 FIXME("(%p)->(%p)\n", This
, p
);
459 static HRESULT WINAPI
HTMLAnchorElement_put_hash(IHTMLAnchorElement
*iface
, BSTR v
)
461 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
462 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
466 static HRESULT WINAPI
HTMLAnchorElement_get_hash(IHTMLAnchorElement
*iface
, BSTR
*p
)
468 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
472 TRACE("(%p)->(%p)\n", This
, p
);
474 nsAString_Init(&hash_str
, NULL
);
475 nsres
= nsIDOMHTMLAnchorElement_GetHash(This
->nsanchor
, &hash_str
);
476 return return_nsstr(nsres
, &hash_str
, p
);
479 static HRESULT WINAPI
HTMLAnchorElement_put_onblur(IHTMLAnchorElement
*iface
, VARIANT v
)
481 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
483 TRACE("(%p)->()\n", This
);
485 return IHTMLElement2_put_onblur(&This
->element
.IHTMLElement2_iface
, v
);
488 static HRESULT WINAPI
HTMLAnchorElement_get_onblur(IHTMLAnchorElement
*iface
, VARIANT
*p
)
490 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
492 TRACE("(%p)->(%p)\n", This
, p
);
494 return IHTMLElement2_get_onblur(&This
->element
.IHTMLElement2_iface
, p
);
497 static HRESULT WINAPI
HTMLAnchorElement_put_onfocus(IHTMLAnchorElement
*iface
, VARIANT v
)
499 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
501 TRACE("(%p)->()\n", This
);
503 return IHTMLElement2_put_onfocus(&This
->element
.IHTMLElement2_iface
, v
);
506 static HRESULT WINAPI
HTMLAnchorElement_get_onfocus(IHTMLAnchorElement
*iface
, VARIANT
*p
)
508 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
510 TRACE("(%p)->(%p)\n", This
, p
);
512 return IHTMLElement2_get_onfocus(&This
->element
.IHTMLElement2_iface
, p
);
515 static HRESULT WINAPI
HTMLAnchorElement_put_accessKey(IHTMLAnchorElement
*iface
, BSTR v
)
517 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
519 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
521 return IHTMLElement2_put_accessKey(&This
->element
.IHTMLElement2_iface
, v
);
524 static HRESULT WINAPI
HTMLAnchorElement_get_accessKey(IHTMLAnchorElement
*iface
, BSTR
*p
)
526 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
528 TRACE("(%p)->(%p)\n", This
, p
);
530 return IHTMLElement2_get_accessKey(&This
->element
.IHTMLElement2_iface
, p
);
533 static HRESULT WINAPI
HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement
*iface
, BSTR
*p
)
535 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
536 FIXME("(%p)->(%p)\n", This
, p
);
540 static HRESULT WINAPI
HTMLAnchorElement_get_mimeType(IHTMLAnchorElement
*iface
, BSTR
*p
)
542 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
543 FIXME("(%p)->(%p)\n", This
, p
);
547 static HRESULT WINAPI
HTMLAnchorElement_get_nameProp(IHTMLAnchorElement
*iface
, BSTR
*p
)
549 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
550 FIXME("(%p)->(%p)\n", This
, p
);
554 static HRESULT WINAPI
HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement
*iface
, short v
)
556 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
558 TRACE("(%p)->()\n", This
);
560 return IHTMLElement2_put_tabIndex(&This
->element
.IHTMLElement2_iface
, v
);
563 static HRESULT WINAPI
HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement
*iface
, short *p
)
565 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
567 TRACE("(%p)->(%p)\n", This
, p
);
569 return IHTMLElement2_get_tabIndex(&This
->element
.IHTMLElement2_iface
, p
);
572 static HRESULT WINAPI
HTMLAnchorElement_focus(IHTMLAnchorElement
*iface
)
574 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
576 TRACE("(%p)\n", This
);
578 return IHTMLElement2_focus(&This
->element
.IHTMLElement2_iface
);
581 static HRESULT WINAPI
HTMLAnchorElement_blur(IHTMLAnchorElement
*iface
)
583 HTMLAnchorElement
*This
= impl_from_IHTMLAnchorElement(iface
);
585 TRACE("(%p)\n", This
);
587 return IHTMLElement2_blur(&This
->element
.IHTMLElement2_iface
);
590 static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl
= {
591 HTMLAnchorElement_QueryInterface
,
592 HTMLAnchorElement_AddRef
,
593 HTMLAnchorElement_Release
,
594 HTMLAnchorElement_GetTypeInfoCount
,
595 HTMLAnchorElement_GetTypeInfo
,
596 HTMLAnchorElement_GetIDsOfNames
,
597 HTMLAnchorElement_Invoke
,
598 HTMLAnchorElement_put_href
,
599 HTMLAnchorElement_get_href
,
600 HTMLAnchorElement_put_target
,
601 HTMLAnchorElement_get_target
,
602 HTMLAnchorElement_put_rel
,
603 HTMLAnchorElement_get_rel
,
604 HTMLAnchorElement_put_rev
,
605 HTMLAnchorElement_get_rev
,
606 HTMLAnchorElement_put_urn
,
607 HTMLAnchorElement_get_urn
,
608 HTMLAnchorElement_put_Methods
,
609 HTMLAnchorElement_get_Methods
,
610 HTMLAnchorElement_put_name
,
611 HTMLAnchorElement_get_name
,
612 HTMLAnchorElement_put_host
,
613 HTMLAnchorElement_get_host
,
614 HTMLAnchorElement_put_hostname
,
615 HTMLAnchorElement_get_hostname
,
616 HTMLAnchorElement_put_pathname
,
617 HTMLAnchorElement_get_pathname
,
618 HTMLAnchorElement_put_port
,
619 HTMLAnchorElement_get_port
,
620 HTMLAnchorElement_put_protocol
,
621 HTMLAnchorElement_get_protocol
,
622 HTMLAnchorElement_put_search
,
623 HTMLAnchorElement_get_search
,
624 HTMLAnchorElement_put_hash
,
625 HTMLAnchorElement_get_hash
,
626 HTMLAnchorElement_put_onblur
,
627 HTMLAnchorElement_get_onblur
,
628 HTMLAnchorElement_put_onfocus
,
629 HTMLAnchorElement_get_onfocus
,
630 HTMLAnchorElement_put_accessKey
,
631 HTMLAnchorElement_get_accessKey
,
632 HTMLAnchorElement_get_protocolLong
,
633 HTMLAnchorElement_get_mimeType
,
634 HTMLAnchorElement_get_nameProp
,
635 HTMLAnchorElement_put_tabIndex
,
636 HTMLAnchorElement_get_tabIndex
,
637 HTMLAnchorElement_focus
,
638 HTMLAnchorElement_blur
641 static inline HTMLAnchorElement
*impl_from_HTMLDOMNode(HTMLDOMNode
*iface
)
643 return CONTAINING_RECORD(iface
, HTMLAnchorElement
, element
.node
);
646 static HRESULT
HTMLAnchorElement_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
648 HTMLAnchorElement
*This
= impl_from_HTMLDOMNode(iface
);
652 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
653 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
654 *ppv
= &This
->IHTMLAnchorElement_iface
;
655 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
656 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
657 *ppv
= &This
->IHTMLAnchorElement_iface
;
658 }else if(IsEqualGUID(&IID_IHTMLAnchorElement
, riid
)) {
659 TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This
, ppv
);
660 *ppv
= &This
->IHTMLAnchorElement_iface
;
664 IUnknown_AddRef((IUnknown
*)*ppv
);
668 return HTMLElement_QI(&This
->element
.node
, riid
, ppv
);
671 static HRESULT
HTMLAnchorElement_handle_event(HTMLDOMNode
*iface
, eventid_t eid
, nsIDOMEvent
*event
, BOOL
*prevent_default
)
673 HTMLAnchorElement
*This
= impl_from_HTMLDOMNode(iface
);
675 if(eid
== EVENTID_CLICK
) {
676 nsIDOMMouseEvent
*mouse_event
;
682 nsres
= nsIDOMEvent_QueryInterface(event
, &IID_nsIDOMMouseEvent
, (void**)&mouse_event
);
683 assert(nsres
== NS_OK
);
685 nsres
= nsIDOMMouseEvent_GetButton(mouse_event
, &button
);
686 assert(nsres
== NS_OK
);
688 nsIDOMMouseEvent_Release(mouse_event
);
692 *prevent_default
= TRUE
;
693 return navigate_anchor(This
);
695 *prevent_default
= TRUE
;
696 return navigate_anchor_window(This
, NULL
);
698 *prevent_default
= FALSE
;
703 return HTMLElement_handle_event(&This
->element
.node
, eid
, event
, prevent_default
);
706 static const NodeImplVtbl HTMLAnchorElementImplVtbl
= {
707 HTMLAnchorElement_QI
,
708 HTMLElement_destructor
,
711 HTMLAnchorElement_handle_event
,
712 HTMLElement_get_attr_col
715 static const tid_t HTMLAnchorElement_iface_tids
[] = {
716 IHTMLAnchorElement_tid
,
722 static dispex_static_data_t HTMLAnchorElement_dispex
= {
724 DispHTMLAnchorElement_tid
,
726 HTMLAnchorElement_iface_tids
729 HRESULT
HTMLAnchorElement_Create(HTMLDocumentNode
*doc
, nsIDOMHTMLElement
*nselem
, HTMLElement
**elem
)
731 HTMLAnchorElement
*ret
;
734 ret
= heap_alloc_zero(sizeof(HTMLAnchorElement
));
736 return E_OUTOFMEMORY
;
738 ret
->IHTMLAnchorElement_iface
.lpVtbl
= &HTMLAnchorElementVtbl
;
739 ret
->element
.node
.vtbl
= &HTMLAnchorElementImplVtbl
;
741 HTMLElement_Init(&ret
->element
, doc
, nselem
, &HTMLAnchorElement_dispex
);
743 nsres
= nsIDOMHTMLElement_QueryInterface(nselem
, &IID_nsIDOMHTMLAnchorElement
, (void**)&ret
->nsanchor
);
745 /* Shere the reference with nsnode */
746 assert(nsres
== NS_OK
&& (nsIDOMNode
*)ret
->nsanchor
== ret
->element
.node
.nsnode
);
747 nsIDOMNode_Release(ret
->element
.node
.nsnode
);
749 *elem
= &ret
->element
;