From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/binding.h | 1 + dlls/mshtml/navigate.c | 34 +++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h index 479cb71cf15..2b3693a8c89 100644 --- a/dlls/mshtml/binding.h +++ b/dlls/mshtml/binding.h @@ -136,6 +136,7 @@ typedef struct { #define BINDING_REFRESH 0x0008 #define BINDING_SUBMIT 0x0010 #define BINDING_NOFRAG 0x0020 +#define BINDING_FRAGNAV 0x0040
HRESULT set_http_header(struct list*,const WCHAR*,int,const WCHAR*,int) DECLSPEC_HIDDEN; HRESULT create_redirect_nschannel(const WCHAR*,nsChannel*,nsChannel**) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 66542fbd676..b0459cbeda8 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -2213,15 +2213,10 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC } }
- if(!(flags & BINDING_NOFRAG) && window->uri_nofrag && !post_data_size) { - BOOL eq; - - hres = IUri_IsEqual(uri_nofrag, window->uri_nofrag, &eq); - if(SUCCEEDED(hres) && eq) { - IUri_Release(uri_nofrag); - TRACE("fragment navigate\n"); - return navigate_fragment(window, uri); - } + if(flags & BINDING_FRAGNAV) { + IUri_Release(uri_nofrag); + TRACE("fragment navigate\n"); + return navigate_fragment(window, uri); }
hres = CreateURLMonikerEx2(NULL, uri_nofrag, &mon, URL_MK_UNIFORM); @@ -2449,6 +2444,9 @@ HRESULT hlink_frame_navigate(HTMLDocumentObj *doc, LPCWSTR url, nsChannel *nscha static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *display_uri, const request_data_t *request_data, DWORD flags) { + DWORD post_data_len = request_data ? request_data->post_data_len : 0; + void *post_data = post_data_len ? request_data->post_data : NULL; + const WCHAR *headers = request_data ? request_data->headers : NULL; nsWineURI *nsuri; HRESULT hres;
@@ -2457,11 +2455,18 @@ static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *dis if(!window->browser) return E_UNEXPECTED;
- if(window->browser->doc->webbrowser) { - DWORD post_data_len = request_data ? request_data->post_data_len : 0; - void *post_data = post_data_len ? request_data->post_data : NULL; - const WCHAR *headers = request_data ? request_data->headers : NULL; + if(!(flags & BINDING_NOFRAG) && window->uri_nofrag && !post_data_len) { + IUri *uri_nofrag = get_uri_nofrag(uri); + if(uri_nofrag) { + BOOL frag_nav = FALSE; + IUri_IsEqual(uri_nofrag, window->uri_nofrag, &frag_nav); + IUri_Release(uri_nofrag); + if(frag_nav) + flags |= BINDING_FRAGNAV; + } + }
+ if(window->browser->doc->webbrowser) { if(!(flags & BINDING_REFRESH)) { BSTR frame_name = NULL; BOOL cancel = FALSE; @@ -2488,6 +2493,9 @@ static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *dis if(is_main_content_window(window)) { BOOL cancel;
+ if(flags & BINDING_FRAGNAV) + return super_navigate(window, uri, flags, headers, post_data, post_data_len); + hres = hlink_frame_navigate(window->base.inner_window->doc->doc_obj, display_uri, NULL, 0, &cancel); if(FAILED(hres)) return hres;