Reviewed by Maciej (and also tweaked a little bit).
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Jan 2008 12:03:28 +0000 (12:03 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Jan 2008 12:03:28 +0000 (12:03 +0000)
        - more thorough fix for some crashing tests
          http://bugs.webkit.org/show_bug.cgi?id=16782

        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::urlSelected):
        (WebCore::FrameLoader::submitForm):
        (WebCore::FrameLoader::executeIfJavaScriptURL):
        * loader/FrameLoader.h:

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

WebCore/ChangeLog
WebCore/loader/FrameLoader.cpp
WebCore/loader/FrameLoader.h

index 8083012eba450059e6c8141364b588c39b0a897d..11be9cfa858d07bb015ae4f23eeb5e78984736a2 100644 (file)
@@ -1,3 +1,16 @@
+2008-01-12  Adam Barth  <hk9565@gmail.com>
+
+        Reviewed by Maciej (and also tweaked a little bit).
+
+        - more thorough fix for some crashing tests
+          http://bugs.webkit.org/show_bug.cgi?id=16782
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::urlSelected):
+        (WebCore::FrameLoader::submitForm):
+        (WebCore::FrameLoader::executeIfJavaScriptURL):
+        * loader/FrameLoader.h:
+
 2008-01-12  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Sam.
index 0eb71d6b1fcf25a9f577270fbe144ebf34e7b5c9..a2b16aa6db7169eee52fc7337637e0c606fd494e 100644 (file)
@@ -376,12 +376,15 @@ void FrameLoader::changeLocation(const KURL& url, const String& referrer, bool l
         ? ReloadIgnoringCacheData : UseProtocolCachePolicy;
     ResourceRequest request(url, referrer, policy);
     
+    if (executeIfJavaScriptURL(request.url(), userGesture))
+        return;
+
     urlSelected(request, "_self", 0, lockHistory, userGesture);
 }
 
 void FrameLoader::urlSelected(const ResourceRequest& request, const String& _target, Event* triggeringEvent, bool lockHistory, bool userGesture)
 {
-    if (executeIfJavaScriptURL(request.url(), userGesture))
+    if (executeIfJavaScriptURL(request.url(), userGesture, false))
         return;
 
     String target = _target;
@@ -501,7 +504,7 @@ void FrameLoader::submitForm(const char* action, const String& url, PassRefPtr<F
     DeprecatedString urlString = u.deprecatedString();
     if (urlString.startsWith("javascript:", false)) {
         m_isExecutingJavaScriptFormAction = true;
-        executeIfJavaScriptURL(u);
+        executeIfJavaScriptURL(u, false, false);
         m_isExecutingJavaScriptFormAction = false;
         return;
     }
@@ -710,7 +713,7 @@ void FrameLoader::didExplicitOpen()
         m_URL = m_frame->document()->url();
 }
 
-bool FrameLoader::executeIfJavaScriptURL(const KURL& url, bool userGesture)
+bool FrameLoader::executeIfJavaScriptURL(const KURL& url, bool userGesture, bool replaceDocument)
 {
     if (!url.deprecatedString().startsWith("javascript:", false))
         return false;
@@ -726,9 +729,14 @@ bool FrameLoader::executeIfJavaScriptURL(const KURL& url, bool userGesture)
     if (m_frame->document())
         currentSecurityOrigin = m_frame->document()->securityOrigin();
 
-    begin(m_URL, true, currentSecurityOrigin);
-    write(scriptResult);
-    end();
+    // FIXME: We should always replace the document, but doing so
+    //        synchronously can cause crashes:
+    //        http://bugs.webkit.org/show_bug.cgi?id=16782
+    if (replaceDocument) {
+        begin(m_URL, true, currentSecurityOrigin);
+        write(scriptResult);
+        end();
+    }
 
     return true;
 }
index 558198c12a17a393278de9476650d5d7edce3264..725e5f32a26d57fafcb2bb6acd12e462688c9bed 100644 (file)
@@ -320,7 +320,7 @@ namespace WebCore {
         String encoding() const;
 
         // Returns true if url is a JavaScript URL.
-        bool executeIfJavaScriptURL(const KURL& url, bool userGesture = false);
+        bool executeIfJavaScriptURL(const KURL& url, bool userGesture = false, bool replaceDocument = true);
 
         KJS::JSValue* executeScript(const String& url, int baseLine, const String& script);
         KJS::JSValue* executeScript(const String& script, bool forceUserGesture = false);