static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; HTMLOuterWindow *window = NULL; nsresult nsres; HRESULT hres = E_FAIL; static const WCHAR _parentW[] = {'p','a','r','e','n','t',0}; static const WCHAR _selfW[] = {'_','s','e','l','f',0}; static const WCHAR _topW[] = {'_','t','o','p',0}; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *target; nsAString_GetData(&target_str, &target); TRACE("target %s\n", debugstr_w(target)); if(*target && strcmpiW(target, _selfW)) { if(!strcmpiW(target, _topW)) { TRACE("target _top\n"); get_top_window(This->element.node.doc->basedoc.window, &window); }else if(!strcmpiW(target, _parentW)) { FIXME("Navigating to target _parent is not implemented\n"); nsAString_Finish(&target_str); return S_OK; }else { HTMLOuterWindow *top_window; get_top_window(This->element.node.doc->basedoc.window, &top_window); hres = get_frame_by_name(top_window, target, TRUE, &window); if(FAILED(hres) || !window) { hres = navigate_anchor_window(This, target); nsAString_Finish(&target_str); return hres; } } } } nsAString_Finish(&target_str); nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { if(!window) window = This->element.node.doc->basedoc.window; hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); return hres; }
static HRESULT HTMLAnchorElement_handle_event(HTMLDOMNode *iface, DWORD eid, nsIDOMEvent *event, BOOL *prevent_default) { HTMLAnchorElement *This = impl_from_HTMLDOMNode(iface); nsAString href_str, target_str; nsresult nsres; if(eid == EVENTID_CLICK) { nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if (NS_FAILED(nsres)) { ERR("Could not get anchor href: %08x\n", nsres); goto fallback; } nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if (NS_FAILED(nsres)) { ERR("Could not get anchor target: %08x\n", nsres); goto fallback; } return handle_link_click_event(&This->element, &href_str, &target_str, event, prevent_default); fallback: nsAString_Finish(&href_str); nsAString_Finish(&target_str); } return HTMLElement_handle_event(&This->element.node, eid, event, prevent_default); }
static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p) { HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface); nsAString target_str; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); return return_nsstr(nsres, &target_str, p); }
static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; HTMLOuterWindow *window; BOOL use_new_window; nsresult nsres; HRESULT hres = E_FAIL; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_FAILED(nsres)) return E_FAIL; window = get_target_window(This->element.node.doc->basedoc.window, &target_str, &use_new_window); if(!window && use_new_window) { const PRUnichar *target; nsAString_GetData(&target_str, &target); hres = navigate_anchor_window(This, target); nsAString_Finish(&target_str); return hres; } nsAString_Finish(&target_str); if(!window) return S_OK; nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); return hres; }
static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; nsresult nsres; HRESULT hres; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *target; nsAString_GetData(&target_str, &target); if(*target) { FIXME("Navigating to target %s is not implemented\n", debugstr_w(target)); nsAString_Finish(&target_str); return S_OK; } } nsAString_Finish(&target_str); nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { HTMLWindow *window = This->element.node.doc->basedoc.window; hres = navigate_url(window, href, window->url); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); return hres; }