Reviewed by Darin.
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Mar 2007 02:17:04 +0000 (02:17 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Mar 2007 02:17:04 +0000 (02:17 +0000)
        <rdar://problem/4960250>
        http://bugs.webkit.org/show_bug.cgi?id=11627
        REGRESSION: Reproducible crash at IMDb in WebCore::FrameLoader::stopLoadingSubframes

        In rare cases, we could end up calling checkLoadComplete twice for the same frame. This would cause the
        didFailProvisionalLoad delegate method to be called twice for the same frame, and also cause the provisional document loader
        to be reset to null when other code wasn't expecting it.

        This regressed in revision 10904 with the fix for <rdar://problem/4184719>. The fix is to only call stopLoading on the frame
        if either the document loader is loading, or the document is still being parsed. I've verified that the bug is still fixed and
        that no leaks occur.

        * loader/DocumentLoader.cpp:
        (WebCore::DocumentLoader::stopLoading):

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

WebCore/ChangeLog
WebCore/loader/DocumentLoader.cpp

index ce035db..25636d8 100644 (file)
@@ -1,3 +1,22 @@
+2007-03-01  Anders Carlsson  <acarlsson@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/4960250> 
+        http://bugs.webkit.org/show_bug.cgi?id=11627
+        REGRESSION: Reproducible crash at IMDb in WebCore::FrameLoader::stopLoadingSubframes
+        
+        In rare cases, we could end up calling checkLoadComplete twice for the same frame. This would cause the 
+        didFailProvisionalLoad delegate method to be called twice for the same frame, and also cause the provisional document loader
+        to be reset to null when other code wasn't expecting it.
+        
+        This regressed in revision 10904 with the fix for <rdar://problem/4184719>. The fix is to only call stopLoading on the frame
+        if either the document loader is loading, or the document is still being parsed. I've verified that the bug is still fixed and
+        that no leaks occur.
+        
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::stopLoading):
+
 2007-03-01  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>
 
         Reviewed by Darin.
index b855bb0..712ad0b 100644 (file)
@@ -249,10 +249,14 @@ void DocumentLoader::mainReceivedError(const ResourceError& error, bool isComple
 // but not loads initiated by child frames' data sources -- that's the WebFrame's job.
 void DocumentLoader::stopLoading()
 {
-    // Always attempt to stop the frame because it may still be loading/parsing after the data source
-    // is done loading and not stopping it can cause a world leak.
-    if (m_committed)
-        m_frame->loader()->stopLoading(false);
+    if (m_committed) {
+        // Attempt to stop the frame if the document loader is loading, or if it is done loading but
+        // still  parsing. Failure to do so can cause a world leak.
+        Document* doc = m_frame->document();
+        
+        if (m_loading || (doc && doc->parsing()))
+            m_frame->loader()->stopLoading(false);
+    }
     
     if (!m_loading)
         return;