Andrew Eikum : mshtml: Support new window targets for FORM elements.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 16 15:06:06 CST 2014


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Dec 16 09:13:05 2014 -0600

mshtml: Support new window targets for FORM elements.

---

 dlls/mshtml/binding.h    |  4 ++--
 dlls/mshtml/hlink.c      |  2 +-
 dlls/mshtml/htmlanchor.c |  2 +-
 dlls/mshtml/htmlform.c   | 27 +++++++++++++++------------
 dlls/mshtml/htmlwindow.c |  2 +-
 dlls/mshtml/navigate.c   | 36 +++++++++++++++++++++++++-----------
 6 files changed, 45 insertions(+), 28 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 073f2fb..e40735c 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -138,9 +138,9 @@ HRESULT set_moniker(HTMLOuterWindow*,IMoniker*,IUri*,IBindCtx*,nsChannelBSC*,BOO
 void prepare_for_binding(HTMLDocument*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
 HRESULT super_navigate(HTMLOuterWindow*,IUri*,DWORD,const WCHAR*,BYTE*,DWORD) DECLSPEC_HIDDEN;
 HRESULT load_uri(HTMLOuterWindow*,IUri*,DWORD) DECLSPEC_HIDDEN;
-HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,IHTMLWindow2**) DECLSPEC_HIDDEN;
+HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,request_data_t*,IHTMLWindow2**) DECLSPEC_HIDDEN;
 HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,IUri*,DWORD) DECLSPEC_HIDDEN;
-HRESULT submit_form(HTMLOuterWindow*,IUri*,nsIInputStream*) DECLSPEC_HIDDEN;
+HRESULT submit_form(HTMLOuterWindow*,const WCHAR*,IUri*,nsIInputStream*) DECLSPEC_HIDDEN;
 
 void init_bscallback(BSCallback*,const BSCallbackVtbl*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
 HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,BOOL,nsChannelBSC**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/hlink.c b/dlls/mshtml/hlink.c
index 4e63498..7ce0423 100644
--- a/dlls/mshtml/hlink.c
+++ b/dlls/mshtml/hlink.c
@@ -85,7 +85,7 @@ static HRESULT WINAPI HlinkTarget_Navigate(IHlinkTarget *iface, DWORD grfHLNF, L
         FIXME("JumpLocation not supported\n");
 
     if(!This->doc_obj->client)
-        return navigate_new_window(This->window, This->window->uri, NULL, NULL);
+        return navigate_new_window(This->window, This->window->uri, NULL, NULL, NULL);
 
     return IOleObject_DoVerb(&This->IOleObject_iface, OLEIVERB_SHOW, NULL, NULL, -1, NULL, NULL);
 }
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index df95c2b..6650a44 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -65,7 +65,7 @@ static HRESULT navigate_anchor_window(HTMLAnchorElement *This, const WCHAR *targ
     if(FAILED(hres))
         return hres;
 
-    hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL);
+    hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL, NULL);
     IUri_Release(uri);
     return hres;
 }
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c
index e901dbe..2b2a62f 100644
--- a/dlls/mshtml/htmlform.c
+++ b/dlls/mshtml/htmlform.c
@@ -389,6 +389,7 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
     IUri *uri;
     nsresult nsres;
     HRESULT hres;
+    BOOL use_new_window;
 
     TRACE("(%p)->()\n", This);
 
@@ -404,22 +405,21 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
 
     nsAString_Init(&target_str, NULL);
     nsres = nsIDOMHTMLFormElement_GetTarget(This->nsform, &target_str);
-    if(NS_SUCCEEDED(nsres)) {
-        BOOL use_new_window;
+    if(NS_SUCCEEDED(nsres))
         window = get_target_window(this_window, &target_str, &use_new_window);
-        if(use_new_window)
-            FIXME("submit to new window is not supported\n");
-    }
-    nsAString_Finish(&target_str);
-    if(!window)
+
+    if(!window && !use_new_window) {
+        nsAString_Finish(&target_str);
         return S_OK;
+    }
 
     /*
      * FIXME: We currently don't use our submit implementation for sub-windows because
      * load_nsuri can't support post data. We should fix it.
      */
-    if(!window->doc_obj || window->doc_obj->basedoc.window != window) {
+    if(window && (!window->doc_obj || window->doc_obj->basedoc.window != window)) {
         nsres = nsIDOMHTMLFormElement_Submit(This->nsform);
+        nsAString_Finish(&target_str);
         IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
         if(NS_FAILED(nsres)) {
             ERR("Submit failed: %08x\n", nsres);
@@ -442,13 +442,16 @@ static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface)
     }
     nsAString_Finish(&action_uri_str);
     if(SUCCEEDED(hres)) {
-        window->readystate_locked++;
-        hres = submit_form(window, uri, post_stream);
-        window->readystate_locked--;
+        const PRUnichar *target;
+
+        nsAString_GetData(&target_str, &target);
+        hres = submit_form(window, target, uri, post_stream);
         IUri_Release(uri);
     }
 
-    IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
+    nsAString_Finish(&target_str);
+    if(window)
+        IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
     if(post_stream)
         nsIInputStream_Release(post_stream);
     return hres;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 6c6c328..82bb374 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -967,7 +967,7 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
     if(FAILED(hres))
         return hres;
 
-    hres = navigate_new_window(window, uri, name, pomWindowResult);
+    hres = navigate_new_window(window, uri, name, NULL, pomWindowResult);
     IUri_Release(uri);
     return hres;
 }
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 85e47aa..2ac12ea 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -2107,7 +2107,7 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
     return hres;
 }
 
-HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *name, IHTMLWindow2 **ret)
+HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *name, request_data_t *request_data, IHTMLWindow2 **ret)
 {
     IWebBrowser2 *web_browser;
     IHTMLWindow2 *new_window;
@@ -2115,7 +2115,12 @@ HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *nam
     nsChannelBSC *bsc;
     HRESULT hres;
 
-    hres = create_channelbsc(NULL, NULL, NULL, 0, FALSE, &bsc);
+    if(request_data)
+        hres = create_channelbsc(NULL, request_data->headers,
+                request_data->post_data, request_data->post_data_len, FALSE,
+                &bsc);
+    else
+        hres = create_channelbsc(NULL, NULL, NULL, 0, FALSE, &bsc);
     if(FAILED(hres))
         return hres;
 
@@ -2322,23 +2327,32 @@ static HRESULT translate_uri(HTMLOuterWindow *window, IUri *orig_uri, BSTR *ret_
     return S_OK;
 }
 
-HRESULT submit_form(HTMLOuterWindow *window, IUri *submit_uri, nsIInputStream *post_stream)
+HRESULT submit_form(HTMLOuterWindow *window, const WCHAR *target, IUri *submit_uri, nsIInputStream *post_stream)
 {
     request_data_t request_data = {NULL};
-    BSTR display_uri;
-    IUri *uri;
     HRESULT hres;
 
     hres = read_post_data_stream(post_stream, TRUE, NULL, &request_data);
     if(FAILED(hres))
         return hres;
 
-    hres = translate_uri(window, submit_uri, &display_uri, &uri);
-    if(SUCCEEDED(hres)) {
-        hres = navigate_uri(window, uri, display_uri, &request_data, BINDING_NAVIGATED|BINDING_SUBMIT);
-        IUri_Release(uri);
-        SysFreeString(display_uri);
-    }
+    if(window) {
+        IUri *uri;
+        BSTR display_uri;
+
+        window->readystate_locked++;
+
+        hres = translate_uri(window, submit_uri, &display_uri, &uri);
+        if(SUCCEEDED(hres)) {
+            hres = navigate_uri(window, uri, display_uri, &request_data, BINDING_NAVIGATED|BINDING_SUBMIT);
+            IUri_Release(uri);
+            SysFreeString(display_uri);
+        }
+
+        window->readystate_locked--;
+    }else
+        hres = navigate_new_window(window, submit_uri, target, &request_data, NULL);
+
     release_request_data(&request_data);
     return hres;
 }




More information about the wine-cvs mailing list