A service worker instance should be terminated when its SWServer is destroyed
https://bugs.webkit.org/show_bug.cgi?id=197801
<rdar://problem/50587270>

Reviewed by Chris Dumez.

Source/WebCore:

On session destruction, the SWServer is destroyed.
At that time, it should terminate all its running service workers.
Covered by updated API test.

* workers/service/server/SWServer.cpp:
(WebCore::SWServer::~SWServer):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@245200 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 0bec278..08adb42 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,18 @@
+2019-05-10  Youenn Fablet  <youenn@apple.com>
+
+        A service worker instance should be terminated when its SWServer is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=197801
+        <rdar://problem/50587270>
+
+        Reviewed by Chris Dumez.
+
+        On session destruction, the SWServer is destroyed.
+        At that time, it should terminate all its running service workers.
+        Covered by updated API test.
+
+        * workers/service/server/SWServer.cpp:
+        (WebCore::SWServer::~SWServer):
+
 2019-05-10  Eric Carlson  <eric.carlson@apple.com>
 
         [iOS] HTMLMediaElement sometimes doesn't send 'webkitplaybacktargetavailabilitychanged' event
diff --git a/Source/WebCore/workers/service/server/SWServer.cpp b/Source/WebCore/workers/service/server/SWServer.cpp
index 2a283f4..0200ec6 100644
--- a/Source/WebCore/workers/service/server/SWServer.cpp
+++ b/Source/WebCore/workers/service/server/SWServer.cpp
@@ -69,6 +69,14 @@
     auto connections = WTFMove(m_connections);
     connections.clear();
 
+    Vector<SWServerWorker*> runningWorkers;
+    for (auto& worker : m_runningOrTerminatingWorkers.values()) {
+        if (worker->isRunning())
+            runningWorkers.append(worker.ptr());
+    }
+    for (auto& runningWorker : runningWorkers)
+        terminateWorker(*runningWorker);
+
     allServers().remove(this);
 }
 
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 102acb2..c7f70eb 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,13 @@
+2019-05-10  Youenn Fablet  <youenn@apple.com>
+
+        A service worker instance should be terminated when its SWServer is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=197801
+        <rdar://problem/50587270>
+
+        Reviewed by Chris Dumez.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
+
 2019-05-10  Chris Dumez  <cdumez@apple.com>
 
         Do not wait until requestPermission() is called to fire deviceorientation events if permission was already granted
diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm
index 4cd1b33..3dd4d7b 100644
--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm
+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm
@@ -32,6 +32,7 @@
 #import <WebKit/WKURLSchemeHandler.h>
 #import <WebKit/WKURLSchemeTaskPrivate.h>
 #import <WebKit/WKWebViewConfigurationPrivate.h>
+#import <WebKit/WKWebViewPrivate.h>
 #import <WebKit/WKWebsiteDataStorePrivate.h>
 #import <WebKit/WKWebsiteDataStoreRef.h>
 #import <WebKit/WebKit.h>
@@ -1502,6 +1503,7 @@
     TestWebKitAPI::Util::run(&done);
     done = false;
 
+    [webView _close];
     webView = nullptr;
 
     EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:serviceWorkersPath.path]);