Debug crash: ASSERTION FAILED: m_ongoingFetches.contains(task.fetchIdentifier())
https://bugs.webkit.org/show_bug.cgi?id=209743

Reviewed by Darin Adler.

Source/WebKit:

When context gets closed, we make ServiceWorkerFetchTask::m_serviceWorkerConnection null as it no longer
needs to send messages and does not need to unregister itself.

Test: http/wpt/service-workers/service-worker-crashing-while-fetching.https.html

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

LayoutTests:

* http/wpt/service-workers/service-worker-crashing-while-fetching.https-expected.txt: Added.
* http/wpt/service-workers/service-worker-crashing-while-fetching.https.html: Added.
* http/wpt/service-workers/service-worker-lengthy-worker.js: Added.
(fetchTest):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@259384 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 38007bc..50659d8 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,5 +1,17 @@
 2020-04-02  youenn fablet  <youenn@apple.com>
 
+        Debug crash: ASSERTION FAILED: m_ongoingFetches.contains(task.fetchIdentifier())
+        https://bugs.webkit.org/show_bug.cgi?id=209743
+
+        Reviewed by Darin Adler.
+
+        * http/wpt/service-workers/service-worker-crashing-while-fetching.https-expected.txt: Added.
+        * http/wpt/service-workers/service-worker-crashing-while-fetching.https.html: Added.
+        * http/wpt/service-workers/service-worker-lengthy-worker.js: Added.
+        (fetchTest):
+
+2020-04-02  youenn fablet  <youenn@apple.com>
+
         Remove synchronous termination of service workers
         https://bugs.webkit.org/show_bug.cgi?id=209666
 
diff --git a/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https-expected.txt b/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https-expected.txt
new file mode 100644
index 0000000..3c103f6
--- /dev/null
+++ b/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https-expected.txt
@@ -0,0 +1,7 @@
+CONSOLE MESSAGE: Service Worker context closed
+CONSOLE MESSAGE: Cannot load .
+
+
+PASS Setup worker 
+PASS Service worker process crashes while handling a fetch event 
+
diff --git a/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https.html b/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https.html
new file mode 100644
index 0000000..41da595
--- /dev/null
+++ b/LayoutTests/http/wpt/service-workers/service-worker-crashing-while-fetching.https.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/routines.js"></script>
+</head>
+<body>
+<script>
+var activeWorker;
+
+promise_test(async (test) => {
+    if (window.testRunner) {
+        testRunner.setUseSeparateServiceWorkerProcess(true);
+        await fetch("").then(() => { }, () => { });
+    }
+
+    var registration = await navigator.serviceWorker.register("service-worker-lengthy-worker.js", { scope : "lengthy-fetch" });
+    activeWorker = registration.active;
+    if (activeWorker)
+        return;
+    activeWorker = registration.installing;
+    return new Promise(resolve => {
+        activeWorker.addEventListener('statechange', () => {
+            if (activeWorker.state === "activated")
+                resolve();
+        });
+    });
+}, "Setup worker");
+
+promise_test(async (test) => {
+    withIframe("lengthy-fetch");
+    // We wait for 1 second for the service worker to get the fetch event and start responding. 
+    await new Promise(resolve => setTimeout(resolve, 1000));
+    if (window.testRunner)
+        testRunner.terminateServiceWorkers();
+    await waitForServiceWorkerNoLongerRunning(activeWorker);
+}, "Service worker process crashes while handling a fetch event");
+</script>
+</body>
+</html>
diff --git a/LayoutTests/http/wpt/service-workers/service-worker-lengthy-worker.js b/LayoutTests/http/wpt/service-workers/service-worker-lengthy-worker.js
new file mode 100644
index 0000000..06d0f74
--- /dev/null
+++ b/LayoutTests/http/wpt/service-workers/service-worker-lengthy-worker.js
@@ -0,0 +1,6 @@
+function fetchTest(event)
+{
+    event.respondWith(fetch("/WebKit/service-workers/resources/lengthy-pass.py?delay=0.5"));
+}
+
+self.addEventListener("fetch", fetchTest);
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index a727d4f..012895a 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,5 +1,20 @@
 2020-04-02  youenn fablet  <youenn@apple.com>
 
+        Debug crash: ASSERTION FAILED: m_ongoingFetches.contains(task.fetchIdentifier())
+        https://bugs.webkit.org/show_bug.cgi?id=209743
+
+        Reviewed by Darin Adler.
+
+        When context gets closed, we make ServiceWorkerFetchTask::m_serviceWorkerConnection null as it no longer
+        needs to send messages and does not need to unregister itself.
+
+        Test: http/wpt/service-workers/service-worker-crashing-while-fetching.https.html
+
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
+        (WebKit::ServiceWorkerFetchTask::contextClosed):
+
+2020-04-02  youenn fablet  <youenn@apple.com>
+
         Remove synchronous termination of service workers
         https://bugs.webkit.org/show_bug.cgi?id=209666
 
diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
index 5c2e7c0..0faea14 100644
--- a/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
+++ b/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
@@ -94,6 +94,7 @@
 void ServiceWorkerFetchTask::contextClosed()
 {
     RELEASE_LOG_IF_ALLOWED("contextClosed: (m_isDone=%d, m_wasHandled=%d)", m_isDone, m_wasHandled);
+    m_serviceWorkerConnection = nullptr;
     if (m_isDone)
         return;