[iOS Sim Debug] ASSERTION FAILED: m_downloads.isEmpty() Layout Test http/tests/websoc...
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Apr 2019 16:11:46 +0000 (16:11 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Apr 2019 16:11:46 +0000 (16:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=196781
<rdar://problem/49789381>

Reviewed by Darin Adler.

When the network process gets terminated by the client, the NetworkProcessProxy object (and thus its DownloadProxyMap member) get
destroyed right away, before we get a call to didClose(IPC::Connection&). As a result, if there are ongoing downloads at the time
of the termination, we will hit the assertion above. To address the issue, update the NetworkProcessProxy destructor to invalidate
its DownloadProxyMap member, similator to what it does in didClose(IPC::Connection&).

* UIProcess/Downloads/DownloadProxyMap.cpp:
(WebKit::DownloadProxyMap::invalidate):
(WebKit::DownloadProxyMap::processDidClose): Deleted.
* UIProcess/Downloads/DownloadProxyMap.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::~NetworkProcessProxy):
(WebKit::NetworkProcessProxy::didClose):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244217 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp
Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h
Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

index 2bf34ab..f35138c 100644 (file)
@@ -1,3 +1,24 @@
+2019-04-12  Chris Dumez  <cdumez@apple.com>
+
+        [iOS Sim Debug] ASSERTION FAILED: m_downloads.isEmpty() Layout Test http/tests/websocket/tests/hybi/network-process-crash-error.html is a flaky crash
+        https://bugs.webkit.org/show_bug.cgi?id=196781
+        <rdar://problem/49789381>
+
+        Reviewed by Darin Adler.
+
+        When the network process gets terminated by the client, the NetworkProcessProxy object (and thus its DownloadProxyMap member) get
+        destroyed right away, before we get a call to didClose(IPC::Connection&). As a result, if there are ongoing downloads at the time
+        of the termination, we will hit the assertion above. To address the issue, update the NetworkProcessProxy destructor to invalidate
+        its DownloadProxyMap member, similator to what it does in didClose(IPC::Connection&).
+
+        * UIProcess/Downloads/DownloadProxyMap.cpp:
+        (WebKit::DownloadProxyMap::invalidate):
+        (WebKit::DownloadProxyMap::processDidClose): Deleted.
+        * UIProcess/Downloads/DownloadProxyMap.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::~NetworkProcessProxy):
+        (WebKit::NetworkProcessProxy::didClose):
+
 2019-04-11  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] REGRESSION(r243860): Many tests failing
index 1a5b1ab..b5607dd 100644 (file)
@@ -110,7 +110,7 @@ void DownloadProxyMap::downloadFinished(DownloadProxy& downloadProxy)
     }
 }
 
-void DownloadProxyMap::processDidClose()
+void DownloadProxyMap::invalidate()
 {
     // Invalidate all outstanding downloads.
     for (const auto& download : m_downloads.values()) {
index 7e30929..be38ccb 100644 (file)
@@ -59,7 +59,7 @@ public:
 
     bool isEmpty() const { return m_downloads.isEmpty(); }
 
-    void processDidClose();
+    void invalidate();
 
     void applicationDidEnterBackground();
     void applicationWillEnterForeground();
index c6b020c..472fdee 100644 (file)
@@ -97,6 +97,9 @@ NetworkProcessProxy::~NetworkProcessProxy()
         proxy->removeNetworkProcess(*this);
 #endif
 
+    if (m_downloadProxyMap)
+        m_downloadProxyMap->invalidate();
+
     for (auto& reply : m_pendingConnectionReplies)
         reply.second({ });
 }
@@ -273,7 +276,7 @@ void NetworkProcessProxy::didClose(IPC::Connection&)
     auto protectedProcessPool = makeRef(m_processPool);
 
     if (m_downloadProxyMap)
-        m_downloadProxyMap->processDidClose();
+        m_downloadProxyMap->invalidate();
 #if ENABLE(LEGACY_CUSTOM_PROTOCOL_MANAGER)
     m_customProtocolManagerProxy.invalidate();
 #endif