api-ms-win-core-url-l1-1-0: Add stub dll.
[wine/multimedia.git] / dlls / mshtml / htmlanchor.c
blob97ef900bbe295f8b3c10e36e97cca259289c7900
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 HTMLOuterWindow *window = NULL;
77 nsresult nsres;
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);
98 return S_OK;
99 }else {
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);
108 return hres;
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);
121 if(*href) {
122 if(!window)
123 window = This->element.node.doc->basedoc.window;
124 hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED);
125 }else {
126 TRACE("empty href\n");
127 hres = S_OK;
130 nsAString_Finish(&href_str);
131 return hres;
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,
172 ppTInfo);
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);
196 nsAString nsstr;
197 nsresult nsres;
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);
204 if(NS_FAILED(nsres))
205 return E_FAIL;
207 return S_OK;
210 static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
212 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
213 nsAString href_str;
214 nsresult nsres;
215 HRESULT hres;
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);
226 }else {
227 ERR("GetHref failed: %08x\n", nsres);
228 hres = E_FAIL;
231 nsAString_Finish(&href_str);
232 return hres;
235 static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v)
237 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
238 nsAString nsstr;
239 nsresult nsres;
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);
246 if(NS_FAILED(nsres))
247 return E_FAIL;
249 return S_OK;
252 static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p)
254 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
255 nsAString target_str;
256 nsresult nsres;
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);
269 nsAString nsstr;
270 nsresult nsres;
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);
277 if(NS_FAILED(nsres))
278 return E_FAIL;
280 return S_OK;
283 static HRESULT WINAPI HTMLAnchorElement_get_rel(IHTMLAnchorElement *iface, BSTR *p)
285 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
286 nsAString nsstr;
287 nsresult nsres;
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));
300 return E_NOTIMPL;
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);
307 return E_NOTIMPL;
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));
314 return E_NOTIMPL;
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);
321 return E_NOTIMPL;
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));
328 return E_NOTIMPL;
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);
335 return E_NOTIMPL;
338 static HRESULT WINAPI HTMLAnchorElement_put_name(IHTMLAnchorElement *iface, BSTR v)
340 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
341 nsAString nsstr;
342 nsresult nsres;
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);
349 if(NS_FAILED(nsres))
350 return E_FAIL;
352 return S_OK;
355 static HRESULT WINAPI HTMLAnchorElement_get_name(IHTMLAnchorElement *iface, BSTR *p)
357 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
358 nsAString name_str;
359 nsresult nsres;
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));
373 return E_NOTIMPL;
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);
380 return E_NOTIMPL;
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));
387 return E_NOTIMPL;
390 static HRESULT WINAPI HTMLAnchorElement_get_hostname(IHTMLAnchorElement *iface, BSTR *p)
392 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
393 nsAString hostname_str;
394 nsresult nsres;
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));
407 return E_NOTIMPL;
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);
414 return E_NOTIMPL;
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));
421 return E_NOTIMPL;
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);
428 return E_NOTIMPL;
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));
435 return E_NOTIMPL;
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);
442 return E_NOTIMPL;
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));
449 return E_NOTIMPL;
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);
456 return E_NOTIMPL;
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));
463 return E_NOTIMPL;
466 static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR *p)
468 HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
469 nsAString hash_str;
470 nsresult nsres;
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);
537 return E_NOTIMPL;
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);
544 return E_NOTIMPL;
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);
551 return E_NOTIMPL;
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);
650 *ppv = NULL;
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;
663 if(*ppv) {
664 IUnknown_AddRef((IUnknown*)*ppv);
665 return S_OK;
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;
677 UINT16 button;
678 nsresult nsres;
680 TRACE("CLICK\n");
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);
690 switch(button) {
691 case 0:
692 *prevent_default = TRUE;
693 return navigate_anchor(This);
694 case 1:
695 *prevent_default = TRUE;
696 return navigate_anchor_window(This, NULL);
697 default:
698 *prevent_default = FALSE;
699 return S_OK;
703 return HTMLElement_handle_event(&This->element.node, eid, event, prevent_default);
706 static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
707 HTMLAnchorElement_QI,
708 HTMLElement_destructor,
709 HTMLElement_cpc,
710 HTMLElement_clone,
711 HTMLAnchorElement_handle_event,
712 HTMLElement_get_attr_col
715 static const tid_t HTMLAnchorElement_iface_tids[] = {
716 IHTMLAnchorElement_tid,
717 HTMLELEMENT_TIDS,
718 IHTMLUniqueName_tid,
722 static dispex_static_data_t HTMLAnchorElement_dispex = {
723 NULL,
724 DispHTMLAnchorElement_tid,
725 NULL,
726 HTMLAnchorElement_iface_tids
729 HRESULT HTMLAnchorElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
731 HTMLAnchorElement *ret;
732 nsresult nsres;
734 ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
735 if(!ret)
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;
750 return S_OK;