Jacek Caban : mshtml: Don't pass hash part of URI to EvaluateNewWindow.

Alexandre Julliard julliard at winehq.org
Fri Nov 9 11:03:23 CST 2012


Module: wine
Branch: master
Commit: e0a33d0480145f198a6204d980710d087027f597
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e0a33d0480145f198a6204d980710d087027f597

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov  8 18:16:42 2012 +0100

mshtml: Don't pass hash part of URI to EvaluateNewWindow.

---

 dlls/mshtml/binding.h        |    2 ++
 dlls/mshtml/htmlwindow.c     |   13 +++++++++----
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/nsio.c           |    2 +-
 dlls/mshtml/persist.c        |   12 ++++++++++++
 5 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 4d19c46..f0e1cd5 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -116,4 +116,6 @@ void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISuppo
 IUri *nsuri_get_uri(nsWineURI*) DECLSPEC_HIDDEN;
 HRESULT create_relative_uri(HTMLOuterWindow*,const WCHAR*,IUri**) DECLSPEC_HIDDEN;
 
+IUri *get_uri_nofrag(IUri*) DECLSPEC_HIDDEN;
+
 HRESULT bind_mon_to_wstr(HTMLInnerWindow*,IMoniker*,WCHAR**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 28b3b7f..0c3d7df 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -857,13 +857,14 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     HTMLOuterWindow *window = This->outer_window;
     INewWindowManager *new_window_mgr;
+    BSTR uri_str;
     IUri *uri;
     HRESULT hres;
 
     TRACE("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
           debugstr_w(features), replace, pomWindowResult);
 
-    if(!window->doc_obj)
+    if(!window->doc_obj || !window->uri_nofrag)
         return E_UNEXPECTED;
 
     if(name && *name == '_') {
@@ -878,10 +879,14 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
         return E_NOTIMPL;
     }
 
-    hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, window->url,
-            features, !!replace, window->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
+    hres = IUri_GetDisplayUri(window->uri_nofrag, &uri_str);
+    if(SUCCEEDED(hres)) {
+        hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, uri_str,
+                features, !!replace, window->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
+        window->doc_obj->has_popup = TRUE;
+        SysFreeString(uri_str);
+    }
     INewWindowManager_Release(new_window_mgr);
-    window->doc_obj->has_popup = TRUE;
     if(FAILED(hres)) {
         *pomWindowResult = NULL;
         return S_OK;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f94f226..97cd165 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -372,6 +372,7 @@ struct HTMLOuterWindow {
     HTMLInnerWindow *pending_window;
     IMoniker *mon;
     IUri *uri;
+    IUri *uri_nofrag;
     BSTR url;
 
     SCRIPTMODE scriptmode;
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 7fc2a3a..204879f 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -94,7 +94,7 @@ IUri *nsuri_get_uri(nsWineURI *nsuri)
     return nsuri->uri;
 }
 
-static IUri *get_uri_nofrag(IUri *uri)
+IUri *get_uri_nofrag(IUri *uri)
 {
     IUriBuilder *uri_builder;
     IUri *ret;
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index e29bb25..0c279c0 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -106,6 +106,11 @@ void set_current_uri(HTMLOuterWindow *window, IUri *uri)
         window->uri = NULL;
     }
 
+    if(window->uri_nofrag) {
+        IUri_Release(window->uri_nofrag);
+        window->uri_nofrag = NULL;
+    }
+
     SysFreeString(window->url);
     window->url = NULL;
 
@@ -115,6 +120,13 @@ void set_current_uri(HTMLOuterWindow *window, IUri *uri)
     IUri_AddRef(uri);
     window->uri = uri;
 
+    window->uri_nofrag = get_uri_nofrag(uri);
+    if(!window->uri_nofrag) {
+        FIXME("get_uri_nofrag failed\n");
+        IUri_AddRef(uri);
+        window->uri_nofrag = uri;
+    }
+
     IUri_GetDisplayUri(uri, &window->url);
 }
 




More information about the wine-cvs mailing list