WebCore:
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 May 2007 08:38:44 +0000 (08:38 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 May 2007 08:38:44 +0000 (08:38 +0000)
        Reviewed by Darin.

        <rdar://problem/5207156> Hamachi test tool causes assertion in FormCompletionController in Safari

        This happens because the form delegate gets passed the wrong source frame during the second submit().
        If a frame with the given name is found, FrameLoader::load is called with the same parameters on the found frame.
        This causes the found frame to be used as the source frame, which is wrong.

        The fix is to create the form state object before checking what frame to load the new request in.

        * WebCore.exp:
        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::load):
        (WebCore::FrameLoader::checkNavigationPolicy):
        (WebCore::FrameLoader::continueAfterNavigationPolicy):
        * loader/FrameLoader.h:
        * manual-tests/submit-form-with-target-twice.html: Added.

WebKit:

        Reviewed by Darin.

        <rdar://problem/5207156> Hamachi test tool causes assertion in FormCompletionController in Safari

        Update for WebCore changes.

        * WebView/WebFrame.mm:
        (-[WebFrame _loadURL:referrer:intoChild:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@21529 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/loader/FrameLoader.cpp
WebCore/loader/FrameLoader.h
WebKit/ChangeLog
WebKit/WebView/WebFrame.mm

index 1723dfbb7897957ab72ec03da4691d3f22841c60..ac6f143f2b0d169b7a1edc590d7d7cf2868639eb 100644 (file)
@@ -1,3 +1,23 @@
+2007-05-16  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/5207156> Hamachi test tool causes assertion in FormCompletionController in Safari
+
+        This happens because the form delegate gets passed the wrong source frame during the second submit().
+        If a frame with the given name is found, FrameLoader::load is called with the same parameters on the found frame.
+        This causes the found frame to be used as the source frame, which is wrong.
+        
+        The fix is to create the form state object before checking what frame to load the new request in. 
+        
+        * WebCore.exp:
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::load):
+        (WebCore::FrameLoader::checkNavigationPolicy):
+        (WebCore::FrameLoader::continueAfterNavigationPolicy):
+        * loader/FrameLoader.h:
+        * manual-tests/submit-form-with-target-twice.html: Added.
+
 2007-05-16  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Oliver.
index bf88cb771e1f9d4113eee2e9607176644a642e84..26d4df9d7ec3d23dab46b0d4585e60a630171473 100644 (file)
@@ -1807,8 +1807,12 @@ void FrameLoader::load(const FrameLoadRequest& request, bool userGesture, Event*
         else
             loadType = FrameLoadTypeStandard;    
     
+        RefPtr<FormState> formState;
+        if (submitForm && !formValues.isEmpty())
+            formState = FormState::create(submitForm, formValues, m_frame);
+        
         load(request.resourceRequest().url(), referrer, loadType, 
-            request.frameName(), event, submitForm, formValues);
+            request.frameName(), event, formState.release());
     } else
         post(request.resourceRequest().url(), referrer, request.frameName(), 
             request.resourceRequest().httpBody(), request.resourceRequest().httpContentType(), event, submitForm, formValues);
@@ -1818,9 +1822,9 @@ void FrameLoader::load(const FrameLoadRequest& request, bool userGesture, Event*
 }
 
 void FrameLoader::load(const KURL& URL, const String& referrer, FrameLoadType newLoadType,
-    const String& frameName, Event* event, HTMLFormElement* form, const HashMap<String, String>& values)
+    const String& frameName, Event* event, PassRefPtr<FormState> formState)
 {
-    bool isFormSubmission = !values.isEmpty();
+    bool isFormSubmission = formState;
     
     ResourceRequest request(URL);
     if (!referrer.isEmpty())
@@ -1833,15 +1837,11 @@ void FrameLoader::load(const KURL& URL, const String& referrer, FrameLoadType ne
 
     NavigationAction action(URL, newLoadType, isFormSubmission, event);
 
-    RefPtr<FormState> formState;
-    if (form && !values.isEmpty())
-        formState = FormState::create(form, values, m_frame);
-    
     if (!frameName.isEmpty()) {
         if (Frame* targetFrame = m_frame->tree()->find(frameName))
-            targetFrame->loader()->load(URL, referrer, newLoadType, String(), event, form, values);
+            targetFrame->loader()->load(URL, referrer, newLoadType, String(), event, formState);
         else
-            checkNewWindowPolicy(action, request, formState.release(), frameName);
+            checkNewWindowPolicy(action, request, formState, frameName);
         return;
     }
 
@@ -1870,12 +1870,12 @@ void FrameLoader::load(const KURL& URL, const String& referrer, FrameLoadType ne
         
         oldDocumentLoader->setTriggeringAction(action);
         stopPolicyCheck();
-        checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(),
+        checkNavigationPolicy(request, oldDocumentLoader.get(), formState,
             callContinueFragmentScrollAfterNavigationPolicy, this);
     } else {
         // must grab this now, since this load may stop the previous load and clear this flag
         bool isRedirect = m_quickRedirectComing;
-        load(request, action, newLoadType, formState.release());
+        load(request, action, newLoadType, formState);
         if (isRedirect) {
             m_quickRedirectComing = false;
             if (m_provisionalDocumentLoader)
index e76f9837790c2ef1928655776d3a0fb602e31ec2..169e2b218a79247c8288d5210657fdf244e7b2c9 100644 (file)
@@ -144,7 +144,7 @@ namespace WebCore {
         void load(const FrameLoadRequest&, bool userGesture,
             Event*, HTMLFormElement*, const HashMap<String, String>& formValues);
         void load(const KURL&, const String& referrer, FrameLoadType, const String& target,
-            Event*, HTMLFormElement*, const HashMap<String, String>& formValues);
+            Event*, PassRefPtr<FormState>);
         void post(const KURL&, const String& referrer, const String& target,
             PassRefPtr<FormData>, const String& contentType,
             Event*, HTMLFormElement*, const HashMap<String, String>& formValues);
index 140d21d9f9d66d8259936d08f39564eaac3cf90c..b0ab6a667d33a7daca152f5cd21748bb37764e20 100644 (file)
@@ -1,3 +1,14 @@
+2007-05-16  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/5207156> Hamachi test tool causes assertion in FormCompletionController in Safari
+
+        Update for WebCore changes.
+        
+        * WebView/WebFrame.mm:
+        (-[WebFrame _loadURL:referrer:intoChild:]):
+
 2007-05-15  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Sam and Geoff.
index 41fc052de83eee8a06984397af747d8e5bab3007..bc5d28b66a4d238e8ab2180342a0df255cca7e58 100644 (file)
@@ -325,7 +325,7 @@ WebView *getWebView(WebFrame *webFrame)
         [childFrame loadArchive:archive];
     else
         [childFrame _frameLoader]->load(URL, referrer, childLoadType,
-            String(), nil, 0, HashMap<String, String>());
+                                        String(), 0, 0);
 }