Reviewed by Anders.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Jan 2007 02:40:54 +0000 (02:40 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Jan 2007 02:40:54 +0000 (02:40 +0000)
        - fixed <rdar://problem/4963871> REGRESSION: Crash occurs at WebCore::Frame::loader() when attempting to open a saved archive file

        * loader/DocumentLoader.cpp:
        (WebCore::DocumentLoader::request): Removed obsolete FIXME.
        (WebCore::DocumentLoader::initialRequest): Ditto.
        * loader/MainResourceLoader.cpp:
        (WebCore::MainResourceLoader::MainResourceLoader): Handle data loads from a timer, otherwise bad things happen.
        (WebCore::MainResourceLoader::handleDataLoadNow):
        (WebCore::MainResourceLoader::handleDataLoadSoon):
        (WebCore::MainResourceLoader::loadNow):
        (WebCore::MainResourceLoader::didCancel): cancel data load timer
        * loader/MainResourceLoader.h:

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

WebCore/ChangeLog
WebCore/loader/DocumentLoader.cpp
WebCore/loader/MainResourceLoader.cpp
WebCore/loader/MainResourceLoader.h

index 274c204aad813c28fd69bf7bddb1f9c3c3beebe1..7100482fdef5d8779a0fd2c0c3ff964a19a9af65 100644 (file)
@@ -1,3 +1,20 @@
+2007-01-30  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Anders.
+
+        - fixed <rdar://problem/4963871> REGRESSION: Crash occurs at WebCore::Frame::loader() when attempting to open a saved archive file
+
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::request): Removed obsolete FIXME.
+        (WebCore::DocumentLoader::initialRequest): Ditto.
+        * loader/MainResourceLoader.cpp:
+        (WebCore::MainResourceLoader::MainResourceLoader): Handle data loads from a timer, otherwise bad things happen.
+        (WebCore::MainResourceLoader::handleDataLoadNow):
+        (WebCore::MainResourceLoader::handleDataLoadSoon):
+        (WebCore::MainResourceLoader::loadNow):
+        (WebCore::MainResourceLoader::didCancel): cancel data load timer
+        * loader/MainResourceLoader.h:
+
 2007-01-30  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Darin.
index c72df6daec92ac1ce5d60fc044ea56f653804eae..fe30a5effab713cc5ebf75027e17f9e2642e1bbb 100644 (file)
@@ -150,19 +150,16 @@ const ResourceRequest& DocumentLoader::originalRequestCopy() const
 
 const ResourceRequest& DocumentLoader::request() const
 {
-    // FIXME: need a better way to handle data loads
     return m_request;
 }
 
 ResourceRequest& DocumentLoader::request()
 {
-    // FIXME: need a better way to handle data loads
     return m_request;
 }
 
 const ResourceRequest& DocumentLoader::initialRequest() const
 {
-    // FIXME: need a better way to handle data loads
     return m_originalRequest;
 }
 
index 4b677446d2f9a1298312416befe719abc28d2b8b..6f2800399609695d7bb175d57e97b5c6a49390ff 100644 (file)
@@ -42,6 +42,7 @@ namespace WebCore {
 
 MainResourceLoader::MainResourceLoader(Frame* frame)
     : ResourceLoader(frame)
+    , m_dataLoadTimer(this, &MainResourceLoader::handleDataLoadNow)
     , m_loadingMultipartContent(false)
     , m_waitingForContentPolicy(false)
 {
@@ -76,6 +77,8 @@ void MainResourceLoader::receivedError(const ResourceError& error)
 
 void MainResourceLoader::didCancel(const ResourceError& error)
 {
+    m_dataLoadTimer.stop();
+
     // Calling receivedMainResourceError will likely result in the last reference to this object to go away.
     RefPtr<MainResourceLoader> protect(this);
 
@@ -318,14 +321,20 @@ void MainResourceLoader::handleEmptyLoad(const KURL& url, bool forURLScheme)
     didReceiveResponse(response);
 }
 
-void MainResourceLoader::handleDataLoad(ResourceRequest& r)
+void MainResourceLoader::handleDataLoadNow(Timer<MainResourceLoader>*)
 {
     RefPtr<MainResourceLoader> protect(this);
 
-    ResourceResponse response(r.url(), m_substituteData.mimeType(), m_substituteData.content()->size(), m_substituteData.textEncoding(), "");
+    ResourceResponse response(m_initialRequest.url(), m_substituteData.mimeType(), m_substituteData.content()->size(), m_substituteData.textEncoding(), "");
     didReceiveResponse(response);
 }
 
+void MainResourceLoader::handleDataLoadSoon(ResourceRequest& r)
+{
+    m_initialRequest = r;
+    m_dataLoadTimer.startOneShot(0);
+}
+
 bool MainResourceLoader::loadNow(ResourceRequest& r)
 {
     bool shouldLoadEmptyBeforeRedirect = shouldLoadAsEmptyDocument(r.url());
@@ -350,7 +359,7 @@ bool MainResourceLoader::loadNow(ResourceRequest& r)
         return true;
 
     if (m_substituteData.isValid())
-        handleDataLoad(r);
+        handleDataLoadSoon(r);
     else if (shouldLoadEmpty || frameLoader()->representationExistsForURLScheme(url.protocol()))
         handleEmptyLoad(url, !shouldLoadEmpty);
     else
index a76f39f4ee8a7ac1a279471798a5a7cd90096929..f07331b68dcda2ac91707d159b7397313287bbdf 100644 (file)
@@ -29,6 +29,7 @@
 #include "FrameLoaderTypes.h"
 #include "ResourceLoader.h"
 #include "SubstituteData.h"
+#include "Timer.h"
 #include <wtf/Forward.h>
 
 namespace WebCore {
@@ -52,6 +53,8 @@ namespace WebCore {
         virtual void didFinishLoading();
         virtual void didFail(const ResourceError&);
 
+        void handleDataLoadNow(Timer<MainResourceLoader>*);
+
     private:
         MainResourceLoader(Frame*);
 
@@ -60,6 +63,8 @@ namespace WebCore {
         bool loadNow(ResourceRequest&);
 
         void handleEmptyLoad(const KURL&, bool forURLScheme);
+        void handleDataLoadSoon(ResourceRequest& r);
+
         void handleDataLoad(ResourceRequest&);
 
         void receivedError(const ResourceError&);
@@ -76,6 +81,7 @@ namespace WebCore {
 
         ResourceRequest m_initialRequest;
         SubstituteData m_substituteData;
+        Timer<MainResourceLoader> m_dataLoadTimer;
 
         bool m_loadingMultipartContent;
         bool m_waitingForContentPolicy;