WebSWServerToContextConnection should not assert when failing loads at destruction time
https://bugs.webkit.org/show_bug.cgi?id=203243

Reviewed by Alex Christensen.

On WebSWServerToContextConnection destruction, we move the fetch task map and fail the tasks.
At destruction of the tasks, which happens synchronously, they will try to unregister themselves
and the assertion that the task is in the map will fail.
To fix that, add a specific contextClosed method that will clear the task connection weak pointer.

* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
(WebKit::ServiceWorkerFetchTask::contextClosed):
* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
* NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
(WebKit::WebSWServerToContextConnection::~WebSWServerToContextConnection):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251434 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 48d3405..38e7f95 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,5 +1,23 @@
 2019-10-22  youenn fablet  <youenn@apple.com>
 
+        WebSWServerToContextConnection should not assert when failing loads at destruction time
+        https://bugs.webkit.org/show_bug.cgi?id=203243
+
+        Reviewed by Alex Christensen.
+
+        On WebSWServerToContextConnection destruction, we move the fetch task map and fail the tasks.
+        At destruction of the tasks, which happens synchronously, they will try to unregister themselves
+        and the assertion that the task is in the map will fail.
+        To fix that, add a specific contextClosed method that will clear the task connection weak pointer.
+
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
+        (WebKit::ServiceWorkerFetchTask::contextClosed):
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
+        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
+        (WebKit::WebSWServerToContextConnection::~WebSWServerToContextConnection):
+
+2019-10-22  youenn fablet  <youenn@apple.com>
+
         ServiceWorkerFetchTask can use the NetworkConnectionToWebProcess sessionID
         https://bugs.webkit.org/show_bug.cgi?id=202208
 
diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
index 67edacf..f0718aa 100644
--- a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
+++ b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
@@ -84,6 +84,12 @@
     startFetch();
 }
 
+void ServiceWorkerFetchTask::contextClosed()
+{
+    m_serviceWorkerConnection = nullptr;
+    didFail(ResourceError { errorDomainWebKitInternal, 0, { }, "Service Worker context closed"_s });
+}
+
 void ServiceWorkerFetchTask::startFetch()
 {
     auto& options = m_loader.parameters().options;
diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h
index 99d65da..d716bbe 100644
--- a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h
+++ b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h
@@ -75,6 +75,8 @@
     WebCore::ResourceRequest takeRequest() { return WTFMove(m_currentRequest); }
     bool wasHandled() const { return m_wasHandled; }
 
+    void contextClosed();
+
 private:
     void didReceiveRedirectResponse(WebCore::ResourceResponse&&);
     void didReceiveResponse(WebCore::ResourceResponse&&, bool needsContinueDidReceiveResponseMessage);
diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp
index c850a93..24d79e7 100644
--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp
+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp
@@ -55,7 +55,7 @@
 {
     auto fetches = WTFMove(m_ongoingFetches);
     for (auto& fetch : fetches.values())
-        fetch->fail(ResourceError { errorDomainWebKitInternal, 0, { }, "Service Worker context closed"_s });
+        fetch->contextClosed();
 
     if (m_server && m_server->contextConnectionForRegistrableDomain(registrableDomain()) == this)
         m_server->removeContextConnection(*this);