Title: [138397] trunk/Source/WebKit2
Revision
138397
Author
[email protected]
Date
2012-12-21 14:17:43 -0800 (Fri, 21 Dec 2012)

Log Message

ASSERT in WebResourceLoadScheduler::scheduleLoad with a crashed NetworkProcess.
<rdar://problem/12924845> and https://bugs.webkit.org/show_bug.cgi?id=105646

Reviewed by Alexey Proskuryakov.

If we fail to schedule a loader with the NetworkProcess it is probably because the NetworkProcess crashed.

Since these loaders will never succeed in loading we should schedule them to fail on a timer.

* WebProcess/Network/WebResourceLoadScheduler.cpp:
(WebKit::WebResourceLoadScheduler::WebResourceLoadScheduler):
(WebKit::WebResourceLoadScheduler::scheduleLoad):
(WebKit::WebResourceLoadScheduler::addUnschedulableLoad):
(WebKit::WebResourceLoadScheduler::unscheduledLoadTimerFired):
(WebKit::WebResourceLoadScheduler::remove):
* WebProcess/Network/WebResourceLoadScheduler.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (138396 => 138397)


--- trunk/Source/WebKit2/ChangeLog	2012-12-21 21:00:18 UTC (rev 138396)
+++ trunk/Source/WebKit2/ChangeLog	2012-12-21 22:17:43 UTC (rev 138397)
@@ -1,3 +1,22 @@
+2012-12-21  Brady Eidson  <[email protected]>
+
+        ASSERT in WebResourceLoadScheduler::scheduleLoad with a crashed NetworkProcess.
+        <rdar://problem/12924845> and https://bugs.webkit.org/show_bug.cgi?id=105646
+
+        Reviewed by Alexey Proskuryakov.
+
+        If we fail to schedule a loader with the NetworkProcess it is probably because the NetworkProcess crashed.
+
+        Since these loaders will never succeed in loading we should schedule them to fail on a timer.
+
+        * WebProcess/Network/WebResourceLoadScheduler.cpp:
+        (WebKit::WebResourceLoadScheduler::WebResourceLoadScheduler):
+        (WebKit::WebResourceLoadScheduler::scheduleLoad):
+        (WebKit::WebResourceLoadScheduler::addUnschedulableLoad):
+        (WebKit::WebResourceLoadScheduler::unscheduledLoadTimerFired):
+        (WebKit::WebResourceLoadScheduler::remove):
+        * WebProcess/Network/WebResourceLoadScheduler.h:
+
 2012-12-21  Kenneth Rohde Christiansen  <[email protected]>
 
         Unreviewed potential fix EFL/Qt test breakage on WK2

Modified: trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp (138396 => 138397)


--- trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp	2012-12-21 21:00:18 UTC (rev 138396)
+++ trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp	2012-12-21 22:17:43 UTC (rev 138397)
@@ -51,7 +51,8 @@
 namespace WebKit {
 
 WebResourceLoadScheduler::WebResourceLoadScheduler()
-    : m_suspendPendingRequestsCount(0)
+    : m_unschedulableLoadTimer(RunLoop::main(), this, &WebResourceLoadScheduler::unscheduledLoadTimerFired)
+    , m_suspendPendingRequestsCount(0)
 {
 }
 
@@ -102,8 +103,10 @@
 
     NetworkResourceLoadParameters loadParameters(request, priority, resourceLoader->shouldSniffContent() ? SniffContent : DoNotSniffContent, allowStoredCredentials, resourceLoader->frameLoader()->frame()->settings()->privateBrowsingEnabled());
     if (!WebProcess::shared().networkConnection()->connection()->sendSync(Messages::NetworkConnectionToWebProcess::ScheduleResourceLoad(loadParameters), Messages::NetworkConnectionToWebProcess::ScheduleResourceLoad::Reply(identifier), 0)) {
-        // FIXME (NetworkProcess): What should we do if this fails?
-        ASSERT_NOT_REACHED();
+        // We probably failed to schedule this load with the NetworkProcess because it had crashed.
+        // This load will never succeed so we will schedule it to fail asynchronously.
+        addUnschedulableLoad(resourceLoader);
+        return;
     }
     
     resourceLoader->setIdentifier(identifier);
@@ -112,11 +115,31 @@
     notifyDidScheduleResourceRequest(resourceLoader);
 }
 
+void WebResourceLoadScheduler::addUnschedulableLoad(WebCore::ResourceLoader* resourceLoader)
+{
+    m_unschedulableResourceLoaders.add(resourceLoader);
+    m_unschedulableLoadTimer.startOneShot(0);
+}
+
+void WebResourceLoadScheduler::unscheduledLoadTimerFired()
+{
+    Vector<RefPtr<ResourceLoader> > unschedulableLoaders;
+    copyToVector(m_unschedulableResourceLoaders, unschedulableLoaders);
+    
+    for (size_t i = 0; i < unschedulableLoaders.size(); ++i)
+        unschedulableLoaders[i]->didFail(internalError(unschedulableLoaders[i]->url()));
+}
+
 void WebResourceLoadScheduler::remove(ResourceLoader* resourceLoader)
 {
     ASSERT(resourceLoader);
     LOG(NetworkScheduling, "(WebProcess) WebResourceLoadScheduler::remove, url '%s'", resourceLoader->url().string().utf8().data());
 
+    if (m_unschedulableResourceLoaders.contains(resourceLoader)) {
+        m_unschedulableResourceLoaders.remove(resourceLoader);
+        return;
+    }
+
     // FIXME (NetworkProcess): It's possible for a resourceLoader to be removed before it ever started,
     // meaning before it even has an identifier.
     // We should make this not be possible.

Modified: trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h (138396 => 138397)


--- trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h	2012-12-21 21:00:18 UTC (rev 138396)
+++ trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h	2012-12-21 22:17:43 UTC (rev 138397)
@@ -30,6 +30,7 @@
 #include <WebCore/ResourceLoadPriority.h>
 #include <WebCore/ResourceLoadScheduler.h>
 #include <WebCore/ResourceLoader.h>
+#include <WebCore/RunLoop.h>
 
 #if ENABLE(NETWORK_PROCESS)
 
@@ -63,7 +64,12 @@
 
 private:
     void scheduleLoad(WebCore::ResourceLoader*, WebCore::ResourceLoadPriority);
+    void addUnschedulableLoad(WebCore::ResourceLoader*);
+    void unscheduledLoadTimerFired();
     
+    HashSet<RefPtr<WebCore::ResourceLoader> > m_unschedulableResourceLoaders;
+    WebCore::RunLoop::Timer<WebResourceLoadScheduler> m_unschedulableLoadTimer;
+    
     HashMap<unsigned long, RefPtr<WebResourceLoader> > m_webResourceLoaders;
     
     unsigned m_suspendPendingRequestsCount;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to