static HRESULT navigate_href(HTMLElement *element, nsAString *href_str, nsAString *target_str) { HTMLOuterWindow *window; BOOL use_new_window; const PRUnichar *href; HRESULT hres; window = get_target_window(element->node.doc->basedoc.window, target_str, &use_new_window); if(!window) { if(use_new_window) { const PRUnichar *target; nsAString_GetData(target_str, &target); return navigate_href_new_window(element, href_str, target); }else { return S_OK; } } 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; } IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); return hres; }
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 WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { WebBrowser *This = WEBBROWSER_THIS(iface); LPCWSTR url; TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_variant(URL), debugstr_variant(Flags), debugstr_variant(TargetFrameName), debugstr_variant(PostData), debugstr_variant(Headers)); if(!This->client) return E_FAIL; if(!URL) return S_OK; switch (V_VT(URL)) { case VT_BSTR: url = V_BSTR(URL); break; case VT_BSTR|VT_BYREF: url = *V_BSTRREF(URL); break; default: FIXME("Unsupported V_VT(URL) %d\n", V_VT(URL)); return E_INVALIDARG; } return navigate_url(&This->doc_host, url, Flags, TargetFrameName, PostData, Headers); }
BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) { WCHAR buf[INTERNET_MAX_URL_LENGTH]; WCHAR full_path[MAX_PATH]; LPWSTR ptr; static const WCHAR url_format[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':','%','s',':',':','%','s','%','s',0}; static const WCHAR slash[] = {'/',0}; static const WCHAR empty[] = {0}; TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index)); if (!info->web_browser) return FALSE; if(!GetFullPathNameW(file, sizeof(full_path)/sizeof(full_path[0]), full_path, NULL)) { WARN("GetFullPathName failed: %u\n", GetLastError()); return FALSE; } wsprintfW(buf, url_format, full_path, (!index || index[0] == '/') ? empty : slash, index); /* FIXME: HACK */ if((ptr = strchrW(buf, '#'))) *ptr = 0; return SUCCEEDED(navigate_url(info, buf)); }
static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v) { HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(v)); if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) { nsAString nsstr; nsresult nsres; nsAString_InitDepend(&nsstr, v); if(This->nsframe) nsres = nsIDOMHTMLFrameElement_SetSrc(This->nsframe, &nsstr); else nsres = nsIDOMHTMLIFrameElement_SetSrc(This->nsiframe, &nsstr); nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) { ERR("SetSrc failed: %08x\n", nsres); return E_FAIL; } return S_OK; } return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED); }
HRESULT go_home(DocHost *This) { static const WCHAR wszAboutBlank[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; FIXME("stub\n"); return navigate_url(This, wszAboutBlank, NULL, NULL, NULL, NULL); }
static HRESULT WINAPI InternetExplorer_Navigate(IWebBrowser2 *iface, BSTR szUrl, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { InternetExplorer *This = impl_from_IWebBrowser2(iface); TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(szUrl), Flags, TargetFrameName, PostData, Headers); return navigate_url(&This->doc_host->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers); }
static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR szUrl, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { WebBrowser *This = impl_from_IWebBrowser2(iface); TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(szUrl), debugstr_variant(Flags), debugstr_variant(TargetFrameName), debugstr_variant(PostData), debugstr_variant(Headers)); return navigate_url(&This->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers); }
static HRESULT WINAPI HTMLLocation_replace(IHTMLLocation *iface, BSTR bstr) { HTMLLocation *This = impl_from_IHTMLLocation(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(bstr)); if(!This->window) { FIXME("No window available\n"); return E_FAIL; } return navigate_url(This->window, bstr, This->window->url); }
static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v) { HTMLLocation *This = impl_from_IHTMLLocation(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(v)); if(!This->window || !This->window->base.outer_window) { FIXME("No window available\n"); return E_FAIL; } return navigate_url(This->window->base.outer_window, v, This->window->base.outer_window->uri, BINDING_NAVIGATED); }
static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v) { HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(v)); if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) { FIXME("detached element\n"); return E_FAIL; } return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED); }
static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { WebBrowser *This = WEBBROWSER_THIS(iface); PBYTE post_data = NULL; ULONG post_data_len = 0; LPWSTR headers = NULL; HRESULT hres; TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers); if(!This->client) return E_FAIL; if((Flags && V_VT(Flags) != VT_EMPTY) || (TargetFrameName && V_VT(TargetFrameName) != VT_EMPTY)) FIXME("Unsupported arguments\n"); if(!URL) return S_OK; if(V_VT(URL) != VT_BSTR) return E_INVALIDARG; if(PostData && V_VT(PostData) != VT_EMPTY) { if(V_VT(PostData) != (VT_ARRAY | VT_UI1) || V_ARRAY(PostData)->cDims != 1) { WARN("Invalid PostData\n"); return E_INVALIDARG; } SafeArrayAccessData(V_ARRAY(PostData), (void**)&post_data); post_data_len = V_ARRAY(PostData)->rgsabound[0].cElements; } if(Headers && V_VT(Headers) != VT_EMPTY) { if(V_VT(Headers) != VT_BSTR) return E_INVALIDARG; headers = V_BSTR(Headers); TRACE("Headers: %s\n", debugstr_w(headers)); } hres = navigate_url(&This->doc_host, V_BSTR(URL), post_data, post_data_len, headers); if(post_data) SafeArrayUnaccessData(V_ARRAY(PostData)); return hres; }
HRESULT go_home(DocHost *This) { HKEY hkey; DWORD res, type, size; WCHAR wszPageName[MAX_PATH]; static const WCHAR wszAboutBlank[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; static const WCHAR wszStartPage[] = {'S','t','a','r','t',' ','P','a','g','e',0}; static const WCHAR wszSubKey[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\', 'M','a','i','n',0}; res = RegOpenKeyW(HKEY_CURRENT_USER, wszSubKey, &hkey); if (res != ERROR_SUCCESS) return navigate_url(This, wszAboutBlank, NULL, NULL, NULL, NULL); size = sizeof(wszPageName); res = RegQueryValueExW(hkey, wszStartPage, NULL, &type, (LPBYTE)wszPageName, &size); RegCloseKey(hkey); if (res != ERROR_SUCCESS || type != REG_SZ) return navigate_url(This, wszAboutBlank, NULL, NULL, NULL, NULL); return navigate_url(This, wszPageName, NULL, NULL, NULL, NULL); }
BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) { WCHAR buf[INTERNET_MAX_URL_LENGTH]; LPWSTR ptr; TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index)); if ((!info->web_browser) || !AppendFullPathURL(file, buf, index)) return FALSE; /* FIXME: HACK */ if((ptr = strchrW(buf, '#'))) *ptr = 0; return SUCCEEDED(navigate_url(info, buf)); }
static HRESULT WINAPI InternetExplorer_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { InternetExplorer *This = impl_from_IWebBrowser2(iface); TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers); if(!URL) return S_OK; if(V_VT(URL) != VT_BSTR) { FIXME("Unsupported V_VT(URL) %d\n", V_VT(URL)); return E_INVALIDARG; } return navigate_url(&This->doc_host->doc_host, V_BSTR(URL), Flags, TargetFrameName, PostData, Headers); }
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; }
BOOL NavigateToUrl(HHInfo *info, LPCWSTR surl) { ChmPath chm_path; BOOL ret; HRESULT hres; static const WCHAR url_indicator[] = {':', '/', '/', 0}; TRACE("%s\n", debugstr_w(surl)); if (strstrW(surl, url_indicator)) { hres = navigate_url(info, surl); if(SUCCEEDED(hres)) return TRUE; } /* look up in chm if it doesn't look like a full url */ SetChmPath(&chm_path, info->pCHMInfo->szFile, surl); ret = NavigateToChm(info, chm_path.chm_file, chm_path.chm_index); heap_free(chm_path.chm_file); heap_free(chm_path.chm_index); return ret; }