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